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