比较 PHP 和 NodeJS 之间的 BCrypt 哈希

2022-08-30 11:40:34

对于我正在开发的应用程序,nodejs需要验证PHP创建的哈希值,反之亦然。

问题是,在PHP中生成的哈希值(通过Laravel的类,它只使用PHP的函数)在node.js中测试时返回false。Hashpassword_hash

以下节点.js脚本:

var bcrypt = require('bcrypt');

var password = 'password';

var phpGeneratedHash  = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
var nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

console.log(
  bcrypt.compareSync(password, phpGeneratedHash)  ? 'PHP passed' : 'PHP failed',
  bcrypt.compareSync(password, nodeGeneratedHash) ? 'nodejs passed' : 'nodejs failed'
);

输出:“PHP failed nodejs passed”,而以下 PHP 脚本:

<?php

$password = 'password';

$phpGeneratedHash  = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
$nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

print password_verify($password, $phpGeneratedHash)  ? 'PHP passed' : 'PHP failed';
print password_verify($password, $nodeGeneratedHash) ? 'nodejs passed' : 'nodejs failed';

输出 'PHP pass nodejs passed'。

我已经使用PHP 5.5.18,node.js v0.10.32和npm bcrypt模块在Ubuntu 14.04.1中运行了测试。


答案 1

这失败了,因为从php和node生成的bcrypt哈希的类型是不同的。Laravel 生成 while 节点生成 .但好消息是它们之间的唯一区别是它们的前缀。$2y$$2a$2a2y

因此,您可以做的是使其中一个前缀与另一个前缀相似。喜欢:

$phpGeneratedHash  = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
$nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

对类似的东西:

$phpGeneratedHash  = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.';
$nodeGeneratedHash = '$2y$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';

请注意,我将节点哈希的 替换为 。您可以简单地执行以下操作:$2a$$2y$

菲律宾比索

$finalNodeGeneratedHash = str_replace("$2a$", "$2y$", $nodeGeneratedHash);

节点

finalNodeGeneratedHash = nodeGeneratedHash.replace('$2a$', '$2y$');

然后与 进行比较。phpGeneratedHashfinalNodeGeneratedHash

注意:如果您要在PHP中进行比较,建议您将NodeJS生成的哈希的前缀更改为,如果您正在NodeJS中进行比较;将 PHP 生成的哈希的前缀更改为 。$2y$$2a$


答案 2

我试图计算之前所说的内容,以获得有效的代码。如您所见,我不需要更换任何东西。

在 PHP 7.2.4 方面:

<?php
$password = "test123";
    $hash = password_hash($password, PASSWORD_BCRYPT);
    echo $hash; // I get $2y$10$5EaF4lMSCFWe7YqqxyBnR.QmDu1XhoiaQxrOFw.AJZkGCYmpsWDU6

在节点JS端:

Install bcryptjs package: npm i bcryptjs

var bcrypt = require('bcryptjs');
let hash1="$2y$10$5EaF4lMSCFWe7YqqxyBnR.QmDu1XhoiaQxrOFw.AJZkGCYmpsWDU6";
console.log(bcrypt.compareSync("test123", hash1)); // display true

推荐