您好,我在搜索解决方案后需要一些帮助来解决这个问题,但我还没有找到,

我想将 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 包来比较它们,以确定它们来自相同的密码?

最佳答案

这在设计上是不可能的 - 作为真正密码散列的核心安全属性。

如果您可以在不知道原始密码的情况下比较两个密码哈希,那么如果攻击者破解了系统上的一个密码,他们将立即知道所有使用该密码的用户的密码,而无需任何额外工作。为什么这会是一件坏事,这应该是显而易见的。

例如,如果使用不适合密码存储的哈希值(例如MD5)存储密码,则如果50个用户的密码为“password”,则其所有哈希密码都将具有相同的MD5哈希值(“5f4dcc3b5aa765d61d8327deb882cf99”),破解其中一个会泄露每个用户的密码。

你不能用像 bcrypt 这样的现代密码哈希来做到这一点。 “比较”两个现代密码哈希的唯一方法是提前知道明文,然后在每个哈希中使用盐来应用算法。即使两个用户拥有相同的密码,攻击者也必须执行相同的昂贵计算来独立破解每个用户,因为唯一的盐使每个散列都是唯一的。

更一般地说——这听起来可能有点大胆——但是任何系统或管理员都没有合法的用例来比较两个用户的密码。用户密码在存储后应 100% 独立,对系统 100% 不透明。如果系统或业务案例需要这种比较,则应重新设计以消除该要求。

10-07 19:09
查看更多