crypto/bcrypt:hashedPassword不是给定密码的哈希
我加密用户的密码并保存到数据库。然后对于用户登录,比较哈希密码和普通密码,我得到的是crypto/bcrypt:hashedPassword不是给定密码的哈希,hash,go,bcrypt,Hash,Go,Bcrypt,我加密用户的密码并保存到数据库。然后对于用户登录,比较哈希密码和普通密码,我得到的是crypto/bcrypt:hashedPassword不是给定密码的哈希值错误。怎么了 func encryptPassword(password string) (string, error) { bytePass := []byte(password) hashedPassword, err := bcrypt.GenerateFromPassword(bytePass, bcrypt.De
crypto/bcrypt:hashedPassword不是给定密码的哈希值
错误。怎么了
func encryptPassword(password string) (string, error) {
bytePass := []byte(password)
hashedPassword, err := bcrypt.GenerateFromPassword(bytePass, bcrypt.DefaultCost)
if err != nil {
log.Printf("ERROR:EncryptPassword: %s", err.Error())
}
return string(hashedPassword), err
}
func (i *Impl) Register(user User) bool {
hashedPass, err := encryptPassword(user.Password)
if err != nil {
return false
}
user.Password = hashedPass
if err := i.DB.Create(&user).Error; err != nil {
log.Printf("ERROR:Register: %s", err.Error())
return false
}
return true
}
func (i *Impl) Login(email string, password string) (User, error) {
var user User
i.DB.Where("email = ?", email).First(&user)
err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
if err != nil {
log.Printf("ERROR:Login: %s", err.Error())
return User{}, err
}
return user, err
}
我无法分辨哪个是哪个,但在比较函数中,请确保变量位于正确的位置
bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
Must be the already hashed PW ^ ^ Plain Text Password to compare
还要确保你确实得到了一些东西,你可能会得到一个空密码,但没有意识到它,因为散列看起来仍然是满的。我打赌是
用户。在你将密码传递给encryptPassword
之前,你的注册表中的密码
是空的,从而导致像你提供的那样对空密码进行散列($2a$10$rqhjthsxmbtx/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e
).我的错误是,它比较了两个bcrypt hashedpassword,而不是一个hashedpassword和您的未加密密码转换成二进制-希望这对其他人有所帮助!您能提供一个用户内容的示例吗。password
您是否比较了数据库中的字节以确保它得到正确更新y、 没有任何修改吗?例如,这里是db2a$10$RQHJthsXMBTX/5ZJG1MFUYYBUDW1PLBFWQRN0UCHWES38C/0m3e的散列密码,这是从123456
生成的。然后我比较散列密码和普通密码,它是123456
@Danilo@JimBRegister
获取指向用户的指针,howev呃,当调用i.DB.Create
时,您使用的是指向指针的指针。这是故意的吗?请注意阅读本文的每个人。我遇到了类似的问题。不要将DB中的哈希密码与密码的哈希进行比较。将其与普通密码进行比较。[]字节和[]字节的接口字节让我困惑。user.Password
来自db,所以它已经是散列密码。@Melihmuck你确定它是正确的吗?你是否尝试在散列之前记录值?是的,你可以用fmt.Println(bcrypt.CompareHashAndPassword([]字节)轻松验证这一点(“$2a$10$rqhjthsxmbtx/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e”),[]字节{}”)
只打印nil
。您应该在加密密码中添加一个检查,以确保不会发生这种情况。