Как я могу вычислить подпись API AWS (v4) в Python?
Я пытаюсь сгенерировать подпись для запроса на загрузку Amazon Glacier, используя примеры запросов и примеры функций, предоставленные в документации AWS, но не могу заставить ее работать. На данный момент я уверен, что упускаю что-то невероятно очевидное:
#!/bin/env python
import hmac
import hashlib
# This string to sign taken from: http://docs.amazonwebservices.com/amazonglacier/latest/dev/amazon-glacier-signing-requests.html#example-signature-calculation
sts = """AWS4-HMAC-SHA256
20120525T002453Z
20120525/us-east-1/glacier/aws4_request
5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743"""
# These two functions taken from: http://docs.amazonwebservices.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).hexdigest()
# The fake secret key is provided by the referenced docs
def getSignatureKey():
kDate = sign(("AWS4" + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY").encode('utf-8'), "20120525")
kRegion = sign(kDate, "us-east-1")
kService = sign(kRegion, "glacier")
kSigning = sign(kService, "aws4_request")
return kSigning
signature = sign(getSignatureKey(), sts)
print signature
Если я запускаю свою программу, я получаю следующий хеш:
$ python test.py
3431315da57da4df28f92895c75364d94b36c745896ad3e580c0a6ae403b1e05
Тем не менее, документы ясно заявляют:
Если используется секретный ключ доступа, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY, то вычисленная сигнатура:
3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a
Что мне не хватает?
1 ответ
Ваша функция отличается от их в одном отношении. Ты делаешь
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).hexdigest()
но они делают
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
Так что ваш производный ключ неверен. Вы хотите использовать hexdigest только на последнем шаге процесса, а не при расчете ключа подписи.