Amazon Product API nécessite désormais une signature avec chaque demande que j'essaie de générer en utilisant Python.
L'étape à laquelle je suis suspendu est celle-ci:
"Calculez un HMAC conforme à la RFC 2104 avec l'algorithme de hachage SHA256 en utilisant la chaîne ci-dessus avec notre clé d'accès secrète" factice ": 1234567890. Pour plus d'informations sur cette étape, consultez la documentation et des exemples de code pour votre langage de programmation."
Étant donné une chaîne et une clé secrète (dans ce cas 1234567890), comment puis-je calculer ce hachage en utilisant Python?
----------- MISE À JOUR -------------
La première solution utilisant HMAC.new semble correcte mais j'obtiens un résultat différent d'eux.
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html
Selon l'exemple d'Amazon lorsque vous hachez la clé secrète 1234567890 et la chaîne suivante
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
Vous devriez obtenir la signature suivante: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='
Je reçois ceci: '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()
Je sais que cela semble idiot, mais assurez-vous que vous n'avez pas d'espace de fuite sur votre secret par accident.
De http://docs.python.org/library/hashlib.html#module-hashlib (un peu modifié):
import hashlib
secretKey = "1234567890"
m = hashlib.sha256()
# Get string and put into givenString.
m.update(givenString + secretKey)
m.digest()
Si vous essayez d'inscrire un utilisateur à AWS cognito à l'aide de Python3, vous pouvez utiliser le code suivant.
#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()
Le nom d'utilisateur nom_utilisateur ci-dessus est le même que l'utilisateur que vous souhaitez enregistrer dans le 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
},
]