比较PHP和NodeJS之间的BCrypt哈希
对于我正在开发的应用程序,nodejs需要validation由PHP创build的散列,反之亦然。
问题是,在PHP中生成的哈希值(通过Laravel的Hash
类,只使用PHP的password_hash
函数)在node.js中testing时返回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传递'。
我已经使用PHP 5.5.18,node.js v0.10.32和npm bcrypt模块在Ubuntu 14.04.1中运行testing。
这个失败是因为从php和node生成的bcrypt哈希types是不同的。 Laravel生成$2y$
而节点生成$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$
replace为$2y$
。 你可以简单地做到这一点:
PHP
$finalNodeGeneratedHash = str_replace("$2a$", "$2y$", $nodeGeneratedHash);
节点
finalNodeGeneratedHash = nodeGeneratedHash.replace('$2a$', '$2y$');
然后比较phpGeneratedHash
和finalNodeGeneratedHash
。
注意:build议如果您在PHP中进行比较,则将NodeJS生成哈希的前缀更改为
$2y$
,如果您在NodeJS中进行比较, 将PHP生成的哈希的前缀更改为$2a$
。