Go &引用;crypto/bcrypt:hashedPassword不是给定密码的哈希值;尝试比较登录密码时

Go &引用;crypto/bcrypt:hashedPassword不是给定密码的哈希值;尝试比较登录密码时,go,Go,我正在尝试在我的Go应用程序中编写一个登录函数。 我有一个register函数,它使用bcrypt散列密码,以便将其存储在数据库中 用户已成功注册,我在数据库中拥有哈希密码。 在尝试登录时,我尝试将数据库中的哈希密码与请求中获得的纯文本密码进行比较。 但是,我总是会遇到以下错误: crypto/bcrypt: hashedPassword is not the hash of the given password 我检查了数据库中的哈希密码和请求中的纯文本密码。 使用 fetchedPassw

我正在尝试在我的Go应用程序中编写一个登录函数。 我有一个register函数,它使用
bcrypt
散列密码,以便将其存储在数据库中

用户已成功注册,我在数据库中拥有哈希密码。 在尝试登录时,我尝试将数据库中的哈希密码与请求中获得的纯文本密码进行比较。 但是,我总是会遇到以下错误:

crypto/bcrypt: hashedPassword is not the hash of the given password
我检查了数据库中的哈希密码和请求中的纯文本密码。 使用

fetchedPassword
是来自数据库的哈希密码,
password
是我从请求中获得的密码。 我总是得到同样的结果。我看到一篇关于这一点的帖子,它是4年前创建的,但没有答案

哈希密码生成:

func hashPassword(password string) ([]byte, error) {
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        return nil, err
    }

    return hashedPassword, nil
}
正在从数据库中检索密码:

type info struct {
    fetchedEmail    string
    fetchedPassword string
}

var userInfo info

row := db.QueryRow("SELECT email, password FROM users where email=$1", email)
err := row.Scan(&userInfo.fetchedEmail, &userInfo.fetchedPassword)
fmt.Println(userInfo.fetchedPassword)

if err != nil {
    return "", err
}

err = bcrypt.CompareHashAndPassword([]byte(userInfo.fetchedPassword), []byte(password))
if err != nil {
    return "", err
}

为了在数据库中设置密码,我只需使用hashedPassword,并使用SQL
INSERT
命令将其与有关用户的其余信息一起插入。

为哈希密码返回一个
字符串,而不是一个字节


func HashPassword(password string) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
    return string(bytes), err
}

func CheckPassword(password, hash string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
    return err == nil
}

请显示生成哈希、存储和检索哈希的代码。@Marc我添加了请求信息。快速浏览一眼,没有任何错误。我建议您编写一些单元测试来练习生成/存储/检索/比较。它仍然可以是存储密码的方式(DB模式和类型)或读取密码的方式(http post或其他)。您可以发布这些测试的详细信息,但您仍然应该编写这些测试。@Marc谢谢,我最终会编写测试,但我需要先了解它为什么不能正常工作。如果我不得不猜测,我会说用户输入密码(在注册期间)没有被准确捕获。我会在清除日志中对密码进行预哈希,以绝对验证所保存的密码是否是您期望的密码(哈希后无法判断)。这不是一个答案,只是一个建议(没有帮助)。这应该是对这个问题的评论。这仍然不是一个答案,而是一个尝试的建议。使用返回的字节片并没有什么错,正如OP所说,使用字符串并不能解决任何问题。@Marc我不能在这个问题中添加注释,因为我是新的贡献者,所以我会在答案上发布!!发布一个非答案是没有帮助的。继续贡献,直到你达到50%的声誉,你将能够发表评论。请在你的答案中添加一些解释,以便其他人可以从中学习

func HashPassword(password string) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
    return string(bytes), err
}

func CheckPassword(password, hash string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
    return err == nil
}