Не может имитировать алгоритм подписи Amazon Web Services - PullRequest
1 голос
/ 30 ноября 2011

Я очень расстраиваюсь, когда люди и компании не предоставляют надежную документацию для своих продуктов.

По данным этого сайта: 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, но этоэто радикально изменить.Кто-нибудь знает, какой алгоритм они могли использовать для создания этого хэша?У меня нет идей.

1 Ответ

2 голосов
/ 30 ноября 2011

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

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

Как говорится, вам нужно использовать 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);
...