2015-05-21 87 views
4

您是否有人可以向我解釋使用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腳本正確解碼和使用密鑰?

回答

4

Utilities.base64Decode()返回一個字節數組而不是字符串。您可以從字節數組創建一個blob,然後將其作爲字符串恢復原始編碼的字符串。

var secret = Utilities.base64Decode(key); 
secret = Utilities.newBlob(secret).getDataAsString(); 

試試這個例子。我換成你的密鑰與新的base64編碼字符串,並將其轉換B64解碼輸出爲字符串:
在節點:

var key = "VEhJUyBJUyBBIFNUUklORw=="; 
//var key = "JOLDQW5wVIdwvHbhSDCktxhfwpgtxlAH+DG5EPoeDT8aPGSDYYh5U6QjbASUhvztjGPgA/Ue2x8QKwUklX7+Xw=="; 
var secret = new Buffer(key, "base64").toString(); 
var message = "message"; 
var crypto = require("crypto"); 
var hmac = new crypto.createHmac("sha512", secret); 
var signature = hmac.update(message).digest("base64"); 
console.log(signature); 

氣:

//var key = "JOLDQW5wVIdwvHbhSDCktxhfwpgtxlAH+DG5EPoeDT8aPGSDYYh5U6QjbASUhvztjGPgA/Ue2x8QKwUklX7+Xw=="; 
var key = "VEhJUyBJUyBBIFNUUklORw==" 
var message = "message"; 
var secret = Utilities.base64Decode(key); 
secret = Utilities.newBlob(secret).getDataAsString(); 
var hmac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secret); 
var signature = Utilities.base64Encode(hmac); 
Logger.log(signature); 

都返回簽名:

a9Jk2YQsKC164zEUoVChIpyfnEUZLj+Sj1mCAqs+jhDFvOliTupIfV+D6CNtaQGhQvAO40FZLhvYGubt1R5jQA== 

但是,如果我把你的鑰匙放回簽名再次停止匹配。

+0

對於你的建議,你是@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生成... –

0

aditional的發現:

的結果是相同的形式的兩個碼時,它使用另一種密鑰 - 作爲Spencer寫道。但還有一件奇怪的事情。讓我們使用斯賓塞的鑰匙來確保兩個代碼都可以工作。當我們想用非ASCII字符對消息進行簽名時,例如「Tomáš」,代碼也會產生不同的結果!

相關問題