2009-08-20 108 views
36

Amazon Product API现在需要对每个要尝试生成使用Python的请求进行签名。使用python中的字符串+密钥计算SHA哈希值

的一步,我先挂了上是这个:1234567890欲了解更多信息:

假的‘秘密访问键“使用上面我们的字符串计算符合RFC 2104-HMAC与SHA256散列算法’关于这一步,请参阅您的编程语言的文档和代码示例。“

给定一个字符串和一个密钥(本例中为1234567890)如何使用Python计算这个哈希值?

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

使用HMAC.new第一个解决方案看起来是正确的但是我得到不同的结果比他们多。

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

据亚马逊的例子,当你哈希密钥1234567890和下面的字符串

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

你可以找到这个有用的。 向亚马逊签名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 2009-08-28 14:53:02

回答

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

谢谢。这看起来是正确的,但我没有像亚马逊那样得到同样的结果。看到上面的更新。 – mymmaster 2009-08-20 15:38:19

+0

他们的哈希看起来像是base64编码。 – Eli 2009-08-20 16:50:44

+0

就是这样。需要在base64中进行编码。谢谢。 – mymmaster 2009-08-20 17:07:02

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

啊!我太迟了8秒! ;) – 2009-08-20 14:28:18

+1

你可能需要安装py25-hashlib。我试图在Python 2.5.4(2009年3月5日)上测试这段代码,但得到了'ImportError:No module named _md5'。 – 2009-08-20 14:31:26

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

真正的解决方案大师... – 2015-03-11 03:07:45

6
import hmac 
import hashlib 
import base64 

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

我知道这听起来很愚蠢,但要确保你没有意外对你的秘密尾随空间。