首页 > 解决方案 > Bcrypt 没有一致地比较 Node.js 中的密码

问题描述

我现在正在使用 bcrypt 在两个不同的程序中比较相同的 plainTextPassword 和 hash,一个告诉我密码匹配,另一个说它们不匹配。

在问题文件中:

passport.use(new LocalStrategy(function(username,plainTextPassword,done) {
  process.nextTick(() => {
    db.query('SELECT * FROM users WHERE username = ?',[username],(err,rows) => {
      if (err) return done(err);
      if (!rows[0]) return done(null,false);

      let hash = rows[0].password;
      let user = rows[0];
      bcrypt.compare(plainTextPassword, hash, (err, res) => {
        console.log(plainTextPassword);      // test
        console.log(hash);                   // $2b$10$EefqCwYTMHDDtIGH.SIHIu.BPCOiT7Bp4Zzej5iUoxlKtMZ67oHtC
        console.log(res);                    // false
        if (!res) return done(null,false);
        return done(null,rows[0]);
      });
    });
  });
}));

我正在复制plainTextPassword 和哈希的记录值并将它们粘贴到此代码中:

const bcrypt = require('bcrypt');
const saltRounds = 10;
bcrypt.compare('test', '$2b$10$EefqCwYTMHDDtIGH.SIHIu.BPCOiT7Bp4Zzej5iUoxlKtMZ67oHtC', (err,same) => {
  console.log(same);    // true
}

这是返回真,而不是像console.log(res)第一个代码块返回的假。第一个代码块可以很好地检查大多数密码,但这个似乎不同。没有特殊字符,plainTextPassword 为“test”,哈希存储在 mysql 数据库中的 VARCHAR(150) 中。

标签: javascriptnode.jsbcrypt

解决方案


请参阅 []( https://en.wikipedia.org/wiki/Bcrypt:“成本参数将密钥扩展迭代计数指定为 2 的幂,这是 crypt 算法的输入”

$10$ 指定成本参数为 10,表示 2^10 个密钥扩展轮次。

当然代码行:const saltRounds = 10;没有使用,去掉死代码。


推荐阅读