Hash BCrypt:如何确定两个哈希是否引用相同的密码
如果每次运行生成的哈希值不同,我想知道BCrypt如何推断输入密码的正确性 例如: 给定密码:“password123” 比方说,我将给定密码哈希10次,然后收到:Hash BCrypt:如何确定两个哈希是否引用相同的密码,hash,bcrypt,blowfish,Hash,Bcrypt,Blowfish,如果每次运行生成的哈希值不同,我想知道BCrypt如何推断输入密码的正确性 例如: 给定密码:“password123” 比方说,我将给定密码哈希10次,然后收到: $2a$10$Uw0LDj343yp1tIpouRwHGeWflT3.QjDp9DeJ2XiwTIHf1T.pjEy0i $2a$10$uYWUCEnh4gn00w57VSrYjej.UvhzBL8Wf2doTAGSGfhUMtuGr5bha $2a$10$cJi3XOkRxxicDjEBibNhNOg5MGM.G/.p70KE75
$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如何确定这两个哈希是否引用同一密码?示例中的哈希值包含进行验证所需的所有信息:
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt
如您所见,此字符串包含算法、成本因素和salt。使用这些参数,您可以根据登录密码计算可比较的哈希值。在PHP中,您可以使用该函数验证密码,它将自动提取成本因素和salt
// 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);
谢谢!我知道这是可行的,但我想知道怎么做。从where have BCrypt信息中,两个完全不同的散列引用相同的密码。据我所知,BCrypt是一种哈希算法,因此它不允许对输出数据进行更多的推断。BCrypt如何匹配散列?现在我明白了为什么这样做:salt会影响生成的散列值。在“解码”时,BCrypt可以检查两个哈希是否匹配,因为根据普通密码(来自POST请求)、算法、成本因素和salt的信息,可以确定两个哈希是否引用相同的密码。谢谢你的帮助@通古斯卡-确切地说,无论何时使用相同的参数计算哈希,都会得到相同的哈希值。