luv*_*all 3 sha256 digital-signature hmac amazon-web-services google-apps-script
在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, 159.0, 187.0, 148.0, 254.0, 181.0, 66.0, 183.0, 30.0, 222.0, 111.0, 135.0, 254.0, 77.0, 95.0, 162.0, 156.0, 120.0, 147.0, 66.0, 176.0, 244.0, 7.0, 71.0, 70.0, 112.0, 240.0, 194.0, 72.0, 158.0, 10.0, 13.0]
var signature=Utilities.computeHmacSha256Signature(input,key);
signature=signature.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
Logger.log(signature);//non-valid ac7a5b21190d18b323886d48cd3c4c7486a0f1dd4edb80d245a221a95f5e689b
Run Code Online (Sandbox Code Playgroud)
使用在线转换器,我可以确认密钥已正确转换。但是,输出签名仍然是错误的。我想知道是否可能是因为密钥字节存储为双精度。因此,我尝试了以下操作,但输出签名没有区别:
var input="us-east-1";
var key=[0x96, 0x9f, 0xbb, 0x94, 0xfe, 0xb5, 0x42, 0xb7, 0x1e, 0xde, 0x6f, 0x87, 0xfe, 0x4d, 0x5f, 0xa2, 0x9c, 0x78, 0x93, 0x42, 0xb0, 0xf4, 0x07, 0x47, 0x46, 0x70, 0xf0, 0xc2, 0x48, 0x9e, 0x0a, 0x0d];
var signature=Utilities.computeHmacSha256Signature(input,key);
signature=signature.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
Logger.log(signature);//non-valid ac7a5b21190d18b323886d48cd3c4c7486a0f1dd4edb80d245a221a95f5e689b
Run Code Online (Sandbox Code Playgroud)
然后我以为computeHmacSha256Signature函数的两个参数都必须是字节数组:
var input=[0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x31];
var key=[0x96, 0x9f, 0xbb, 0x94, 0xfe, 0xb5, 0x42, 0xb7, 0x1e, 0xde, 0x6f, 0x87, 0xfe, 0x4d, 0x5f, 0xa2, 0x9c, 0x78, 0x93, 0x42, 0xb0, 0xf4, 0x07, 0x47, 0x46, 0x70, 0xf0, 0xc2, 0x48, 0x9e, 0x0a, 0x0d];
var signature=Utilities.computeHmacSha256Signature(input,key);//leads to error "Cannot convert Array to (class)[]."
signature=signature.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
Logger.log(signature);
Run Code Online (Sandbox Code Playgroud)
上面导致错误“无法将数组转换为(class)[]。”。这似乎表明computeHmacSha256Signature函数更适合使用字符串输入。
通过使用kDate的输出签名,我又得到了另一个无效的kRegion输出签名,而没有将其转换为字符串:
var input="20120215";
var key="AWS4"+"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";
var signature=Utilities.computeHmacSha256Signature(input,key);
input="us-east-1";
key=signature;
signature = Utilities.computeHmacSha256Signature(input,key);
signature=signature.map(function(chr){return (chr+256).toString(16).slice(-2)}).join('');
Logger.log(signature);//non-valid c3b37a4dc2e085fcd35411493526592a33ef1d7d38454a25e574a34fe190d7be
Run Code Online (Sandbox Code Playgroud)
我尝试了许多其他转换,但均未成功。
您想要使用Google Apps 脚本获得“如何派生签名版本4的签名密钥的示例”示例脚本的结果。
在您的情况下,您想f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d
从以下示例值中检索的值kSigning
。
key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
dateStamp = '20120215'
regionName = 'us-east-1'
serviceName = 'iam'
Run Code Online (Sandbox Code Playgroud)如果我的理解是正确的,那么该示例脚本如何?
Utilities.computeHmacSha256Signature()
带符号的十六进制的bytes数组。在示例脚本中,bytes数组转换为无符号十六进制。因此需要进行转换。
Utilities.computeHmacSha256Signature()
,创建的字节数组可用于Utilities.computeHmacSha256Signature()
不进行转换的情况。在上述情况下,可以如下制作Google Apps脚本的示例脚本。
在此示例脚本中,为了检查脚本是否正确,我使用位于https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html的示例值测试了脚本。
function myFunction() {
// These are the sample values of https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html
var key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY';
var dateStamp = '20120215';
var regionName = 'us-east-1';
var serviceName = 'iam';
// I prepared the following script.
var kDate = Utilities.computeHmacSha256Signature(dateStamp, "AWS4" + key);
var kRegion = Utilities.computeHmacSha256Signature(Utilities.newBlob(regionName).getBytes(), kDate);
var kService = Utilities.computeHmacSha256Signature(Utilities.newBlob(serviceName).getBytes(), kRegion);
var kSigning = Utilities.computeHmacSha256Signature(Utilities.newBlob("aws4_request").getBytes(), kService);
kSigning = kSigning.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
Logger.log(kSigning) // Result
}
Run Code Online (Sandbox Code Playgroud)
kDate
是字节数组。因此regionName
需要将其转换为字节数组。请注意这一点。f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d
Run Code Online (Sandbox Code Playgroud)
该值与样本值相同。这样,发现准备好的脚本返回正确的值。
如果我误解了您的问题,而这不是您想要的结果,我深表歉意。
归档时间: |
|
查看次数: |
94 次 |
最近记录: |