比较PHP和NodeJS之间的BCrypt哈希

2021/01/30 18:21 · php ·  · 0评论

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

问题是,在node.js中测试时,PHP中生成的哈希(通过Hash仅使用PHPpassword_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模块运行了测试。

失败是因为从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);

节点

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

然后比较phpGeneratedHashfinalNodeGeneratedHash

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

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

在PHP 7.2.4方面:

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

在nodeJS端:

安装bcryptjs软件包:npm i bcryptjs

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

不同语言中bcrypt的实现可能会有所不同。

例如,在Node.js版本bcrypt.js中,应用的盐长度为29个字符

    bcrypt.getSalt = function(hash) {
        if (typeof hash !== 'string')
            throw Error("Illegal arguments: "+(typeof hash));
        if (hash.length !== 60)
            throw Error("Illegal hash length: "+hash.length+" != 60");
        return hash.substring(0, 29);
    };

但是,在Go版本golang.org/x/crypto/bcrypt中,盐的大小为22个字节:

const (
    majorVersion       = '2'
    minorVersion       = 'a'
    maxSaltSize        = 16
    maxCryptedHashSize = 23
    encodedSaltSize    = 22
    encodedHashSize    = 31
    minHashSize        = 59
)

因此,在Go中进行比较时,Node.js中的哈希字符串可能会出错,其他语言也是如此。

本文地址:http://php.askforanswer.com/bijiaophphenodejszhijiandebcrypthaxi.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!