我在php中使用以下代码来生成密码哈希和盐。
$salt = password_hash(uniqid(openssl_random_pseudo_bytes(16), TRUE), PASSWORD_BCRYPT);
password_hash($password . $salt, PASSWORD_BCRYPT);
我在NodeJS中使用bcrypt
并希望实现验证NodeJS中的密码。
我将哈希值和密码salt保存在我的数据库中,并可以在我的NodeJS应用程序中进行查询。
经过一些研究尝试后,我在SO上发现了这篇文章: Verify password hash in nodejs which was generated in php 现在我将替换部分添加到我的代码中。
我的伪:
bcrypt.compare(password_from_input + salt_from_db.replace(/^\$2y(.+)$/i, '\$2a$1'), password_from_db.replace(/^\$2y(.+)$/i, '\$2a$1'), function(err, result) {
console.log(result);
});
我也想要反过来。因此,在NodeJS中创建一个salt和hash,并在PHP中进行验证。
我希望你们能帮助我。
答案 0 :(得分:2)
在PHP中散列密码:
$hash = password_hash($password, PASSWORD_BCRYPT);
这会生成一个需要存储在数据库中的$2y$
哈希值。使用此代码比较节点中的密码:
bcrypt.compare(password_from_input, password_from_db.replace(/^\$2y(.+)$/i, '\$2a$1'), function(err, result) {
console.log(result);
});
在Node中散列密码:
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(password_from_input, salt, function(err, hash) {
hash = hash.replace(/^\$2a(.+)$/i, '\$2y$1';
...
});
});
这会生成$2a$
的哈希值。上面的示例将其替换为$2y$
,因此在PHP中比较会更容易。
比较PHP中的密码:
if (password_verify($password_from_input, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}