[英]Python 3 sign a message with key sha512
我有以下代码行:
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
我当然已经尝试使用bytes()
和bytearray()
转换self.Secret
和message
,但是那也不起作用。
我也尝试过使用hashlib.sha512
生成密钥,但这对我来说还不是很清楚。 我有一个秘密的API密钥,需要用于签名POST数据,唯一明确的方法是使用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"
更改为其他某种编码。
hmac
哈希处理二进制密钥和数据。 在python2中, str
是8位字符的序列,可以与二进制互换,因此一切正常。 在python3中, str
是一串unicode字符,必须将其编码为二进制才能工作。 这应该工作:
return hmac.new(bytes(self.Secret.upper().encode('ascii')) , bytes(message.encode('ascii') , hashlib.sha512).digest().encode("base64").replace("\n","")
注意,我使用了ascii
编码,但这只是一个猜测。 您的python2字符串可能是您的本地代码页,并且您的消息可能已经是二进制blob。 您需要形式化使用哪种编码,以便接收者知道如何验证签名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.