【发布时间】: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。