我现在使用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)中。
答案 0 :(得分:0)
参见[](https://en.wikipedia.org/wiki/Bcrypt:“cost参数指定密钥扩展迭代计数为2的幂,它是crypt算法的输入”
$ 10 $指定成本参数10,表示2 ^ 10个密钥扩展轮次。
当然代码行:const saltRounds = 10;
未使用,删除死代码。