Google Script HMAC加密的二进制输出

时间:2013-06-18 05:05:35

标签: amazon-web-services google-apps-script hmac amazon-cloudwatch

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

关于如何创建签名密钥的Amazon API文档here,他们使用伪来解释HMAC算法将返回二进制格式。

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

Google apps脚本提供了一种执行此类哈希的方法,

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

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

Byte[]

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

由于

2 个答案:

答案 0 :(得分:2)

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

而且库编写器也太愚蠢,只提供将键作为byte []

的函数

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

只需复制SHA.js和SHA-256.js然后就可以了。

PS。它浪费了我整整2天的时间,所以我非常讨厌

答案 1 :(得分: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);

但你必须查看this open issue in the 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);