【问题标题】:BCrypt comparing two hashes not equalBCrypt比较两个不相等的哈希
【发布时间】:2015-11-13 01:01:49
【问题描述】:

我有这个代码:

u := models.Users{}

u = u.FindByEmail(login.Email)

密码 := []byte(login.Password)

hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) 如果错误!= nil { 恐慌(错误) }

err = bcrypt.CompareHashAndPassword(hashedPassword, []byte(u.Password)) fmt.Println(err)

我最终得到这个错误:crypto/bcrypt: hashedPassword is not the hash of the given password

但是,我之前保存了我的模型,使其具有与“admin”相同的哈希值,但是当我运行我的应用程序时,它告诉我它不相等。

【问题讨论】:

    标签: hash go passwords bcrypt


    【解决方案1】:

    仔细阅读docs

    CompareHashAndPassword 将 bcrypt 散列密码与其可能的明文等效密码进行比较。成功返回 nil,失败返回错误。

    基本上,就是说您应该将存储的哈希值与纯文本密码进行比较。

    你可能想要:

    u := models.Users{}
    
    u = u.FindByEmail(login.Email)
    
    plainPassword := []byte(login.Password)
    // Assumes that u.Password is the actual hash and that you didn't store plain text password.
    err = bcrypt.CompareHashAndPassword([]byte(u.Password), plainPassword)
    
    fmt.Println(err)
    

    【讨论】:

    • 只是补充一点:相同密码的两个“新”bcrypt 哈希值不会相同,因为使用的盐对于该哈希值和参数集是唯一的。使用比较函数会使用相同的盐,参数和常数时间正确比较它。
    • 它似乎不起作用.. 数据库中的当前密码是:$2a$10$A/KM.HIbw3sdH79pML9Sv.MLvkWw3.Xbnxl7Gs 这是“管理员”,但每当我在代码,它总是不同的。会不会是上述情况造成的?
    • 您如何存储用户的密码?您在示例中转换为 []byte,这让我认为是一个字符串。您是否对密码进行了 base64 编码?还是您将二进制文件直接存储在数据库的列/字段中?还是只是你做了 string(bytesFromHash)?
    • 是的,当您生成哈希时,每次都可能不同。您无法对哈希进行 == 比较,这就是存在 CompareHashAndPassword 函数的原因......您遇到了什么错误?
    • 我得到的错误是:crypto/bcrypt: hashedSecret too short to be a bcrypted password。我将密码存储为从函数接收到的密码,逐字记录。
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多