2009-08-20 3 views
36

API-интерфейс Amazon API теперь требует подписи с каждым запросом, который я пытаюсь сгенерировать с помощью Python.Вычисление SHA-хэша со строкой + секретный ключ в python

Стадию я зацикливаться на это один:

«Вычислить RFC 2104-совместимый HMAC с помощью алгоритма SHA256 хэш с помощью строки выше нашего„фиктивного“Secret Access Key: 1234567890. Для получения более подробной информации об этом шаге см. документацию и примеры кода для вашего языка программирования ».

Учитывая строку и секретный ключ (в данном случае 1234567890), как вычислить этот хэш с помощью Python?

----------- UPDATE -------------

Первое решение с использованием HMAC.new выглядит правильно, однако я получаю другой результат чем они есть.

http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html

Согласно примеру Amazon, когда вы хэширования секретный ключ 1234567890 и следующую строку

GET 
webservices.amazon.com 
/onca/xml 
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I 
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview 
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z& 
Version=2009-01-06 

Вы должны получить следующую подпись: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='

Я получаю это: '411a59403c9f58b4a434c9c6a14ef6e363acc1d1bb2c6faf9adc30e20898c83b'

+0

Вы можете найти это полезным. Алгоритм подписания запроса REST на Amazon описан в [http://stackoverflow.com/questions/1088715/how-to-sign-amazon-web-service-requests-from-the-python-app-engine/ 1343917 # 1343917] (http://stackoverflow.com/questions/1088715/how-to-sign-amazon-web-service-requests-from-the-python-app-engine/1343917#1343917) – alsan

ответ

77
import hmac 
import hashlib 
import base64 
dig = hmac.new(b'1234567890', msg=your_bytes_string, digestmod=hashlib.sha256).digest() 
base64.b64encode(dig).decode()  # py3k-mode 
'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=' 
+0

Спасибо. Это выглядит правильно, но я не уступаю тем же результатам, что и Amazon. См. Обновление выше. – mymmaster

+0

Их хэш выглядит так, как будто он закодирован в base64. – Eli

+0

Это точно. Нужно кодировать в base64. Благодарю. – mymmaster

2

От http://docs.python.org/library/hashlib.html#module-hashlib (изменено немного):

import hashlib 
secretKey = "1234567890" 
m = hashlib.sha256() 

# Get string and put into givenString. 

m.update(givenString + secretKey) 
m.digest() 
+0

Argh! Мне было 8 секунд слишком поздно! ;) –

+1

Возможно, вам понадобится установить py25-hashlib. Я попытался проверить этот код на Python 2.5.4 (5 марта 2009 г.), но получил 'ImportError: Нет модуля с именем _md5'. –

10
>>> import hmac 
>>> import hashlib 
>>> import base64 
>>> s = """GET 
... webservices.amazon.com 
... /onca/xml 
... AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06""" 
>>> base64.b64encode(hmac.new("1234567890", msg=s, digestmod=hashlib.sha256).digest()) 
'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=' 
+0

Настоящий мастер решений ... –

6
import hmac 
import hashlib 
import base64 

digest = hmac.new(secret, msg=thing_to_hash, digestmod=hashlib.sha256).digest() 
signature = base64.b64encode(digest).decode() 

Я знаю, что это звучит глупо, но убедитесь, что вы не косые мест на тайне случайно.

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