Вычисление SHA-хеша с помощью строки + секретного ключа в Python - PullRequest
43 голосов
/ 20 августа 2009

API продуктов Amazon теперь требуется подпись с каждым запросом, который я пытаюсь сгенерировать, используя Python.

Шаг, на котором я зацикливаюсь, следующий:

"Рассчитать HMAC, совместимый с RFC 2104, с помощью алгоритма хеширования SHA256, используя приведенную выше строку с нашим" фиктивным "секретным ключом доступа: 1234567890. Для получения дополнительной информации об этом шаге см. Документацию и примеры кода для вашего языка программирования."

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

----------- ОБНОВЛЕНИЕ -------------

Первое решение с использованием 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'

Ответы [ 4 ]

93 голосов
/ 20 августа 2009
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='
11 голосов
/ 28 августа 2012
import hmac
import hashlib
import base64

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

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

11 голосов
/ 20 августа 2009
>>> 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='
3 голосов
/ 20 августа 2009

С 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()
...