使用Javascript:PHP的hash_hmac()与原始二进制输出等效?([removed]

2019-06-27 07:57发布

我连接到亚马逊产品广告API,并签署了我的要求,我需要为base64编码的HMAC-SHA256哈希值的原始二进制输出。

在用于hash_hmac PHP文档 ,第四个参数bool $raw_output控制输出是否是原始二进制数据(真)或小写hexits(假)。 我的程序通过仅仅是参数设置为true在PHP工作。

不过,我现在想这个端口上为JavaScript。 我尝试使用CryptoJS.HmacSHA256()函数,但它似乎是返回小写hexits。 我怎样才能将它转换为二进制?

我曾尝试以下根据CryptoJS文档,但两个输出是相同的:

var hash = CryptoJS.HmacSHA256("hello", "key");
console.log(hash.toString());
console.log(hash.toString(CryptoJS.enc.Base64));

Answer 1:

这是他们在解释文件 。 试试这个:

var hash = CryptoJS.HmacSHA256("Message", "Secret Passphrase");

var base64 = hash.toString(CryptoJS.enc.Base64);

您需要包括http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js这一点。 如果不包括这一点, CryptoJS.enc.Base64将是undefined ,并退回到默认值。

工作演示: http://jsfiddle.net/ak5Qm/



Answer 2:

PHP代码

echo base64_encode(hash_hmac('SHA1', 'shanghai', '0', true).'beijing');

PHP的输出

xvBv49PpaYvXAIfy3iOSDWNQj89iZWlqaW5n

节点代码

var crypto = require('crypto');
var buf1 = crypto.createHmac("sha1", "0").update("shanghai").digest();
var buf2 = Buffer.from('beijing');
console.log(Buffer.concat([buf1, buf2]).toString('base64'));    

节点输出

xvBv49PpaYvXAIfy3iOSDWNQj89iZWlqaW5n


Answer 3:

PHP:

base64_encode(hash_hmac('sha256', $value, $key, true));

等价的NodeJS:

const crypto = require('crypto');
let token = crypto.createHmac("sha256", key).update(value).digest().toString('base64');


文章来源: Javascript: Equivalent of PHP's hash_hmac() with RAW BINARY output?