Javascript:相当于PHP的hash_hmac(),输出为RAW BINARY?

lymnna71  于 2023-04-19  发布在  Java
关注(0)|答案(6)|浏览(153)

我正在连接到Amazon Product Advertising API,为了签署我的请求,我需要对HMAC-SHA 256哈希的原始二进制输出进行base64编码。
the PHP documentation for hash_hmac中,第四个参数bool $raw_output控制输出是原始二进制数据(true)还是小写十六进制数据(false)。
然而,我现在试图将其移植到Javascript。我尝试使用CryptoJS.HmacSHA256()函数,但它似乎返回小写十六进制。我如何将其转换为二进制?
我根据CryptoJS文档尝试了以下操作,但两个输出都是相同的:

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

z8dt9xmd1#

这在他们的文档中有解释。试试这个:

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/

cyvaqqii

cyvaqqii2#

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');
t8e9dugd

t8e9dugd3#

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
i34xakig

i34xakig4#

你也可以使用这个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;
};
tv6aics1

tv6aics15#

这对我很有效:

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);
vuv7lop3

vuv7lop36#

对于Web浏览器:

async hmac_sha1 (str, secret) {
  let enc = new TextEncoder("utf-8");
  let key = await window.crypto.subtle.importKey(
    "raw",
    enc.encode(secret),
    {
      name: "HMAC",
      hash: {name: "SHA-1"}
    },
    false,
    ["sign", "verify"]
  );
  let signature = await window.crypto.subtle.sign(
    "HMAC",
    key,
    enc.encode(str)
  );
  let b = new Uint8Array(signature);
  return Array.prototype.map.call(b, x => x.toString(16).padStart(2, '0')).join("");
}

相关问题