Не могу имитировать алгоритм подписи веб -сервисов Amazon
-
25-10-2019 - |
Вопрос
Я становлюсь чрезвычайно разочарованным, когда люди и компании не предоставляют надежную документацию для своих продуктов.
Согласно этому сайту: 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 -энкодера, но это не изменит его так резко. Есть ли у кого -нибудь представление о том, какой алгоритм они, возможно, использовали для создания этого хэша? У меня нет идей.
Решение
Ваш код 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);