我正在尝试开发用户登录系统,以便测试golang的bcrypt功能。但是我遇到了一些有趣的情况。
我的bcrypt学习材料是从中获得的,代码运行良好 https://medium.com/@jcox250/password-hash-salt-using-golang-b041dc94cb72
但是当我编写自己的代码时,它在比较中一直失败。
package main
import (
"log"
"golang.org/x/crypto/bcrypt"
)
func main() {
hash1, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.MinCost)
hash2, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.MinCost)
err := bcrypt.CompareHashAndPassword(hash1, hash2)
if err != nil {
log.Println(err)
} else {
log.Println("success")
}
}
由于用于哈希处理的字符串是相同的“ 123456”,因此我的代码输出应为success
,但结果为crypto/bcrypt: hashedPassword is not the hash of the given password
。
有人可以解释一下并指导我吗?
答案 0 :(得分:2)
您正在使用的功能的文档说,它将散列与明文密码进行比较-而不是将散列与散列进行比较:
CompareHashAndPassword将bcrypt哈希密码与其可能的等效纯文本进行比较。如果成功,则返回nil;如果失败,则返回错误。
如果要打印或比较每个生成的哈希,它们都不完全匹配(这很重要)。但是您应该能够使用CompareHashAndPassword
函数来检查是否使用了密码来生成给定的哈希值。
尝试一下:
err := bcrypt.CompareHashAndPassword(hash1, []byte("123456"))
if err != nil {
log.Println(err)
} else {
log.Println("success")
}