如何将密码与加盐散列密码进行比较

本文关键字:密码 比较 | 更新日期: 2023-09-27 18:35:56

我有一个 MySQL 表用户,有两个字段用户名 varchar() 和密码加盐哈希 MD5 28 字节/"128 咬" -asp.net 具有文本框 1"用户"和文本框 2"密码"的 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

如何将密码与加盐散列密码进行比较

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

select 1 from login_detail where login_id = @yourloginId and Password = MD5(salt + @password);

重要

MD5 不是存储密码的安全方法。 即使腌制,MD5也是不安全的,可以很快被打破。 您应该使用安全算法,例如BCrypt,SCrypt或PBKDF2。 这些算法是密码存储的理想选择,因为它们使用盐并且速度很慢,使彩虹表生成更加困难。

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

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

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

您可以简单地调用此查询

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