繁体   English   中英

Python 3使用密钥sha512对消息进行签名

[英]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.Secretmessage ,但是那也不起作用。

我也尝试过使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM