CryptoJS (HMAC Sha256) дает неверный вывод?


Позвольте мне начать с того, что я не эксперт в криптографических алгоритмах...

Я пытаюсь построить метод, который форматирует заголовок HTTP для Windows Azure - и этот заголовок требует, чтобы часть его сообщения была зашифрована через HMAC с SHA256 (а затем также закодирована base64).

Я решил использовать CryptoJS, потому что у него есть активное сообщество пользователей.

Во-первых, мой код:

_encodeAuthHeader : function (url, params, date) {
    //http://msdn.microsoft.com/en-us/library/windowsazure/dd179428
    var canonicalizedResource = '/' + this.getAccountName() + url;

    /*
     StringToSign = Date + "n" + CanonicalizedResource
     */
    var stringToSign = date + 'n' + canonicalizedResource;
    console.log('stringToSign >> ' + stringToSign)

    var encodedBits = CryptoJS.HmacSHA256(stringToSign, this.getAccessKey());
    console.log('encodedBits >> ' + encodedBits);

    var base64Bits = CryptoJS.enc.Base64.stringify(encodedBits);
    console.log('base64Bits >> ' + base64Bits);

    var signature = 'SharedKeyLite ' + this.getAccountName() + ':' + base64Bits;
    console.log('signature >> ' + signature);

    return signature;
},

Метод успешно возвращает "подпись" с соответствующим фрагментом зашифрованы и закодированы. Однако Azure жалуется, что он неправильно отформатирован.

Некоторые примеры вывода:

stringToSign >> Mon, 29 Jul 2013 16:04:20 GMTn/senchaazurestorage/Tables

encodedBits >> 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767

base64Bits >> ZyOs4ux7A0jhJwzLqrgCv6XBu93dEIrs6IxzkFGop2c=

signature >> SharedKeyLite senchaazurestorage:ZyOs4ux7A0jhJwzLqrgCv6XBu93dEIrs6IxzkFGop2c=

Выполняя некоторую отладку, я замечаю, что CryptoJS не возвращает то же самое значение (HMAC с SHA256), что и альтернативные реализации. Например, строка "Пн, 29 июля 2013 16: 04: 20 GMTn / senchaazurestorage / Tables " выглядит следующим образом:

  • "6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767 " через CryptoJS
  • "faa89f45ef029c63d04b8522d07c54024ae711924822c402b2d387d05398fc9f " через PHP hash_hmac ('sha256', ... )

Копая еще глубже, я вижу, что большинство алгоритмов HMAC / SHA265 возвращают данные, соответствующие выходным данным PHP... я что-то пропустил в CryptoJS? Или есть законная разница?

1 3

1 ответ:

Как я уже упоминал в своем первом комментарии, новая строка ("\n") вызывала проблемы. Избегание этого ("\ \n", без пространства между ними), кажется, исправило несоответствие в выходных данных HMAC/SHA256.

У меня по-прежнему возникают проблемы с заголовком "Authorization" Azure HTTP, но это уже другая проблема.