crypto / bcrypt:hashedPassword不是给定密码的哈希值

时间:2016-02-22 14:32:04

标签: hash go bcrypt

我加密用户的密码并保存到db。然后到用户登录,比较哈希密码和普通密码,我收到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
}

3 个答案:

答案 0 :(得分:4)

我敢打赌,Register功能中encryptPassword为空,然后再将其传递给$2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e,从而导致空密码(例如您提供的密码)的哈希值 Float("10.6") --> 10.6 Float("+10.6") --> 10.6 Float("-10.6") --> -10.6 Float("Garbage") --> nil )。

答案 1 :(得分:2)

我无法分辨哪个是哪个,但在比较函数中,确保您将变量放在正确的位置。

bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
           Must be the already hashed PW ^              ^ Plain Text Password to compare

另外,请确保您实际上正在使用哈希值,但是您可能会收到一个空白密码,但却没有意识到这一点,因为哈希值看起来仍然很满。

答案 2 :(得分:1)

我的错误是认为它比较了两个 bcrypt hashedpasswords,而不是 hashedpassword 和转换为二进制的未加密密码——希望对那里的人有所帮助!