15

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

hash_hmac 的 PHP 文档中,第四个参数bool $raw_output控制输出是原始二进制数据 (true) 还是小写十六进制 (false)。我的程序只需将该参数设置为 true 即可在 PHP 中运行。

但是,我现在正在尝试将其移植到 Javascript。我尝试使用 CryptoJS.HmacSHA256() 函数,但它似乎返回了小写十六进制。如何将其转换为二进制?

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

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

5 回答 5

20

这在他们的文档中进行了解释。试试这个:

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/

于 2012-08-23T20:04:00.640 回答
7

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');
于 2018-11-27T06:06:44.577 回答
4

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
于 2017-09-22T12:48:23.443 回答
0

你也可以使用这个 npm 包在 Javascript 中做同样的事情。

var jsSHA = require('jssha');

hmac_sha1(string, key){
    let shaObj = new jsSHA("SHA-1", "TEXT");
    shaObj.setHMACKey(key, "TEXT");
    shaObj.update(string);
    let hmac = shaObj.getHMAC("B64");
    return hmac;
};
于 2019-09-15T09:16:13.410 回答
0

这对我有用:

var CryptoJS = require("crypto-js");
const raw_signature = hmacSHA1(baseString, signingKey);
const signature = raw_signature.toString(CryptoJS.enc.Base64);

它给出的结果与 PHP 中的结果完全相同:

$rawSignature = hash_hmac("sha1", $baseString, $signingKey, true);
$signature    = base64_encode($rawSignature);
于 2020-04-05T09:30:07.913 回答