Bcrypt为相同的密码生成不同的哈希值

时间:2017-06-13 23:37:42

标签: go hash bcrypt

我在Go中使用Bcrypt哈希并比较用户提供的密码。事情是在登录中,当我使用 CompareHashAndPassword 比较密码时,它从不匹配,所以总是说密码不正确。基于 hash 的概念,假设使用相同的输入,我们将随时拥有相同的输出,这不是我的情况。

**我的代码哈希(在注册中)**

bs, err := bcrypt.GenerateFromPassword([]byte(Password), bcrypt.MinCost)

我做了什么

  • 发送密码:12345
  • 当我打印 bs 时,我得到:

    尝试1: [36 50 97 36 48 52 36 49 104 78 117 77 56 73 113 99 114 78 99 111 100 57 57 120 101 69 117 118 117 103 87 108 68 76 88 70 119 110 65 116 68 108 118 57 68 86 81 88 77 50 71 78 101 81 104 65 54 67 107 121]

    尝试2: [36 50 97 36 48 52 36 47 50 84 70 73 120 56 70 67 116 69 101 48 113 86 89 103 89 119 71 97 46 120 77 116 83 86 57 56 112 122 66 103 46 106 74 104 10 8 82 113 117 85 110 51 103 115 107 109 102 109 49 115 113]

    尝试3: [36 50 97 36 48 52 36 51 103 97 117 103 49 74 110 113 85 101 113 54 121 69 108 109 72 76 108 72 46 85 121 65 87 122 103 119 88 71 82 114 56 105 65 6 9 49 113 73 112 52 48 85 69 85 47 118 56 56 47 48 67]

如果我错了,请纠正我,但在所有尝试中,结果应该不一样?

然后,我将这些值保存在数据库中,这些是每次尝试的值:

  1. $ 2A $ 04 $ 1hNuM8IqcrNcod99xeEuvugWlDLXFwnAtDlv9DVQXM2GNeQhA6Cky
  2. $ 2A $ 04 $ / 2TFIx8FCtEe0qVYgYwGa.xMtSV98pzBg.jJhlRquUn3gskmfm1sq
  3. $ 2A $ 04 $ 3gaug1JnqUeq6yElmHLlH.UyAWzgwXGRr8iAE1qIp40UEU / V88 / 0C
  4. 然后,在登录名中比较密码:

    err := bcrypt.CompareHashAndPassword(user.Password, []byte(p))
    

    user.Password 是一个[]字节,此值是从数据库中剔除的

    谢谢 p 是用户在表单中发送的密码

1 个答案:

答案 0 :(得分:9)

Bcrypt生成一个随机盐(包含在生成的哈希中)。所以每次都有目的不同。

您需要使用bcrypt.CompareHashAndPassword来比较散列密码和明文密码。

bcrypt.CompareHashAndPassword的第一个参数是哈希密码,第二个是明文密码。 所以你以错误的顺序传递了它们。

警告:您选择的费用4非常低。考虑选择10或更高的内容。