bcrypt加密后密码无法正确验证是怎么回事?

俊鑫 Dev 阅读 4

我在用 bcrypt 给用户注册密码加密,登录时比对总是失败。明明输入的是正确的密码,但 bcrypt.compare 返回 false,是不是我哪里用错了?

我加密的时候用的是 bcrypt.hash(password, 10),验证逻辑也照着文档写的,但就是不对。

const hashed = await bcrypt.hash('123456', 10);
const isMatch = await bcrypt.compare('123456', hashed);
console.log(isMatch); // 有时候是 false,很奇怪
我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
宇文奥哲
看你的代码其实写得没错,问题可能出在其他地方。我猜你可能是把哈希值存到数据库的时候出了问题。

首先确认一下你存储 hashed 值的时候是不是完整保存了。bcrypt生成的哈希包含了盐值,任何字符都不能少。有时候为了节省空间或者格式问题,可能会截断或者转义了这个字符串。

再就是看看你验证时用的哈希值是不是最新的。如果用户改过密码,旧的哈希值还在用的话肯定不匹配。

给你个建议,调试的时候可以把加密和验证过程分开来测。比如这样:
const bcrypt = require('bcrypt');
async function test() {
const password = '123456';
const saltRounds = 10;
let hashed = await bcrypt.hash(password, saltRounds);
console.log('原始哈希:', hashed);

let isMatch = await bcrypt.compare(password, hashed);
console.log('验证结果:', isMatch);
}
test();

这能帮你确认问题到底在哪一步。记住哈希值要原样保存和使用,别自作聪明去处理它。我也遇到过类似坑,花了一整天找原因,最后发现是自己多此一举加了什么奇怪的操作。
点赞
2026-03-30 16:04