bcrypt加密后密码无法正确验证是怎么回事?
我在用 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,很奇怪
首先确认一下你存储
hashed值的时候是不是完整保存了。bcrypt生成的哈希包含了盐值,任何字符都不能少。有时候为了节省空间或者格式问题,可能会截断或者转义了这个字符串。再就是看看你验证时用的哈希值是不是最新的。如果用户改过密码,旧的哈希值还在用的话肯定不匹配。
给你个建议,调试的时候可以把加密和验证过程分开来测。比如这样:
这能帮你确认问题到底在哪一步。记住哈希值要原样保存和使用,别自作聪明去处理它。我也遇到过类似坑,花了一整天找原因,最后发现是自己多此一举加了什么奇怪的操作。