Javascript:相当于PHP'使用RAW二进制输出的s hash_hmac.()
Javascript: Equivalent of PHP's hash_hmac() with RAW BINARY output?
我正在连接到亚马逊产品广告API,为了签署我的请求,我需要对HMAC-SHA256哈希的原始二进制输出进行base64编码。
在hash_hmac的PHP文档中,第四个参数bool $raw_output
控制输出是原始二进制数据(true)还是小写十六进制数据(false)。我的程序在PHP中只需将该参数设置为true即可工作。
然而,我现在正试图将其移植到Javascript。我尝试使用CryptoJS.HmacSHA256()函数,但它似乎返回了小写字母hesets。如何将其转换为二进制?
根据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:
base64_encode(hash_hmac('sha256', $value, $key, true));
Nodejs等效:
const crypto = require('crypto');
let token = crypto.createHmac("sha256", key).update(value).digest().toString('base64');
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
对于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("");
}
您也可以使用这个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;
};
这对我有效:
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);
相关文章:
- 在JavaScript中输出转义字符
- 如何在jQuery中将函数的输出分配给变量
- Javascript,输出结果后页面不断刷新
- Datetime格式为Friendly Time.Moment JS输出错误
- 如何将angularjs中的javascript字符串输出为循环数组
- HTML5FileReader输出到D3.js图表
- console.log以外的Javascript输出函数
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- PHP中的数组输出
- 以不同的顺序输出数据
- 使用Rivets.js输出类
- 在Chrome扩展内部输出Google API调用
- 如何为d3.js图表输出组织/嵌套数据
- 将IndexedDB中的数据拉入数组,并通过ReactJS输出
- 一个ajax循环有两个输出错误innerHTML
- 快速排序程序未正确输出
- 函数将输出nan而不是数字,为什么
- 在量角器中创建一个.txt错误输出文件是手动的,而不是控制台错误
- Node.js:通过管道将请求输出到crypto.hash
- 连接美元.Post with hash.拆分和输出