2009-08-20 9 views
36

Amazon Product APIでは、私がPythonを使用しようとしているすべてのリクエストで署名が必要になりました。Pythonで文字列+秘密鍵を使用してSHAハッシュを計算する

私は上のハングアップを取得する工程である1本:1234567890詳細:

はダミー 『秘密アクセスキー「私たちのして上に文字列を使用してSHA256ハッシュアルゴリズムでRFC 2104準拠のHMACを計算します』この手順については、プログラミング言語のドキュメントとコードサンプルを参照してください。

文字列と秘密鍵(この場合は1234567890)が与えられていると、このハッシュはPythonを使ってどのように計算されますか?

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

HMAC.newを使用して最初のソリューションは、しかし、私は別の結果を得ている正しく見えます彼らよりも。あなたが秘密鍵1234567890と次の文字列をハッシュする際、Amazonの例によれば

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

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'

+0

これは便利です。 AmazonへのRESTリクエストに署名するアルゴリズムは、[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

答えて

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

ありがとうございます。これは正しく見えますが、私はAmazonと同じ結果を得ていません。上記のアップデートを参照してください。 – mymmaster

+0

ハッシュはbase64でエンコードされているようです。 – Eli

+0

それはまさにそれです。 base64でエンコードする必要があります。ありがとう。 – mymmaster

2

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() 
+0

Argh!私は8秒遅すぎた! ;) –

+1

py25-hashlibをインストールする必要があるかもしれません。私はこのコードをPython 2.5.4(2009年3月5日)でテストしようとしましたが、 '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

ソリューションの本当のマスター... –

6
import hmac 
import hashlib 
import base64 

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

私はこれが愚かな音を知っていますが、事故によってあなたの秘密の末尾にスペースがないことを確認してください。