首页 > 解决方案 > Node 的 bcrypt 比较返回 False 虽然它是真的

问题描述

这真让我抓狂。这是非常简单的代码:

user = new User(_.pick(userData, ['name', 'email', 'password']));
const salt = await bcrypt.genSalt(15);
user.password = await bcrypt.hash(user.password, salt);
const samePass = await bcrypt.compare(user.password, userData.password);

samePass 总是错误的。我已经检查了https://bcrypt-generator.com上的示例请求密码和哈希值,它确实显示它们匹配。bcrypt 总是返回 false。而且你可以看到数据库与它无关。

示例数据(我都使用了 IDE 调试器,在 samePass 行有一个断点):

user.password = $2b$10$nH2SGNZu9rdyz.V6qpT29eAhxKWfiOIr9ojOi96Ye2lQub.Pglof.
userData.password = oXmZ9pG5T4XtndH%#@A

标签: node.jsbcrypt

解决方案


user.password = await bcrypt.hash(user.password, salt); //This line is generating the password hash

在比较时,您将第二个参数作为存储在数据库中的密码哈希传递。但是,在您的代码中,您将覆盖包含需要比较的实际密码的输入 user.password

const samePass = await bcrypt.compare(user.password, userData.password);

将其更改为:

let passwordHash = await bcrypt.hash(user.password, salt);
const booleanResult = await bcrypt.compare(userData.password, passwordHash);

推荐阅读