我连接到亚马逊产品广告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));
这是他们在解释文件 。 试试这个:
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/
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
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');