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

3
我正在使用Go中的Bcrypt来对用户提供的密码进行哈希和比较。问题是在登录时,当我使用CompareHashAndPassword比较密码时,它从未匹配,因此始终显示密码不正确。基于哈希的概念,应该使用相同的输入每次都能得到相同的输出,但这不是我的情况。
**我的哈希代码(在注册中)**
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 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 69 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
然后,在登录中比较密码:
err := bcrypt.CompareHashAndPassword(user.Password, []byte(p))

user.Password 是一个 []byte 类型的值,该值从数据库中获取。

谢谢。 p 是用户在表单中输入的密码。

1个回答

10

Bcrypt生成一个随机的盐(作为结果哈希的一部分)。因此,目的是每次都不同。

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

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

警告:您选择的成本4非常低。考虑选择像10或更高的值。


是的,我已经这样做了,问题是我正在调试为什么CompareHashAndPassword总是给我错误。在第一个参数中,我发送了声明的哈希密码(a []byte),第二个参数也是用户发送的密码作为字节。 - Sredny M Casanova
@SrednyMCasanova 它完全正常工作,那么 https://pastebin.com/9rAyRtXU 你的问题在其他地方。 - zerkms
谢谢,也许与数据库有关。非常感谢! - Sredny M Casanova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接