C# 如何将密码与salt散列密码进行比较

C# 如何将密码与salt散列密码进行比较,c#,asp.net,vb.net,visual-studio-2010,security,C#,Asp.net,Vb.net,Visual Studio 2010,Security,我有一个mysql表用户,有两个字段username varchar()和密码salt哈希md5 28字节/“128位”- 带有文本框1“用户”和文本框2“密码”的asp.net web表单 如何比较客户端在textbox2中输入的密码与用户表中输入的密码相同 验证 这是我的简单身份验证函数,我需要更改代码以将密码与哈希值1进行比较 Public Function Authenticate(ByVal id As String, ByVal pas As String) As Integer

我有一个mysql表用户,有两个字段username varchar()和密码salt哈希md5 28字节/“128位”- 带有文本框1“用户”和文本框2“密码”的asp.net web表单

如何比较客户端在textbox2中输入的密码与用户表中输入的密码相同 验证

这是我的简单身份验证函数,我需要更改代码以将密码与哈希值1进行比较

Public Function Authenticate(ByVal id As String, ByVal pas As String) As Integer

    Dim strConnectionString As String = ("Data Source=localhost;port=3306;Database=transfer;User ID=root;Password=password;Convert Zero Datetime=True")
    Dim instsqlconnection As MySqlConnection = New MySqlConnection(strConnectionString)

    instsqlconnection.Open()

    Dim daAuthors As New MySqlDataAdapter("Select * From login_detail", instsqlconnection)
    dsPubs = New DataSet("Employee")
    daAuthors.Fill(dsPubs, "login")
    instsqlconnection.Close()


    Dim drResult As DataRow() = dsPubs.Tables("login").Select(" login_id = '" + id.ToString() + "'")

    If (drResult.Length > 0) Then
        If drResult(0)("password").ToString().Trim() = pas Then

            Return 1
        Else
            Return 2
        End If

    Else
        Return 0
    End If

End Function

首先,您必须将密码转换为用户输入的
md5
。将密码从
string
转换为
md5 string

您可以简单地调用此查询

Select 1 from login_detail ld where ld.login_id = @yourloginId and ld.Password = @md5Password;

MySQL有一个md5函数。假设盐的字段称为盐,可以执行以下操作:

重要

MD5不是存储密码的安全方法。即使加盐,MD5也是不安全的,可以很快被打破。您应该使用安全算法,如BCrypt、SCrypt或PBKDF2。这些算法非常适合于密码存储,因为它们使用salt并且速度较慢,这使得生成彩虹表更加困难

您可以通过对已有的哈希执行上述算法之一来升级现有方案

BCrypt(MD5(salt+password))当用户登录时,您只需选择密码,然后在表中存储密码版本并将其设置为1

SELECT * FROM login_detail WHERE login_id = @username

hashed = drResult(0)("password")
version = drResult(0)("version")
salt = drResult(0)("salt")

if(version = 1) then
   password = MD5(salt + password)
end if

if(Bcrypt.Verify(password,hashed))
   if(version = 1) then
        Update password = BCrypt(password), version = 2 WHERE login_id = @username
   end if

   return true
End If

return false

当密码第一次添加到数据库时,它是如何被散列的?您需要对输入的密码执行相同的操作才能获得相同的哈希值。前12个十六进制数(24个字符)是salt(随机)后16个十六进制数(32个字符)是salt md5哈希值。谢谢,现在我刚刚理解了开始处理它的逻辑。很好。如果我的答案解决了你的问题,那么你可以接受它作为答案。
SELECT * FROM login_detail WHERE login_id = @username

hashed = drResult(0)("password")
version = drResult(0)("version")
salt = drResult(0)("salt")

if(version = 1) then
   password = MD5(salt + password)
end if

if(Bcrypt.Verify(password,hashed))
   if(version = 1) then
        Update password = BCrypt(password), version = 2 WHERE login_id = @username
   end if

   return true
End If

return false