Ответ 1
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='
API-интерфейс Amazon API теперь требует подписи с каждым запросом, который я пытаюсь создать с помощью Python.
Шаг, который я повесил, следующий:
"Рассчитайте HMAC, совместимый с RFC 2104, с помощью хэш-алгоритма SHA256, используя строку выше с нашим ключом секретного доступа "dummy": 1234567890. Дополнительные сведения об этом шаге см. в документации и примерах кода для вашего языка программирования".
Для строки и секретного ключа (в данном случае 1234567890), как вычислить этот хэш с помощью Python?
----------- UPDATE -------------
Первое решение с использованием HMAC.new выглядит правильно, но я получаю другой результат, чем они.
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html
Согласно примеру Amazon, когда вы используете hash секретный ключ 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'
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='
>>> 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='
import hmac
import hashlib
import base64
digest = hmac.new(secret, msg=thing_to_hash, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
Я знаю, что это звучит глупо, но убедитесь, что у вас нет случайного пробела в вашей тайне.
От 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()
Я очень смущен этим секретным ключом. Это не секретный ключ RSA, верно? Если да, то это всего лишь алгоритм хеширования, а не алгоритм цифровой подписи, правильно?
потому что я считаю, что для алгоритма цифровой подписи нужен секретный ключ RSA.
Если вы пытаетесь зарегистрировать пользователя в AWS cognito с помощью Python3, вы можете использовать следующий код.
#For the SecretHash
import hmac
import hashlib
import base64
//Please note that the b in the secretKey and encode('utf-8') are really really important.
secretKey = b"secret key that you get from Coginito -> User Pool -> General Settings -> App Clients-->Click on Show more details -> App client secret "
clientId = "Coginito -> User Pool -> General Settings -> App Clients-->App client id"
digest = hmac.new(secretKey,
msg=(user_name + clientId).encode('utf-8'),
digestmod=hashlib.sha256
).digest()
secrethash = base64.b64encode(digest).decode()
Имя пользователя user_name в приведенном выше совпадает с пользователем, которого вы хотите зарегистрировать в Cognito.
client = boto3.client('cognito-idp', region_name='eu-west-1' )
response = client.sign_up(
ClientId='Coginito -> User Pool -> General Settings -> App Clients-->App client id',
Username='Username of the person you are planning to register',
Password='Password of the person you are planning to register',
SecretHash=secrethash,
UserAttributes=[
{
'Name': 'given_name',
'Value': given_name
},
{
'Name': 'family_name',
'Value': family_name
},
{
'Name': 'email',
'Value': user_email
}
],
ValidationData=[
{
'Name': 'email',
'Value': user_email
},
]