6

В настоящее время я работаю со скриптом Google Apps, и я пытаюсь написать &, подписывая HTTP-запрос на AWS CloudWatch.Двоичный вывод из Google Script HMAC encription

В документации по API Amazon here относительно того, как создать ключ подписи, они используют псевдо, чтобы объяснить, что алгоритм HMAC должен возвращать двоичный формат.

HMAC(key, data) represents an HMAC-SHA256 function 
that returns output in binary format. 

Google Apps Script предлагает способ сделать такой хэш,

Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
              data, 
              key); 

но возвращаемый тип всегда байтовый массив.

Byte[] 

Как преобразовать Byte [] в бинарные данные AWS? Или есть функция javascript в ваниле, которую я могу использовать в скрипте Google Apps для вычисления хэша?

Благодаря

+1

Вы пробовали конвертировать в String сначала (из Byte []), а затем, чтобы преобразовать его в Binary было проще? – Rpranata

+0

Да, я пробовал это, преобразовывая Byte [] в blob, а затем считывая данные как строку, которая должна быть передана в следующую итерацию хэширования, но безрезультатно – user2495753

ответ

1

Преобразование из массива байтов в двоичных данных, требуемых должны быть простыми:

kDate = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      '20130618', 'AWS4' + kSecret); 
kDate = Utilities.newBlob(kDate).getDataAsString(); 
kRegion = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      'eu-west-1', kDate); 

НО вы должны смотреть на this open issue in the bugtracker - там могут быть некоторые проблемы в преобразовании.

может быть, вы могли бы попытаться сделать String.fromCharCode() петлю и избежать негативного numers:

kDateB = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      '20130618', 'AWS4' + kSecret); 
kDate = ''; 
for (var i=0; i<kDateB.length; i++) 
    kDate += String.fromCharCode(kDateB[i]<0?256+kDateB[i]:0+kDateB[i]); 
kRegion = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, 
      'eu-west-1', kDate); 
+0

Благодарим за ответ. Это определенно расстраивает. Я сделал комментарий к bugtracker, поэтому, надеюсь, это заставит команду google хотя бы ответить и дать обновление этой известной проблеме. – user2495753

+0

Вы попробовали опцию'String.fromCharCode'? Кажется, что проблема возникает с отрицательными байтовыми значениями. Добавление 256 к ним должно решить проблему. – Taras

+0

Я попытался сделать это и избавиться от отрицательных значений, добавив 256, но, к сожалению, я все еще получаю неверный результат. Google сказал, что это известная проблема и работает над ней, но они также заявили, что в настоящее время обновление этой ошибки отсутствует. – user2495753

2

Я совершенно уверен, что это ошибка, что Utilities.computeHmacSignature взять ключ в виде ASCII. Но не было никакого способа разбора байт [], чтобы правильно ASCII в ГАС

И библиотека писатель слишком глуп, слишком просто обеспечивают функцию, которая взять ключ в виде байт []

Поэтому я использую вместо этого: http://caligatio.github.com/jsSHA/

Просто скопируйте SHA.js и SHA-256.js, тогда он отлично работает

PS. это тратит мое время на целые 2 дня, поэтому я очень раздражаю

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