【问题标题】:crypto/bcrypt: hashedPassword is not the hash of the given passwordcrypto/bcrypt: hashedPassword 不是给定密码的哈希值
【发布时间】: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 的接口让我很困惑。

标签: hash go bcrypt


【解决方案1】:

我敢打赌,在您将 Register 函数传递给 encryptPassword 之前,user.Password 在您的函数中是空的,因此会导致像您提供的那样 ($2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e) 那样对空密码进行哈希处理。

【讨论】:

  • 是的,您可以使用fmt.Println(bcrypt.CompareHashAndPassword([]byte("$2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e"), []byte{})) 轻松验证这一点,它只打印nil。您应该向encryptPassword 添加检查以确保不会发生这种情况。
【解决方案2】:

我不知道哪个是哪个,但在您的比较函数中,请确保您将变量放在正确的位置。

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

还要确保您实际上得到了一些要散列的东西,您可能会得到一个空白密码但没有意识到它,因为散列看起来仍然是满的。

【讨论】:

  • user.Password来自db,所以已经是hash密码了。
  • @MelihMucuk 你确定这是在抨击正确的事情吗?您是否尝试在散列之前记录该值是什么?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2017-09-17
    • 2017-12-13
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多