【发布时间】:2020-08-17 11:55:39
【问题描述】:
我已经为此苦苦挣扎了好几个小时。我有以下在 Python 2.7 中运行良好的生产代码(为简单起见已解析):
import hashlib
import hmac
string1 = 'firststring'
string2 = 'secondstring'
digest = hmac.new(key=string1, msg=string2, digestmod=hashlib.sha256).digest()
print('hmac_digest = ' + digest) # digest is a string
输出是这样的字符串:
hmac_digest = �!�Ni��I.u�����x�l*>a?. �
但是当我用 Python3.7 运行它时,我得到以下错误:
Traceback (most recent call last):
File "/home/xxxx/work/py23.py", line 7, in <module>
digest = hmac.new(key=string1, msg=string2, digestmod=hashlib.sha256).digest()
File "/usr/lib/python3.7/hmac.py", line 153, in new
return HMAC(key, msg, digestmod)
File "/usr/lib/python3.7/hmac.py", line 49, in __init__
raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'
Process finished with exit code 1
经过大量研究,我了解到 hmac 在 3.4 及更高版本中发生了变化。因此,我将代码重新编写为以下内容:
import hashlib
import hmac
import base64
string1 = 'firststring'
string2 = 'secondstring'
digest = hmac.new(key=string1.encode('utf-8'), msg=string2.encode('utf-8'), digestmod=hashlib.sha256).digest()
digest = base64.encodebytes(digest).decode('utf-8') # need to convert to string
print('hmac_digest = ' + digest)
但我得到的输出完全不同!
hmac_digest = 5CEZhgMDTmmFxkkudbGPxaLSytl4+gdsKj4PYT8uAJk=
如何正确将此代码移植到 python3.7,以便获得与 2.7 完全相同的输出?
提前致谢!
【问题讨论】: