C# 如何将密码与salt散列密码进行比较
我有一个mysql表用户,有两个字段username varchar()和密码salt哈希md5 28字节/“128位”- 带有文本框1“用户”和文本框2“密码”的asp.net web表单 如何比较客户端在textbox2中输入的密码与用户表中输入的密码相同 验证 这是我的简单身份验证函数,我需要更改代码以将密码与哈希值1进行比较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
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