2015-05-21 2 views
4

Можете ли вы объяснить мне разницу между созданием сигнатуры HmacSha512 с использованием Crypto-модуля Node.JS и скрипта Google Apps?HMAC в Node.js crypto vs. Google Apps Script (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 - Google Apps Script

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== 

Code 2 - Google Apps Script

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

Thnk you @Spencer для вашего предложения.Я пытался модифицировать код: 'var key =" JOLDQW5wVIdwvHbhSDCktxhfwpgtxlAH + DG5EPoeDT8aPGSDYYh5U6QjbASUhvztjGPgA/Ue2x8QKwUklX7 + Xw == "; var message = "message"; var secret = Utilities.newBlob (Utilities.base64Decode (ключ)). GetDataAsString(); var signature = Utilities.base64Encode (Utilities.computeHmacSignature (Utilities.MacAlgorithm.HMAC_SHA_512, сообщение, секрет)); Logger.log (подпись); ' И результат: ' rbW61ipkR57jJOvFIhfeiAhBH/5cH9W2l/RtRGLCvFUeyl2iEN + yNnrubWjK4EcGyQkFbKpjhtCLgot/fV5LaQ == ' Таким образом, все больше и больше, кроме Node.js генерирует ... –

0

фильма выводы:

Результаты выглядят так же, как коды, когда используются другой ключ, - как Spencer писали. Но есть еще одна странная вещь. Давайте используем ключ Спенсера, чтобы убедиться, что оба кода будут работать. Когда мы хотим подписать сообщение с символами, отличными от ASCII, например. «Tomáš», коды будут давать и другие результаты!

Смежные вопросы