Bcrypt不能一致地比较Node.js中的密码

时间:2018-05-21 19:40:47

标签: javascript node.js bcrypt

我现在使用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和hash的记录值并将它们粘贴到此代码中:

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

并返回true,而不是像第一个代码块返回的console.log(res)那样返回false。第一个代码块已经检查了大多数密码,但这一个似乎有所不同。没有特殊字符,plainTextPassword是' test'并且哈希存储在mysql数据库中的VARCHAR(150)中。

1 个答案:

答案 0 :(得分:0)

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

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

当然代码行:const saltRounds = 10;未使用,删除死代码。