在 ASP.NET 中散列密码并在 SQL 过程中解析它

Hashing Password in ASP.NET and Resolving it In SQL Procedure

我正在使用 SQL 服务器存储过程开发 ASP.NET 应用程序。我需要散列我的登录密码并在我的 sp_LoginCheck 存储过程中解析它。

有什么建议吗?

我已经在数据库中插入了数据。

例如:

UserName/Password

ABC/123456

DEF/987654

我想加密或哈希任何密码,然后在存储过程中解密它并查询 table 以便我可以获得数据。

一个非常简单的方法是使用 MD5 哈希。

public class MD5
{
    public static string Hash(string message)
    {
        // step 1, calculate MD5 hash from input
        System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(message);
        byte[] hash = md5.ComputeHash(inputBytes);

        // step 2, convert byte array to hex string
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString().ToUpper();
    }
}

然后在你的申请中

你说

var password = MD5.hash(passwordField);

并将其存储在数据库中。

验证密码时,您只需说

db.Account.Where(w => w.email == emailField && w.password == MD5.hash(passwordField)

查看您是否有匹配的记录。

正如@zulq 所说,有更好的系统,有些东西有盐等,但是对于您要求的基本密码散列,这将起作用。

但是,如果您希望在存储过程中执行所有这些操作。您可以在 SQL

中使用以下 HASHBYTES 函数
HASHBYTES('md5', 'your password')

调用存储过程时同样如此,您将其散列并存储的纯文本密码传递给它

验证时,您向存储过程传递它验证的用户名/密码和 returns true 或 false 或一行。

我认为你需要更具体地说明你到底想要什么。但是下面有一个完整的答案。存储过程:

USE [YourDB]
GO
CREATE PROCEDURE [dbo].[sp_LoginCheck] @UserID varchar(25), @password varchar(25)
AS
SELECT username, user_password FROM UserPassword 
WHERE username = @UserID and user_password=@password
GO

VB代码:

  Public Function validateUser(username As String, password As String) as Boolean
       Using sqlCon = new SqlConnection(yourConStr)
          Dim cmd = new SqlCommand("sp_LoginCheck",sqlCon)
          cmd.CommandType = CommandType.StoredProcedure
          cmd.Parameters.AddWithValue("@UserID",username)
          cmd.Parameters.AddWithValue("@password",GetMd5Hash(password))
          sqlCon.Open()
          Dim dr As SqlDataReader = cmd.ExecuteReader()
          If dr.Read() Then
           Return True
          Else
           Return False
       End Using
   End Function

请注意,您应该将代码附在 try catch 中并进行密码哈希处理。您应该存储散列密码,并在将散列密码与数据库进行比较时进行比较。散列参考其他答案。

为方便起见,直接来自 MSDN 并稍作修改:

Shared Function GetMd5Hash(ByVal input As String) As String 
    Dim md5Hash As MD5 = MD5.Create()        
    Dim data As Byte() = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input))            
    Dim sBuilder As New StringBuilder()
    Dim i As Integer 
    For i = 0 To data.Length - 1
        sBuilder.Append(data(i).ToString("x2"))
    Next i    
    Return sBuilder.ToString()    
End Function