密码(+ salt)在PHP和/或NodeJS中散列和验证

时间:2015-01-13 18:21:54

标签: php node.js

我在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中进行验证。

我希望你们能帮助我。

1 个答案:

答案 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.';
}