【问题标题】:BCrypt: How to determine whether two hashes refer to the same passwordBCrypt:如何确定两个哈希是否引用相同的密码
【发布时间】:2014-11-17 14:58:24
【问题描述】:

如果每次运行生成的哈希值不同,我想知道 BCrypt 如何推断输入密码的正确性?

例子:

给定密码:“password123”

可以说,我对给定的密码进行了 10 次哈希运算并收到:

$2a$10$Uw0LDj343yp1tIpouRwHGeWflT3.QjDp9DeJ2XiwTIHf1T.pjEy0i
$2a$10$uYWUCEnh4gn00w57VSrYjej.UvhzBL8Wf2doTAGSGfhUMtuGr5bha
$2a$10$cJi3XOkRxxicDjEBibNhNOg5MGM.G/.p70KE75.44ayPQo8kCDxUu
$2a$10$qLcN2obMThH544U967JM5OS0vtcfP.Iq1.f0mZdvWfyeIoWHyr422
$2a$10$5/JssXqJyGHeMQlB4pr7zebTRFSt/2iwYJHF5f7.jdlTxbH4c9Sjq
$2a$10$La1UQKu306aNWkhhfhC5XeX7mfcnfbSchBIpLG6O57gur/U/n/fua
$2a$10$xTzEGVfc1D1UHFeMO95ktOJGFT79ybKUKN.z.MidMjP1XfAeElNEi
$2a$10$i9Y.1Ix6PL1bDwoTYtC49.Y0LKpar/S5qC1SkzFB4vnafikOhHSga
$2a$10$FJNTj5xeVbIcMaf9EhodHu9jJLrJL53QHQK9OuemwMh3WuTfxXEqu
$2a$10$OXMToK5CXeNtRHC3w7eqe.Mr7p4fJanbE28E2Y3MHh6f6cq1chyE6

如果我们假设我将第一个哈希存储在我的数据库中,并且用户在几个小时后尝试使用正确的密码登录。用户尝试登录时生成的哈希与我存储在数据库中的哈希完全不同。

BCrypt如何判断这两个哈希值是否指向同一个密码?

【问题讨论】:

    标签: hash bcrypt blowfish


    【解决方案1】:

    您示例中的哈希值包含进行验证所需的所有信息:

    $2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |  |  |                     |
     |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |  |  |
     |  |  salt = nOUIs5kJ7naTuTFkBy1veu
     |  |
     |  cost-factor = 10 = 2^10 iterations
     |
     hash-algorithm = 2y = BCrypt
    

    如您所见,此字符串包含算法、成本因子和盐。使用这些参数,您可以从登录密码计算出可比较的哈希值。在PHP中你可以使用函数password_verify()来验证密码,它会自动提取成本因子和盐。

    // Check if the hash of the entered login password, matches the stored hash.
    // The salt and the cost factor will be extracted from $existingHashFromDb.
    $isPasswordCorrect = password_verify($password, $existingHashFromDb);
    

    【讨论】:

    • 非常感谢!我知道它有效,但我想知道如何。 BCrypt 从哪里得到信息,两个完全不同的哈希值指的是同一个密码。据我所知,BCrypt 是一种哈希算法,因此它不再允许对输出数据进行推断。 BCrypt 如何匹配哈希值?
    • 现在我明白了为什么会这样:盐会影响生成的哈希值。在“解码”时,BCrypt 可以检查两个哈希是否匹配,因为通过明文密码(来自 POST 请求)、算法、成本因子和盐的信息,可以确定两个哈希是否引用相同的密码。感谢您的帮助!
    • @Tunguska - 确切地说,无论何时计算具有相同参数的哈希值,都会得到相同的哈希值。
    猜你喜欢
    • 2019-09-12
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多