【问题标题】:Password(+salt) hashing and verifying in PHP and/or NodeJSPHP 和/或 NodeJS 中的密码(+salt)散列和验证
【发布时间】:2015-01-13 18:21:54
【问题描述】:

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

希望大家能帮帮我。

【问题讨论】:

  • bcrypt.compare()的输入密码不需要加盐。
  • 如果我在没有盐的情况下在 PHP 中对密码进行哈希处理,NodeJS 中的比较就可以了。
  • 我不知道你在做什么。为什么要在 PHP 中散列随机盐?你为什么要加盐?
  • 我不知何故读到如果我加盐会更安全。所以我不用加盐,对吧?
  • 你需要一个盐,但password_hash() 会自动生成一个。

标签: php node.js


【解决方案1】:

在 PHP 中散列密码:

$hash = password_hash($password, PASSWORD_BCRYPT);

这会生成一个带有$2y$ 的散列,您需要将其存储在数据库中。使用此代码比较 Node 中的密码:

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');
        //Insert into database
    });
});

这会生成带有$2a$ 的哈希。上例将其替换为$2y$,因此在PHP中比较会更容易。

在 PHP 中比较密码:

if (password_verify($password_from_input, $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 2017-12-26
    • 1970-01-01
    • 2020-08-16
    • 2012-04-19
    • 2022-01-09
    相关资源
    最近更新 更多