Передача хешированных данных в качестве ключа к хешу снова возвращает неверные результаты - PullRequest
0 голосов
/ 13 октября 2018

Я создаю сценарий для доступа к сервисам AWS с использованием GAS.Я использую функции хеширования в библиотеке утилит для всего хеширования, необходимого для создания подписи v4.Эти функции могут успешно хэшировать данные один раз, но попытка передать хэшированные данные в аргумент дает неверные результаты.Кто-нибудь еще сталкивался с этой проблемой и выяснил это?

Я знаю, что с Utilities.computeHmacSha256Signature (input, key) происходит что-то странное, потому что аргументы могут быть только байтовыми массивами илиструны, и я передаю в комбинации двух.Однако, когда я пытаюсь преобразовать аргументы в просто байтовые массивы или строки, мне все равно не везет.

Мой код генерации ключа ссылка на проект: ссылка

function getSignatureKey( key, dateStamp, regionName, serviceName ) {
  var kSecret = 'AWS4' + key;
  var kDate    = hash( dateStamp, kSecret );
  var kRegion  = hash( regionName,  kDate );
  var kService = hash( serviceName, kRegion );
  var kSigning = hash( 'aws4_request', kService );
  return kSigning;
}

Функция хеширования My:

function hash( payload, key ) {
  const utf8 = Utilities.Charset.UTF_8;
  const sha256 = Utilities.DigestAlgorithm.SHA_256;
  if ( !payload ) payload = '';

  if ( key ) {
    payload = Utilities.computeHmacSha256Signature( payload, key, utf8 );
  }
  else
    payload = Utilities.computeDigest( sha256, payload, utf8 );

  return  payload;
}

Примеры ввода

var key     = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY';
var date    = '20150830';
var region  = 'us-east-1';
var service = 'iam';

Ключ, сгенерированный из выборочных входов из ссылка

c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9

Пошаговые результаты Генерируется с помощью jsSHA

// kDate = HMAC( date, 'AWS4' + key )
0138c7a6cbd60aa727b2f653a522567439dfb9f3e72b21f9b25941a42f04a7cd

// kRegion = HMAC( region, kDate )
f33d5808504bf34812e5fade63308b424b244c59189be2a591dd2282c7cb563f

// kService = HMAC( service, kRegion )
199e1f48c602a5ae77ce26a46906920e76fc8427aeaa53da643646fcda1ccfb0

// kSigning = HMAC( 'aws4_request', kService ) -- matches example
c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9

Мои результаты Запуск результатов функции hash (), приведенной выше (через шестнадцатеричный кодировщик)

// var kSecret = 'AWS4' + key;
// var kDate    = hash( dateStamp, kSecret )
0138c7a6cbd60aa727b2f653a522567439dfb9f3e72b21f9b25941a42f04a7cd

// var kRegion  = hash( regionName,  kDate );
67a1e58cdd80d4ae0eab4345f1cac6e4faab10efb9c21fd7b30e5e9118462c79

// var kService = hash( serviceName, kRegion );
295384288c76cdb665c1cbf8281250b93b6ae257b98b72e4be0876a9e8a0b409

// var kSigning = hash( 'aws4_request', kService );
bfb393756c5518b668b5055910bb715e4a879c0e10bb22d3140b1e82b2a50a2c

1 Ответ

0 голосов
/ 14 октября 2018

Как насчет этой модификации?

Причина возникновения:

И value, и key из Utilities.computeHmacSha256Signature(value, key) имеют значение "String" или "Byte []".В вашем скрипте, когда запускается var kDate = hash( dateStamp, kSecret );, kDate - это байтовый массив.Но когда запускается var kRegion = hash( regionName, kDate );, regionName и kDate равны "String" и "Byte []" соответственно.Таким образом, после var kRegion = hash( regionName, kDate ); результат будет не таким, как у jsSHA.

Точки модификации:

  • Во избежание этого, например, преобразуйте строку"to" Byte [] ".

Модифицированный скрипт:

function sample() {
  var key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY';
  var dateStamp = '20150830';
  var regionName = 'us-east-1';
  var serviceName = 'iam';
  var kSecret = 'AWS4' + key;

  regionName = Utilities.newBlob(regionName).getBytes(); // Added
  serviceName = Utilities.newBlob(serviceName).getBytes(); // Added
  var value = Utilities.newBlob('aws4_request').getBytes(); // Added

  var kDate    = hash( dateStamp, kSecret );
  var kRegion  = hash( regionName,  kDate );
  var kService = hash( serviceName, kRegion );
  var kSigning = hash( value, kService );
  return kSigning;
}

function hash( payload, key ) {
  return Utilities.computeHmacSha256Signature(payload, key);
  // return Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, payload, key) // You can also use this.
}

Результат:

kDate: 0138c7a6cbd60aa727b2f653a522567439dfb9f3e72b21f9b25941a42f04a7cd
kRegion: f33d5808504bf34812e5fade63308b424b244c59189be2a591dd2282c7cb563f
kService: 199e1f48c602a5ae77ce26a46906920e76fc8427aeaa53da643646fcda1ccfb0
kSigning: c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9

Ссылки:

Если это не то, что вы хотите, извините.

...