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

时间:2019-04-22 22:12:59

标签: javascript node.js hash passwords bcrypt

您好,我在搜索解决方案后仍未找到所需的帮助,

我想比较2个哈希密码和相同密码的bcrypt, 我该怎么做?

例如:

我有这两个哈希密码,它们来自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软件包来比较它们,以确定它们是否来自同一密码?

3 个答案:

答案 0 :(得分:3)

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

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

例如,如果使用不适合密码存储的哈希值(例如MD5)存储密码,则所有密码都将具有相同的MD5哈希,并且破解其中的所有密码即可。

您不能使用bcrypt之类的现代密码哈希来做到这一点。 “比较”两个现代密码哈希的唯一方法是事先了解明文,然后在每个哈希中使用盐值应用该算法。即使两个用户使用相同的密码,攻击者也必须执行相同的昂贵计算才能独立破解每个用户。

通常来说-这听起来可能有点大胆-但是对于任何系统或管理员来说,永远比较两个用户的密码都没有合法的用例。用户密码一旦存储,就应该100%独立,并且对系统而言100%不透明。如果系统或业务案例需要进行这种比较,则应重新设计以消除该要求。

答案 1 :(得分:0)

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

说您对密码进行了哈希处理

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 = $2a$10$fKAyjaG0pCkisZfRpKsBxursD6QigXQpm1TaPBDZ4KhIZRguYPKHe
});

您进行比较:

// db query, get hashed password, found hash
// hash = $2a$10$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
});

答案 2 :(得分:0)

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

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