gpt4 book ai didi

amazon-web-services - 如何使用谷歌应用程序脚本使用双数组键或十六进制字符串键对字符串进行 HMAC SHA256 签名?

转载 作者:行者123 更新时间:2023-12-04 08:02:01 40 4
gpt4 key购买 nike

AWS example on Signature Version 4 之后,我正在尝试使用带有 Google 应用程序脚本的 Google 表格重现该示例。我在示例中遇到了 kregion 签名问题。虽然我可以使用 an online signature tool 确认 AWS 示例有效,我永远无法使用任何 Google 应用程序脚本重现示例输出。由于 HMAC SHA256 签名适用于示例的较早部分 (kdate),问题似乎出在数据的存储或使用方式上。

适用于 kDate 的部分来自 another stackoverflow entry to convert byte array to hex string。在Google apps script documentation for computeHmacSha256Signature的帮助下:

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

对于 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

我并不惊讶它没有产生有效的示例 kRegion 输出 69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c 因为 key 存储为一个没有多大意义的十六进制字符串。这是同样的事情,试图将十六进制字符串解码为受此启发的字节数组 github entry :

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

使用 online converter ,我可以确认 key 已正确转换。然而,输出签名仍然是错误的。我想知道这是否可能是因为关键字节存储为 double 。因此,我尝试了以下输出签名没有区别的方法:

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

然后我想也许 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);

以上导致错误“无法将数组转换为(类)[]”。这似乎表明 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

我尝试了许多其他转换但均未成功。

最佳答案

  • 您想实现 "Examples of How to Derive a Signing Key for Signature Version 4" 的示例脚本的结果使用 Google Apps 脚本。

    • 在您的例子中,您想要检索 f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d 的值来自以下样本值 kSigning .

      key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
      dateStamp = '20120215'
      regionName = 'us-east-1'
      serviceName = 'iam'

如果我的理解是正确的,这个示例脚本怎么样?

要点:

  • 在 Google Apps 脚本中,由 Utilities.computeHmacSha256Signature() 加密的数据是带符号的十六进制的字节数组。在 the sample scripts ,字节数组被转换为无符号十六进制。所以需要转换。
    • 但是,当字节数组由 Utilities.computeHmacSha256Signature() 创建时,创建的字节数组可用于Utilities.computeHmacSha256Signature()无需转换。

根据上述情况,Google Apps Script 的示例脚本可以制作如下。

示例脚本:

在这个示例脚本中,为了检查脚本是否正确,我使用 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
}
  • 关于上面的脚本,例如kDate是字节数组。所以regionName需要转换为字节数组。请注意这一点。

结果:

f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d

此值与the sample value相同.至此,发现编写的脚本返回了正确的值。

引用资料:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

关于amazon-web-services - 如何使用谷歌应用程序脚本使用双数组键或十六进制字符串键对字符串进行 HMAC SHA256 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57439671/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com