您好,我在搜索解决方案后需要一些帮助来解决这个问题,但我还没有找到,
我想将 2 个散列密码与相同密码的 bcrypt 进行比较,我该怎么做?
例如:
我有这 2 个哈希密码,它们来自 bcrypt 中的相同密码:
var password = E@Js#07Do=U$
var hash1 = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
var hash2 = $2a$10$mgApOcRIp7RSK3lRIIlQ5e/GjVFbxAFytGAEc0Bo17..r8v2pPR22
// that's not working for me
bcrypt.compare(passwordHash, userPasswordLoginHash, function(err, isMatch) {
if (err) throw err;
if(isMatch){
console.log('correct password!')
}
callback(null, isMatch);
});
我如何比较它们,以确定它们来自相同的密码,通过使用 bcryptjs npm 包?
原文由 hadar 发布,翻译遵循 CC BY-SA 4.0 许可协议
这在设计上是不可能的——作为真正密码散列的核心安全属性。
如果您可以 在不知道原始密码的情况下 比较两个密码的哈希值,那么如果攻击者破解了系统上的一个密码,他们将 立即 知道 所有 使用该密码的用户的密码,而无需任何额外的工作。为什么这是一件坏事应该立即显而易见。
例如,如果密码是使用不适合密码存储的散列(例如 MD5)存储的,那么如果 50 个用户的密码为“password”,那么他们所有的散列密码都将具有相同的 MD5 散列(“5f4dcc3b5aa765d61d8327deb882cf99”),破解其中一个会泄露 _每个用户的密码_。
你不能用像 bcrypt 这样的现代密码哈希来做到这一点。 “比较”两个现代密码哈希值的唯一方法是 _提前知道明文_,然后在每个哈希值中应用使用盐的算法。即使两个用户拥有相同的密码,攻击者也必须执行相同的昂贵计算才能独立破解每个用户,因为独特的盐使每个散列都是独一无二的。
更一般地说——这听起来有点大胆——但任何系统或管理员 都 没有合法的用例来比较两个 不同 用户的密码。用户密码一旦存储,就应该是 100% 独立的,并且对系统 100% 不透明。如果系统或业务案例需要这种比较,则应重新设计以消除该需求。