如何将密码与盐渍哈希密码进行比较

时间:2014-12-31 09:52:54

标签: c# asp.net vb.net visual-studio-2010 security

我有一个mysql表用户,有两个字段用户名varchar()和密码salted hashed md5 28 bytes /“128 bites” - asp.net web表单,带文本框1“user”w textbox2“password”

如何比较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

2 个答案:

答案 0 :(得分:1)

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

您可以简单地调用此查询

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

答案 1 :(得分:1)

MySQL具有md5功能。您可以执行以下操作,假设salt的字段称为 salt

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

重要

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

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

BCrypt(MD5(盐+密码))当用户登录时只需选择密码,然后在表中存储密码版本并将其设置为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