nodejs - 如何比较 bcrypt 的两个哈希密码

新手上路,请多包涵

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

我想将 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 许可协议

阅读 1k
2 个回答

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

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

例如,如果密码是使用不适合密码存储的散列(例如 MD5)存储的,那么如果 50 个用户的密码为“password”,那么他们所有的散列密码都将具有相同的 MD5 散列(“5f4dcc3b5aa765d61d8327deb882cf99”),破解其中一个会泄露 _每个用户的密码_。

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

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

原文由 Royce Williams 发布,翻译遵循 CC BY-SA 4.0 许可协议

“使用 bcrypt lib,您可以将纯文本密码与使用相同 lib 的散列密码进行比较。”

问题在于微服务架构,这是非常不安全的。如果我有一个前端将未经哈希处理的密码传递给后端,未经哈希处理的密码将在与系统后端数据库中的哈希值进行比较之前被记录(可能在多个地方)。

原文由 TLL 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题