如何在JavaScript中将十进制值转换为十六进制等效值?
如何将字节数组转换为字符串?
我发现这些功能正好相反:
function string2Bin(s) {
var b = new Array();
var last = s.length;
for (var i = 0; i < last; i++) {
var d = s.charCodeAt(i);
if (d < 128)
b[i] = dec2Bin(d);
else {
var c = s.charAt(i);
alert(c + ' is NOT an ASCII character');
b[i] = -1;
}
}
return b;
}
function dec2Bin(d) {
var b = '';
for (var i = 0; i < 8; i++) {
b = (d%2) + b;
d …Run Code Online (Sandbox Code Playgroud) 我在下面阅读了MD5的解决方案,但我无法理解.
从computeDigest(algorithm,value)byte []获取字符串表示
我想用HMAC-SHA256哈希创建API签名.
var date = new Date();
var nonce = Math.floor(date.getTime()/1000);
var url = "https://mysweet.com/api/accounts"
var secret = "my_secret";
var signature = Utilities.computeHmacSha256Signature(nonce+url, secret);
Run Code Online (Sandbox Code Playgroud)
但它返回字节数组[42,-8,-47,-21,..],它不能直接用作API签名.有没有一种从方法中获取Hex值的简单方法?还是转换?
在Signature Version 4上的AWS示例之后,我尝试使用带有Google apps脚本的Google Sheets重现该示例。我在示例中遇到了kregion签名的问题。尽管我可以使用在线签名工具确认AWS示例有效,但是我永远无法使用任何Google应用程序脚本来复制示例输出。由于HMAC SHA256签名在示例的早期部分(kdate)可以正常工作,因此问题似乎出在存储或使用数据的方式上。
以下是适用于kDate的内容:来自另一个stackoverflow条目的部分,用于将字节数组转换为十六进制字符串,并借助computeHmacSha256Signature的Google Apps脚本文档:
var input="20120215";
var key="AWS4"+"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";//Do not worry, this is an example key, not my actual key
var signature=Utilities.computeHmacSha256Signature(input,key);
signature=signature.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');//convert byte array to hex string
Logger.log(signature);//valid 969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d
Run Code Online (Sandbox Code Playgroud)
这是kRegion的同一件事:
var input="us-east-1";
var key="969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d";
var signature=Utilities.computeHmacSha256Signature(input,key);
signature=signature.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
Logger.log(signature);//non-valid a59e30f9d899c47b3dd68ea1c0ab3bb529e03a8f4ed2f54cb64af547330a22a0
Run Code Online (Sandbox Code Playgroud)
我不惊讶它不会产生有效的示例kRegion输出,69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c因为密钥存储为十六进制字符串,这没有多大意义。这是试图将十六进制字符串解码为从此github条目启发而来的字节数组的同一件事:
var input="us-east-1";
var key="969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d";
var a=[];
for(var i=0, len=key.length; i<len; i+=2) {
a.push(parseInt(key.substr(i,2),16));
}
key=a;
Logger.log(key);//[150.0, …Run Code Online (Sandbox Code Playgroud) sha256 digital-signature hmac amazon-web-services google-apps-script
Given this code in nodejs:
const crypto = require('crypto');
const message = 'message to sign';
const secret = 'mysecret';
const signature = crypto.createHmac('sha256', secret).update(message).digest('hex');
console.log(signature);
Run Code Online (Sandbox Code Playgroud)
The output is 40d4c57eed56968de0f3a22e73ebf8abc6ab4c38bba95fd2c85dd4dc90bf36b9
With the help of the answers here, I have exactly replicated this behavior in Google Apps Script, with this function:
//conversion from byte array taken from: /sf/answers/1955342161/
function makeHmacSignature(macAlg, message, secret) {
return Utilities.computeHmacSignature(macAlg, message, secret).reduce(function(str,chr){
chr = (chr < 0 ? chr + 256 : chr).toString(16);
return str + …Run Code Online (Sandbox Code Playgroud)