【发布时间】:2021-02-14 11:56:32
【问题描述】:
我加密用户的密码并保存到数据库。然后用户登录,比较散列密码和普通密码,我收到crypto/bcrypt: hashedPassword is not the hash of the given password 错误。怎么了?
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
}
【问题讨论】:
-
能否提供
user.Password的内容示例 -
您是否比较了数据库中的字节以确保它得到正确更新,并且没有以任何方式进行修改?
-
例如,这里是来自 db
$2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e的哈希密码,它是从123456生成的。然后我比较哈希密码和普通密码123456@Danilo @JimB -
Register使用指向User的指针,但是在调用i.DB.Create时,您使用的是指向指针的指针。这是故意的吗? -
请注意阅读本文的每个人。我有一个类似的问题。不要将数据库中的哈希密码与密码的哈希值进行比较。将其与普通密码进行比较。 []byte 和 []byte 的接口让我很困惑。