javascript - 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) 中。
解决方案
请参阅 []( https://en.wikipedia.org/wiki/Bcrypt:“成本参数将密钥扩展迭代计数指定为 2 的幂,这是 crypt 算法的输入”
$10$ 指定成本参数为 10,表示 2^10 个密钥扩展轮次。
当然代码行:const saltRounds = 10;
没有使用,去掉死代码。
推荐阅读
- c# - 如何在值之后仅获取数组最接近的值
- sql-server - SQL Server:获取出现 ProductID 的所有行
- bash - 我的 $PATH 中有未在 .bashrc 文件中列出的可执行文件。他们来自哪里?
- python - 删除 python pandas 列中的特定字符串
- javascript - 无法设置 Laravel+VueJS 向我的模板呈现任何内容
- json - 如何为 JSON 提出对 RFC(s) 的一些修订以考虑评论?
- embedded - 连接 16*2 键盘和 LCD 与 atmega32
- angular - 使用 router.config.unshift() 设置动态路由仅在从 `AppComponent app.component.ts` 使用时才有效
- elasticsearch - Thruk 业务流程数据导出到弹性堆栈
- haskell - 如何将多态数据类型转换为单个元素列表