6

我目前正在使用 Google Apps 脚本,并正在尝试编写和签署对 AWS CloudWatch 的 HTTP 请求。

在此处有关如何创建签名密钥的 Amazon API 文档中,他们使用伪来解释 HMAC 算法是返回二进制格式。

HMAC(key, data) represents an HMAC-SHA256 function 
that returns output in binary format.

谷歌应用脚​​本提供了一种方法来做这样的哈希,

Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256,
                                            data,
                                            key);

但返回类型始终是字节数组。

Byte[]

如何将 Byte[] 转换为 AWS 想要的二进制数据?或者是否有我可以在 Google Apps 脚本中使用的普通 javascript 函数来计算哈希?

谢谢

4

2 回答 2

2

我很确定 Utilities.computeHmacSignature 将密钥作为 ASCII 是一个错误。但是没有办法在 GAS 中正确地将 byte[] 解析为 ASCII

而且库编写者太愚蠢了,也只是提供了将键作为字节[]的函数

所以我改用这个:http ://caligatio.github.com/jsSHA/

只需复制 SHA.js 和 SHA-256.js 即可正常工作

PS。它浪费了我整整 2 天的时间,所以我很烦人

于 2016-03-11T05:11:37.477 回答
1

从字节数组到所需二进制数据的转换应该很简单:

kDate = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256,
             '20130618', 'AWS4' + kSecret);
kDate = Utilities.newBlob(kDate).getDataAsString();
kRegion = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
             'eu-west-1', kDate);

但是您必须在 bugtracker 中查看这个未解决的问题- 转换中可能存在一些问题。

也许您可以尝试创建一个 String.fromCharCode() 循环并避免使用负数:

kDateB = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256,
             '20130618', 'AWS4' + kSecret);
kDate = '';
for (var i=0; i<kDateB.length; i++)
  kDate += String.fromCharCode(kDateB[i]<0?256+kDateB[i]:0+kDateB[i]);
kRegion = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
             'eu-west-1', kDate);
于 2013-06-18T07:46:45.910 回答