在Python中使用字符串和密钥计算SHA哈希

59 投票
6 回答
91492 浏览
提问于 2025-04-15 13:45

亚马逊的产品API现在要求每次请求都要带上一个签名,我正在尝试用Python来生成这个签名。

我卡住的步骤是这个:

“使用上面的字符串和我们的‘虚拟’密钥:1234567890,计算一个符合RFC 2104标准的HMAC,使用SHA256哈希算法。关于这一步的更多信息,请查看你所用编程语言的文档和代码示例。”

给定一个字符串和一个密钥(在这个例子中是1234567890),我该如何用Python来计算这个哈希值呢?

----------- 更新 -------------

第一个使用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'

6 个回答

13

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成一种特定的格式,这个过程就叫做“解析”。

解析的过程就像是把一堆杂乱的东西整理成有序的东西。比如,你有一箱子玩具,里面有汽车、娃娃和积木。你想把它们分开,这样你就可以更容易地找到你想玩的玩具。解析就是把这些数据从混乱的状态变成有条理的状态。

在编程中,解析通常涉及到将文本转换成程序可以使用的对象,比如把一段JSON格式的数据转换成一个可以在代码中操作的对象。这就像把玩具从箱子里拿出来,放到桌子上,方便你随时拿取。

总之,解析就是把复杂的数据变得简单易用的过程,让程序能够更好地理解和处理这些数据。

>>> 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='
20
import hmac
import hashlib
import base64

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

我知道这听起来有点傻,但一定要确保你的秘密后面没有多余的空格哦。

111
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='

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答