【问题标题】:bcrypt.compare ( ) always returning falsebcrypt.compare ( ) 总是返回 false
【发布时间】:2021-09-01 11:52:57
【问题描述】:

我已经尝试过 bcrypt(5.0.0 版)和 bcryptjs(2.4.3 版)来散列和比较密码。但是两个包中的比较函数总是返回 false

散列

userSchema.pre('save', async function (next) {
  this.password = await bcrypt.hash(this.password, 12);
  this.passwordConfirm = undefined;
  next();
});

比较

userSchema.methods.checkPassword = async function (inputPass, hashedPass) {
  return await bcrypt.compare(inputPass, hashedPass);
};

更新 这个问题现在似乎在我其他具有完全相同设置的项目上消失了。

【问题讨论】:

  • 通常的密码方案是存储密码的散列版本,然后在提交密码时对其进行散列,然后比较两个散列。在您的 checkPassword 方法中,我假设其中一个是先前存储的哈希值,另一个是传入密码。如果是这样,则需要在比较之前对其进行哈希处理。您无法将哈希与普通密码进行比较。
  • 我认为在比较输入密码和用户密码之前,您没有对输入密码进行哈希处理。首先您必须对输入密码进行哈希处理,然后比较两个密码,如果输入密码它应该返回 true是正确的
  • @jfriend00 哈希方法每次都会生成一个唯一的哈希,即使其中提供了相同的输入。因此,即使我首先对输入密码进行哈希处理,然后将其与存储在 DB 中的已哈希密码进行比较,它也会返回 false。此外,之前我使用 bcrypt 的方式与这里使用的方式相同。那一次它起作用了,但突然之间它停止了工作。此外,没有关于 bcrypt 比较工作方式的任何变化的官方更新。我不明白它为什么停止工作。
  • 如果每次给定相同的输入数据时哈希值都不同,那么您显然做错了。如果是这种情况,散列函数将毫无用处。我怀疑您不是每次都从相同的输入数据开始或做其他错误的事情。也许您正在散列哈希或类似的东西。
  • @jfriend00 我检查过,但哈希生成实现没有任何问题。这就是 bcrypt 的工作方式。它每次接收输入时都会生成新的盐,因此即使提供的输入相同,每次都会创建一个唯一的哈希值。我怀疑“比较”功能有问题,因为在 2021 年 1 月早些时候,它以这种方式工作得很好。但是现在,突然之间,它以一种奇怪的方式工作,它总是返回 false。

标签: node.js express bcrypt


【解决方案1】:

你不能用await函数和return,试试吧

userSchema.methods.checkPassword = async function (inputPass, hashedPass) {
  let isValid = await bcrypt.compare(inputPass, hashedPass);
  return isValid;
};

【讨论】:

  • 使用等待返回不是问题。但我也尝试过这种方法,但没有奏效。
猜你喜欢
  • 2019-12-08
  • 2019-05-05
  • 2019-05-27
  • 2021-09-29
  • 2014-05-30
  • 2022-10-23
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多