node.js - 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
解决方案
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);
推荐阅读
- django - 如何从数据库中获取现有值到 django admin 的 django 模型字段中
- ansible - 使用带有多个变量的 with_list 的 Ansible 循环值
- python - Microsoft Visual Studio 14 - 退出状态为 2 失败
- c# - 每个选项卡都有单独的控制器/视图?
- postman - 使用 Postman 上传文件测试
- javascript - 切换属性和 css 数据
- regex - AD中移动/手机的PowerShell RegEx模式匹配?
- c# - 尝试使用 Ajax 调用控制器方法 MVC 获取数据 我的代码已附加
- ruby-on-rails - 使用 if .length > 0 将类添加到 image_tag
- javascript - 反应地图不是我的应用程序中的功能错误