您是否有人可以向我解釋使用Node.JS的加密模塊和Google Apps腳本創建HmacSha512簽名的區別?Node.js crypto中的HMAC與Google Apps腳本(GAS)的對比
碼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 - 谷歌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 - 谷歌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==
差異可能在於處理/解碼密鑰(Buffer vs. Utilities.base64Decode。 Node.js版本是正確的(它是針對服務器端進行驗證的)。
如何使用Google Apps腳本正確解碼和使用密鑰?
對於你的建議,你是@Spencer。我試圖修改代碼: 'var key =「JOLDQW5wVIdwvHbhSDCktxhfwpgtxlAH + DG5EPoeDT8aPGSDYYh5U6QjbASUhvztjGPgA/Ue2x8QKwUklX7 + Xw ==」; var message =「message」; var secret = Utilities.newBlob(Utilities.base64Decode(key))。getDataAsString(); var signature = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512,message,secret)); Logger.log(簽名);' ,其結果是: 'rbW61ipkR57jJOvFIhfeiAhBH/5cH9W2l/RtRGLCvFUeyl2iEN + yNnrubWjK4EcGyQkFbKpjhtCLgot/fV5LaQ ==' 因此,越來越多地,比其他的Node.js生成... –