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

时间:2019-05-02 11:14:35

标签: go bcrypt

我正在尝试开发用户登录系统,以便测试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

有人可以解释一下并指导我吗?

1 个答案:

答案 0 :(得分:2)

您正在使用的功能的文档说,它将散列与明文密码进行比较-而不是将散列与散列进行比较:

  

CompareHashAndPassword将bcrypt哈希密码与其可能的等效纯文本进行比较。如果成功,则返回nil;如果失败,则返回错误。

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

尝试一下:

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