【发布时间】:2015-05-21 09:26:18
【问题描述】:
谁能解释一下使用 Node.JS 的 Crypto 模块和 Google Apps Script 创建 HmacSha512 签名之间的区别?
代码 1 - Node.JS
var secret = "my secret";
var message = "message";
var crypto = require("crypto");
var hmac = new crypto.createHmac("sha512", secret);
var signature = hmac.update(message).digest("base64");
console.log(signature);
代码 1 - Google Apps 脚本
var secret = "my secret";
var message = "message";
var signature = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secret));
Logger.log(signature);
两个代码生成相同的签名:
g4fZkM2XGNjhti9Wah3TU2/rvmxbL3nk4F3ZLljpED23oQ7Y7dtVmVKprQKuzyt0B4Spo214isWCvnoXXVTS8g==
但是当我们拥有 base64 编码密钥形式的秘密时,问题就来了。所以,我们要做的第一步是准备秘密。让我们修改代码:
代码 2 - Node.JS
var key = "JOLDQW5wVIdwvHbhSDCktxhfwpgtxlAH+DG5EPoeDT8aPGSDYYh5U6QjbASUhvztjGPgA/Ue2x8QKwUklX7+Xw==";
var secret = new Buffer(key, "base64");
var message = "message";
var crypto = require("crypto");
var hmac = new crypto.createHmac("sha512", secret);
var signature = hmac.update(message).digest("base64");
console.log(signature);
结果:
GELSKf33zit7nIfjj8XH3wZIga/CSYuCU5oTGysqOg6C/wFggunw59wzc7Mr95XW/gZ8putB67AADqnP0gLdiw==
代码 2 - Google Apps 脚本
var key = "JOLDQW5wVIdwvHbhSDCktxhfwpgtxlAH+DG5EPoeDT8aPGSDYYh5U6QjbASUhvztjGPgA/Ue2x8QKwUklX7+Xw==";
var message = "message";
var secret = Utilities.base64Decode(key);
var signature = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secret));
Logger.log(signature);
结果:
l11xAQ5C5ARx/r/pbNYpMKCqWOwIaxFTkfS9OXCwfUxv33y3gU/sL2vHueOxpkCKmF+lxIcFMYblwrvfWaTZkg==
差异可能在于处理/解码密钥(缓冲区与 Utilities.base64Decode。Node.js 版本是正确的(已针对服务器端进行验证)。
如何使用 Google Apps 脚本正确解码和使用密钥?
【问题讨论】:
-
你解决过这个问题吗?
-
相信这家伙有答案:stackoverflow.com/a/49267366/3346628
标签: javascript node.js google-apps-script cryptography hmac