NodeJS crypto.createHmac SHA256无法正常工作

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

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

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版本使用不同的库,而不是一个版本? 我们在Microsoft Azure上托pipe我们的NodeJS后端,不知道这是否相关,但似乎至less有效。

编辑:

我发现这个问题,在PHP中的hash_hmac自动导出它的数据为hex数据,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')) 

在提到Azure的情况下,密钥是以Base64格式提供的。 用节点的cryto库,当我作为一个Buffer传入密钥时,我发现它工作。 下面的Azure授权签名头节点代码示例:

 const util = require('util'); const crypto = require('crypto'); var accountName = "YOUR_ACCOUNT_NAME"; var key = Buffer("YOUR_BASE64_KEY",'base64'); var hash = crypto.createHmac('sha256',key).update(stringToSign,'utf8').digest('base64'); var signature = util.format("%s:%s", accountName, hash); var authorization = util.format("SharedKey %s", signature);