我有以下代码行:

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.Secretmessage转换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"更改为其他编码。

09-11 21:42