2009-08-20 15 views
36

Interfejs API produktu Amazon wymaga teraz podpisu przy każdym żądaniu, które próbuję wygenerować, używając Pythona.Obliczanie skrótu SHA z ciągiem + tajny klucz w pythonie

Etap I się powiesił na to jest jedna:

„Oblicz RFC 2104 zgodny z algorytmem HMAC SHA256 hash używając ciąg powyżej naszej«manekina»Secret Access Key: 1234567890. Więcej informacji o tym kroku, zobacz dokumentację i próbki kodu dla twojego języka programowania. "

Biorąc pod uwagę ciąg i tajny klucz (w tym przypadku 1234567890), jak obliczyć ten skrót za pomocą Python?

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

Pierwsze rozwiązanie używając HMAC.new wygląda poprawnie jednak dostaję inny wynik niż oni są.

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

Według przykład Amazon podczas mieszania tajnego klucza 1234567890 i następujący ciąg

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 

Powinieneś otrzymać następujący podpis: 'Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg='

jestem coraz to: '411a59403c9f58b4a434c9c6a14ef6e363acc1d1bb2c6faf9adc30e20898c83b'

+0

Ten produkt może być przydatny. Algorytm podpisywania żądania REST do Amazon opisano w [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-od-python-app-engine/1343917#1343917) – alsan

Odpowiedz

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

Dzięki. To wygląda na poprawne, ale nie daję takich samych wyników jak Amazon. Zobacz aktualizację powyżej. – mymmaster

+0

Ich mieszanie wygląda na zakodowane w base64. – Eli

+0

To dokładnie to. Potrzebne do kodowania w base64. Dzięki. – mymmaster

2

Od http://docs.python.org/library/hashlib.html#module-hashlib (zmodyfikowane nieco):

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

# Get string and put into givenString. 

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

Argh! Byłem 8 sekund za późno! ;) –

+1

Może być konieczne zainstalowanie py25-hashlib. Próbowałem przetestować ten kod w Pythonie 2.5.4 (5 marca 2009), ale otrzymałem polecenie 'ImportError: No module named _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

Prawdziwy mistrz rozwiązań ... –

6
import hmac 
import hashlib 
import base64 

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

Wiem, że to brzmi głupio, ale upewnij się, że nie mają miejsca spływu na swojej tajemnicy przez przypadek.

Powiązane problemy