对于我正在开发的应用程序,nodejs 需要验证 PHP 创建的哈希值,反之亦然。
问题是,PHP 中生成的哈希值(通过 Laravel 的Hash
类,它只使用 PHP 的password_hash
函数)在 Node.js 中测试时返回 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 中运行测试。
这会失败,因为从 php 和 Node 生成的 bcrypt 哈希类型不同。 Laravel 生成$2y$
而节点生成$2a$
。但好消息是两者之间的唯一区别2a
and 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$');
然后比较phpGeneratedHash
to finalNodeGeneratedHash
.
注意:如果您在 PHP 中进行比较,建议将 NodeJS 生成的哈希的前缀更改为$2y$
如果你在 NodeJS 中进行比较;将 PHP 生成的哈希的前缀更改为$2a$
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)