我目前正在使用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函数来计算哈希?
由于
答案 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);