我的应用程序在 PHP 上运行多年,从 PHP 5.5 开始,我使用推荐的 密码哈希 API 来存储我的用户密码。例如:
$password = password_hash("my password", PASSWORD_DEFAULT);
结果,我的数据库中充满了这样的密码:
$2y$10$sjzYz7g/kVxpJUynC/...........pjKPh0z1QuU.Mlt7TVAiPW
现在我正在移动我的应用程序以在
NodeJS 12.3.0
而不是 PHP 上运行,我现在使用 bcrypt
库 像这样:
const saltRounds = 10;
const password = await bcrypt.hash("my password", saltRounds);
相同的密码散列为:
$2b$10$SYZH5Mj4Dy8dkKyRv1O/.........XNGPVBe8nPJjpnEjPZxx.
我认为所用的算法、盐和圆都在弦内,这样过渡就会无缝。但是,当我尝试验证 PHP 存储的密码时,正确的密码无法验证:
// result === false
const result = await bcrypt.compare("my password", phpStoredHash);
我真的希望我不必强迫所有用户重设密码。我如何验证存储在我的
NodeJS
应用程序中的 PHP 密码?
使用 bcryptjs 包代替。它可以正确比较 php 生成的哈希值。
const bcrypt = require('bcryptjs')
const hashPHP = "$2y$10$Lsn001yN38WssfQmJ5hM5.Ywa3AKB76YD/zUC9QNS5BPRr9QMWOTa"
console.log(bcrypt.compareSync("my password", hashPHP)); // outputs: true
当你使用 bcrypt.compareSync 需要
const bcrypt = require('bcryptjs')
使用这个 npm
npm 我 bcryptjs
let ifmatch = bcrypt.compareSync(密码, users.password);
if (ifmatch == false) {
res.status(401).send({
message: "password not found",
status: 0,
result:ifmatch,
err
});
}
if (ifmatch == true) {
res.status(200).send({
message: "You are successfully logged in",
users,
});
}
这没有任何盐轮,PASSWORD_DEFAULT 使用 BCRYPT
$password = password_hash("my password", PASSWORD_DEFAULT);
尝试进行以下更改:
$password = password_hash("my password", PASSWORD_BCRYPT);