NodeJS crypto.createHmac SHA256无法正常工作 - php

我目前正在尝试实现我们正在使用的库的身份验证部分,但偶然发现了数据签名方面的一个奇怪问题,NodeJS中crypto.createHmac的输出大约是hash_hmac大小的一半在PHP中,这是PHP和NodeJS之间唯一不同的数据部分(我们需要在此处使用NodeJS)

用于在NodeJS中创建签名的确切代码是,

authorization["oauth_signature"] = crypto.createHmac('SHA256', process.env.SECRET).update(toSign).digest('base64');

对于PHP,它是

$authorization["oauth_signature"] = base64_encode(hash_hmac("SHA256", $signatureString . $signingKey, $secret));

但是,NodeJS版本的输出是

7LkQP+qKR1gSdPq/AgH/3No3ps7EtZXnqwjivMixvM8=

对于PHP,它是

NmQ0MWIzYmJiMjI2YzFlMDhiYzY3NzVmMWY0MzEwNDlhNDU3NDI0ZGJlMzU3NjJhYmMwYjgwYzZjMDE4NDM4OA==

哪有那么多的数据

我是否必须对NodeJS版本使用其他库,而不要在其中一个库中使用?我们将NodeJS后端托管在Microsoft Azure btw上,不确定这是否相关,但至少值得一提。

编辑:

我发现了问题,PHP中的hash_hmac自动将其数据导出为十六进制数据,crypto.createHmac将其数据导出为原始二进制数据,我直接将其转换为base64,我要做的就是首先将数据导出为hex然后转换到base64。

参考方案

试试这个;

var crypto = require('crypto');
var s = 'The quick brown fox jumps over the lazy dog';
console.log(
    new Buffer(
        crypto.createHmac('SHA256', 'SECRET').update(s).digest('hex')
    ).toString('base64')
);

DEMO

相当于PHP;

base64_encode(hash_hmac("SHA256",'The quick brown fox jumps over the lazy dog', 'SECRET'))

PHP:不推荐使用password_hash的'salt'选项 - php

我正在使用密码哈希进行注册。我需要手动创建Salt,以下是我使用的代码:$options = [ 'cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM) ]; $password = password_hash( $this->…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP Laravel从另一个驱动器读取文件 - php

我目前正在学习Laravel。我想知道是否有一种方法可以在Laravel中使用Storage::从另一个硬盘访问文件(使用Windows)。例如,我在驱动器C:上安装了带有Laravel的Xampp,但是我想访问网站目录之外的E:上的文件。我试过使用Storage::files('E:')和File::files('E:…