2011-11-30 2 views
1

Я очень расстраиваюсь, когда люди & компании не предоставляют надежную документацию для своих продуктов.Невозможно Mimic Amazon Web Services Signature Algorithm

Согласно этому сайту: http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

Существует алгоритм, который выглядит примерно так:

import base64 
import hmac 
import sha 
import urllib 
h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV", 
      "GET\n\n\n1141889120\n/quotes/nelson", 
      sha) 
urllib.quote_plus(base64.encodestring(h.digest()).strip()) 

Который должен произвести результат:

vjbyPxybdZaNmGa%2ByT272YEAiv4%3D 

Я пытался несколько вариации, разные кодировки и разные языки, и я не могу создать этот хеш. Я даже загрузил некоторые образцы, и когда я использую их алгоритмы подписи, они все равно не производят этот хеш. Вот код # C У меня есть:

byte[] bytesToSign = Encoding.UTF8.GetBytes("GET\n\n\n1141889120\n/quotes/nelson"); 
    byte[] secretKeyBytes = Encoding.UTF8.GetBytes("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV"); 
    HMAC hmacSha256 = new HMACSHA256(secretKeyBytes); 
    byte[] hashBytes = hmacSha256.ComputeHash(bytesToSign); 
    string signature = Convert.ToBase64String(hashBytes); 

Но он производит значение:

a5n2tpQTlqetX6Pjvv7vK23qi2JIZVlWZqIdteD2pok= 

Да, я могу видеть, что они, окружив его с URL-кодировщика, но это не изменило бы его это кардинально. Кто-нибудь знает, какой алгоритм они могли использовать для создания этого хэша? У меня нет идей.

ответ

2

Ваш код C#, используя неправильный алгоритм хеширования HMAC. Из документации Амазонки:

«хэш-функция для вычисления подписи является HMAC-SHA1 определено в RFC 2104 (http://www.ietf.org/rfc/rfc2104.txt), используя ваш Secret доступа Ключ как ключ. "

Как говорится, вам нужно использовать SHA-1 вместо SHA-256:

var bytesToSign = Encoding.UTF8.GetBytes("GET\n\n\n1141889120\n/quotes/nelson"); 
var secretKeyBytes = 
    Encoding.UTF8.GetBytes("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV"); 
var hmacSha1 = new HMACSHA1(secretKeyBytes); 
var hashBytes = hmacSha256.ComputeHash(bytesToSign); 
var signature = Convert.ToBase64String(hashBytes); 
+1

тьфу. Спасибо. Я использовал HMAC-SHA256 из-за этого: «Вы можете использовать HMAC-SHA256, когда подписываете запрос (мы предпочитаем HMAC-SHA256, но мы по-прежнему поддерживаем HMAC-SHA1)» на: http://aws.amazon.com/ articles/1928 –

+0

Причина, по которой она не работает, находится в том же документе: вы должны установить параметр запроса SignatureMethod либо HmacSHA256, либо HmacSHA1, чтобы указать, какой метод подписки вы используете. Вы должны установить параметр запроса SignatureVersion равным 2 –

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