我有以下代码行:
return hmac.new(self.Secret.upper() , message , hashlib.sha512).digest().encode("base64").replace("\n","")
这在Python2中很好,但在Python 3中不行。当我尝试使用Python 3时,我得到:
TypeError: key: expected bytes or bytearray, but got 'str'
从
hmac.py
开始。当然,我尝试过使用self.Secret
和message
转换bytes()
和bytearray()
,但也没有成功。我也试过使用
hashlib.sha512
来生成密钥,但我不太清楚。我有一个需要用来对POST数据进行签名的秘密API密钥,唯一明确的方法是使用hmac.new()
,但是当我最终得到可以作为字符串传递的东西时,它看起来不像应该的那样,而且正如预期的那样,我无法用它进行身份验证。另一个尝试是:
sign = hashlib.sha512(message_to_sign)
sign.update(self.Secret.upper())
这还会生成一个字符串,它看起来与来自Python 2.7中原始代码的工作密钥完全不同。
我也尝试过很多其他的变化,但没有一个给我任何有用的东西。
最佳答案
这一个适用于python 3.4.2:
print((base64.b64encode(hmac.new(bytearray("SECRET".upper(), "ASCII") , bytearray("TEST","ASCII") , hashlib.sha512).digest())).decode("ASCII").replace("\n", ""))
…并计算出正确的HMAC。
您可能需要将
"ASCII"
更改为其他编码。