用python中的string+密钥计算SHA哈希
亚马逊产品API现在需要每个请求的签名,我试图生成使用Python的Python。
我挂上的这一步是这样的:
“使用上面的string和我们的”虚拟“秘密访问密钥:1234567890,使用SHA256哈希algorithm计算符合RFC 2104的HMAC。有关此步骤的更多信息,请参阅您的编程语言的文档和代码示例。
给定一个string和一个秘密密钥(在本例中为1234567890),如何使用Python计算这个散列?
———–更新————-
使用HMAC.new的第一个解决scheme看起来是正确的,但是我得到了不同的结果。
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html
根据亚马逊的例子,当你散列密钥1234567890和下面的string
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'
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='
>>> 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='
import hmac import hashlib import base64 digest = hmac.new(secret, msg=thing_to_hash, digestmod=hashlib.sha256).digest() signature = base64.b64encode(digest).decode()
我知道这听起来很愚蠢,但要确保你的秘密不会有偶然的空间。
从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()
我对这个秘密钥匙非常困惑。 那不是RSA的私钥,对吧? 如果是的话,所以这只是一个哈希algorithm而不是数字签名algorithm,对不对?
因为我认为数字签名algorithm需要RSA私钥。