密码散列 - 比较2个字符串

时间:2017-03-15 12:23:17

标签: vb.net salt password-encryption string-hashing

我刚刚在函数中添加了哈希和salt密码,这些密码存储在Access数据库“Memo”字段中。

散列/腌制工作正常,但我在互联网上找不到任何告诉我如何解密它们的内容。

我确实看到某个地方说你不能,但是必须从数据库中获取密码,然后对输入的密码进行哈希(对于登录屏幕)并比较2个字符串。我试过这个,但是2个字符串是不同的,所以我无法登录。

创建哈希/盐的算法是

jQuery('.f-checkbox label').on('click', function(e){
  if (jQuery(this).sibling('input').prop('checked')) {
    jQuery(this).parent('.f-checkbox').addClass('active');
  } else {
    jQuery(this).parent('.f-checkbox').removeClass('active');
  }
  console.log('Test');
})

然后,登录时,我正在尝试以下

Public Shared Function createRandomSalt() As String

    Dim mix As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!£$%^&*()-_=+{}][@'~#:;?/>.<,\|"
    Dim salt As String = ""

    Dim rnd As New Random

    Dim sb As New StringBuilder

    For i As Integer = 1 To 50
        Dim x As Integer = rnd.Next(0, mix.Length - 1)
        salt &= (mix.Substring(x, 1))
    Next

    Return salt

End Function

Public Shared Function Hash512(ByVal password As String, ByVal salt As String)

    Dim convertedToBytes As Byte() = Encoding.UTF8.GetBytes(password & salt)
    Dim hashType As HashAlgorithm = New SHA512Managed()
    Dim hashBytes As Byte() = hashType.ComputeHash(convertedToBytes)
    Dim hashedResult As String = Convert.ToBase64String(hashBytes)

    Return hashedResult

End Function

我做错了吗?如何将输入的密码与数据库中的加密密码进行比较?

1 个答案:

答案 0 :(得分:4)

问题是您在对输入的密码进行散列时使用随机盐。由于这与您在将哈希值存储到数据库时使用的随机盐不同,因此会得到不同的哈希值。

您必须执行以下操作:

  1. 在将密码存储到数据库之前创建一个随机盐,用它散列密码并将盐与密码一起存储在数据库中
  2. 当用户输入密码时,从数据库中检索该用户的盐,使用它来散列输入的密码并将结果与​​数据库中的散列进行比较。
  3. 哦,你似乎永远不会使用用户输入的密码。在您的代码中,您将数据库中的哈希值检索到password,将哈希值再次哈希到checkpassword并进行比较。当然你必须哈希输入的密码。