I had a script in Python2 that was working great.
def _generate_signature(data): return hmac.new('key', data, hashlib.sha256).hexdigest()
Where data was the output of json.dumps
.
Now, if I try to run the same kind of code in Python 3, I get the following:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.4/hmac.py", line 144, in new return HMAC(key, msg, digestmod) File "/usr/lib/python3.4/hmac.py", line 42, in __init__ raise TypeError("key: expected bytes or bytearray, but got %r" %type(key).__name__) TypeError: key: expected bytes or bytearray, but got 'str'
If I try something like transforming the key to bytes like so:
bytes('key')
I get
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: string argument without an encoding
I'm still struggling to understand the encodings in Python 3.
You can use bytes literal: b'key'
def _generate_signature(data): return hmac.new(b'key', data, hashlib.sha256).hexdigest()
In addition to that, make sure data
is also bytes. For example, if it is read from file, you need to use binary
mode (rb
) when opening the file.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With