2009-08-20 6 views
36

Amazon Product API nécessite désormais une signature avec chaque requête que j'essaye de générer en utilisant Python.Calcul d'un hachage SHA avec une chaîne + clé secrète en python

L'étape que je vous attardez sur est celui-ci:

« Calculer une RFC 2104 conforme HMAC avec l'algorithme de hachage SHA256 utilisant la chaîne ci-dessus avec notre « factice » Secret Access Key: 1234567890. Pour plus d'informations à propos de cette étape, consultez la documentation et les 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 à l'aide de Python?

----------- ------------- MISE À JOUR

La première solution en utilisant HMAC.new semble correct mais je reçois un résultat différent qu'ils sont.

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'

+0

Vous pouvez trouver celui-ci utile. L'algorithme de signature d'une requête REST à Amazon est décrit dans [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

Répondre

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

Merci. Cela semble correct, mais je ne donne pas les mêmes résultats que Amazon. Voir la mise à jour ci-dessus. – mymmaster

+0

Leur hachage ressemble à son encodage en base64. – Eli

+0

C'est exactement ça. Nécessaire pour encoder en base64. Merci. – mymmaster

2

De http://docs.python.org/library/hashlib.html#module-hashlib (modifié un peu):

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

# Get string and put into givenString. 

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

Argh! J'avais 8 secondes trop tard! ;) –

+1

Vous devrez peut-être installer py25-hashlib. J'ai essayé de tester ce code sur Python 2.5.4 (5 mars 2009) mais j'ai obtenu 'ImportError: aucun module nommé _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

Véritable maître des solutions ... –

6
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 stupide, mais assurez-vous que vous ne disposez pas d'un espace de fin sur votre secret par accident.