NodeJS crypto.createHmac SHA256 无法正常工作

Meg*_*ley 2 php sha256 azure hmac node.js

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

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

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

对于 PHP,它是

$authorization["oauth_signature"] = base64_encode(hash_hmac("SHA256", $signatureString . $signingKey, $secret));
Run Code Online (Sandbox Code Playgroud)

但是 NodeJS 版本的输出是

7LkQP+qKR1gSdPq/AgH/3No3ps7EtZXnqwjivMixvM8=
Run Code Online (Sandbox Code Playgroud)

对于 PHP,它是

NmQ0MWIzYmJiMjI2YzFlMDhiYzY3NzVmMWY0MzEwNDlhNDU3NDI0ZGJlMzU3NjJhYmMwYjgwYzZjMDE4NDM4OA==
Run Code Online (Sandbox Code Playgroud)

其中有超过两倍的数据

我是否必须为 NodeJS 版本使用不同的库,而不是在一个库中构建?顺便说一句,我们在 Microsoft Azure 上托管我们的 NodeJS 后端,不确定这是否相关,但至少值得一提。

编辑:

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

Boy*_*len 5

尝试这个;

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')
);
Run Code Online (Sandbox Code Playgroud)

演示

PHP 等价物;

base64_encode(hash_hmac("SHA256",'The quick brown fox jumps over the lazy dog', 'SECRET'))
Run Code Online (Sandbox Code Playgroud)