节点的bcrypt比较返回true,但返回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始终为false。我已经检查了示例请求密码和https://bcrypt-generator.com上的哈希,它确实显示它们匹配。 bcrypt总是返回false。您会发现该数据库与它无关。

样本数据(我都使用过IDE调试器,并且在同一Pass行上有一个断点):

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);
,

bcrypt.compare依次采用两个参数:plaintextPasswordhashedPassword

$2b$10$nH2SGNZu9rdyz.V6qpT29eAhxKWfiOIr9ojOi96Ye2lQub.Pglof.oXmZ9pG5T4XtndH%#@A的哈希版本,因此您可以执行以下操作:

const password = 'oXmZ9pG5T4XtndH%#@A'
const preHashedPassword = '$2b$10$nH2SGNZu9rdyz.V6qpT29eAhxKWfiOIr9ojOi96Ye2lQub.Pglof.'

await bcrypt.compare(password,preHashedPassword) // true

您也可以这样做:

const salt = await bcrypt.genSalt(15)
const newHashedPassword = await bcrypt.hash(password,salt)

await bcrypt.compare(password,newHashedPassword) // true

但是您不能执行以下任何操作:

await bcrypt.compare(preHashedPassword,newHashedPassword) // false
await bcrypt.compare(newHashedPassword,preHashedPassword) // false
await bcrypt.compare(preHashedPassword,password) // false
await bcrypt.compare(newHashedPassword,password) // false

RunKit demo