问题描述
这让我发疯。这是非常简单的代码:
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
依次采用两个参数:plaintextPassword
和hashedPassword
。
$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