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

nodejs - how to compare two hashes password of bcrypt

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

我想将 2 个散列密码与相同密码的 bcrypt 进行比较, 我该怎么做?

例如:

我有这 2 个散列密码来自 bcrypt 中的相同密码:

var password = E@Js#07Do=U$
var hash1 = a$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
var hash2 = a$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 hash('5f4dcc3b5aa765d61d8327deb882cf99'),破解其中一个会泄露每个用户的密码.

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

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

使用 bcrypt 库,您可以将纯文本密码与使用相同库进行哈希处理的密码进行比较。

假设你散列了一个密码

const myPlaintextPassword = 'E@Js#07Do=U$'
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
  // Store hash in your password DB.
  // example output, taking your hash
  // hash = a$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
});

你比较像:

// db query, get hashed password, found hash
// hash = a$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
// User input again:
const myPlaintextPassword = 'E@Js#07Do=U$'
bcrypt.compare(myPlaintextPassword, hash, function(err, res) {
  // res is true as the original password is the same
  // res == true
});

"With bcrypt lib you compare plain text password to the one hashed using the same lib."

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

为了更加安全,您可以在 front-end 中加密密码并在 back-end

中解密和比较