比较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$ 。 但好消息是2a2y之间的唯一区别是它们的前缀。

所以你可以做的是使其中一个前缀相似。 喜欢:

 $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$'); 

然后比较phpGeneratedHashfinalNodeGeneratedHash

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