Golang 有人可以解释为什么哈希比较失败

Golang Can someone explain why the compare of hash is fail

我正在尝试开发一个用户登录系统,为此我正在测试golang的bcrypt功能。但是我遇到了一些有趣的情况。

我的bcrypt学习material就是来自于此,代码运行良好 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.

谁能解释一下并指导我。

您正在使用的函数的文档说它将哈希与明文密码进行比较 - 而不是哈希与哈希:

CompareHashAndPassword compares a bcrypt hashed password with its possible plaintext equivalent. Returns nil on success, or an error on failure.

如果您要打印或比较每个生成的哈希值,它们也不会完全匹配(这就是重点)。但是您应该能够使用 CompareHashAndPassword 函数来检查密码是否用于生成给定的哈希值。

试试这个:

err := bcrypt.CompareHashAndPassword(hash1, []byte("123456"))
if err != nil {
    log.Println(err)
} else {
    log.Println("success")
}