Я боролся с этим часами. У меня есть следующий производственный код (проанализирован для простоты), который прекрасно работает в 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
После долгих исследований я понял, что hma c изменилось в 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?
Заранее спасибо!