一尘不染

比较PHP和NodeJS之间的BCrypt哈希

node.js

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

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

以下node.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失败的nodejs通过”,而以下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通过的nodejs通过的”。

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


阅读 341

收藏
2020-07-07

共1个答案

一尘不染

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

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

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

像这样:

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

请注意,我$2a$将节点哈希的替换为$2y$。您可以使用以下方法简单地做到这一点:

PHP

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

node

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

然后比较phpGeneratedHashfinalNodeGeneratedHash

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

2020-07-07