2009-08-20 5 views
36

Amazon Product API erfordert jetzt eine Signatur mit jeder Anfrage, die ich versuche, Python Python zu generieren.Berechnung eines SHA-Hash mit einem String + geheimen Schlüssel in Python

Der Schritt, den ich auf aufgehängt bekommen, ist dieses:

„RFC-2104-konformen HMAC mit dem SHA256 Hash-Algorithmus Berechnen Sie die Zeichenfolge oben mit unserem mit‚Dummy‘Secret Access Key: 1234567890. Weitere Informationen Informationen zu diesem Schritt finden Sie in der Dokumentation und den Codebeispielen für Ihre Programmiersprache. "

Gegeben eine Zeichenfolge und einen geheimen Schlüssel (in diesem Fall 1234567890) wie berechne ich diesen Hash mit Python?

----------- ------------- UPDATE

Die erste Lösung HMAC.new mit korrekt aussieht aber ich bin ein anderes Ergebnis bekommen als sie sind.

http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html

Laut Amazon Beispiel, wenn Sie den geheimen Schlüssel 1234567890 und die folgende Zeichenfolge Hash

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 

Sie sollten die folgende Signatur erhalten: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='

ich dies immer: '411a59403c9f58b4a434c9c6a14ef6e363acc1d1bb2c6faf9adc30e20898c83b'

+0

Sie können dieses eine nützlich finden. Der Algorithmus zum Signieren einer REST-Anforderung an Amazon wird in [http://stackoverflow.com/questions/1088715/how-to-sign-amazon-web-service-requests-from-the-python-app-engine/ beschrieben. 1343917 # 1343917] (http://stackoverflow.com/questions/1088715/how-to-sign-amazon-web-service-requests-from-the-python-app-engine/1343917#1343917) – alsan

Antwort

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

Danke. Das sieht korrekt aus, aber ich erziele nicht die gleichen Ergebnisse wie Amazon. Siehe das obige Update. – mymmaster

+0

Ihr Hash sieht aus wie es ist Base64 codiert. – Eli

+0

Genau das ist es. Zum Codieren in base64 benötigt. Vielen Dank. – mymmaster

2

Von http://docs.python.org/library/hashlib.html#module-hashlib (etwas modifiziert):

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

# Get string and put into givenString. 

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

Argh! Ich war 8 Sekunden zu spät! ;) –

+1

Möglicherweise müssen Sie py25-hashlib installieren. Ich habe versucht, diesen Code auf Python 2.5.4 (5. März 2009) zu testen, habe aber 'ImportError: Kein Modul namens _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

Echter Meister der Lösungen ... –

6
import hmac 
import hashlib 
import base64 

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

Ich weiß, das albern klingt, aber stellen Sie sicher, dass Sie nicht über einen hinteren Platz auf Ihrem Geheimnis zufällig haben.