为什么我不能计算正确的HMAC签名?

Mic*_*ton 7 google-apps-script

我正在尝试在Google Apps脚本中计算HMAC签名,但文档并未100%明确我需要如何传递参数,而且我无法获得预期的输出.


为了确定我是否得到正确的输出,我将结果与已知良好的PHP代码进行比较.该代码是:

$key = "a2V5"; # this is "key" base64-encoded
$value = "test";
$result = base64_encode(hash_hmac('sha512', $value, base64_decode($key), true));
Run Code Online (Sandbox Code Playgroud)

我在Google Apps脚本中的代码是:

key = "a2V5"; // this is "key" base64-encoded
value = "test";
result = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, value, Utilities.base64Decode(key)));
Run Code Online (Sandbox Code Playgroud)

我希望收到的输出是:

KHoPuJp/vfpbVThjaRjlN6W4MGXk/zMSaLeqoRXd4EepsPT7W4KGCPwLYyfxAFX3Y3sFjp4Nu55piQGj5t1GHA==
Run Code Online (Sandbox Code Playgroud)

但我得到的是:

mGXJ3X/nH5ZIFUAPtf1PsViY50pD3cfU7J8w2KAIEAqrAgZ3dpKcuy5V1yvH4/C5n1C9rFFsKc2JKHTwUqPscQ==
Run Code Online (Sandbox Code Playgroud)

我搞砸了什么?

Tom*_*Tom 7

我查看了你的代码,有一件事引起了我的注意:

Utilities.base64Decode(key)方法返回Byte[] Utilities.computeHmacSignature(macAlgorithm, value, key)接受3个参数.value并且key是类型string.

也许这就是问题所在.为什么不尝试类似下面的内容并检查结果:

key = "a2V5"; // this is "key" base64-encoded
clearKey = "key";
value = "test";
result = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, value, clearKey));
Run Code Online (Sandbox Code Playgroud)

在这里查看Google Apps脚本.

  • 为了将来参考,我向Google提交了[错误报告](http://code.google.com/p/google-apps-script-issues/issues/detail?id=2227),并使用[jsSHA]结束了(http://caligatio.github.com/jsSHA/)在项目中,而不是谷歌破碎的`Utilities.computeHmacSignature`方法. (2认同)