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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs - 如何比较bcrypt的两个哈希密码相关的知识,希望对你有一定的参考价值。

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

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

例如:

我在bcrypt中有来自相同密码的这2个哈希密码:

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)存储密码,那么所有密码将具有相同的MD5哈希值,并且破解一个密码将全部破解。

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

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

另一答案

使用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
});

以上是关于nodejs - 如何比较bcrypt的两个哈希密码的主要内容,如果未能解决你的问题,请参考以下文章

如何将密码文本与 bcrypt 哈希值进行比较?

bcrypt 哈希究竟如何防止彩虹表查找?

bcrypt-nodejs 比较方法每次都返回 false

bcrypt 与 nodejs 比较

Nodejs bcrypt比较无法正常工作

使用 bcrypt 散列密码迁移系统