Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python3 and hmac . How to handle string not being binary

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.

like image 450
Aquiles Carattino Avatar asked Aug 06 '15 06:08

Aquiles Carattino


1 Answers

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.

like image 115
falsetru Avatar answered Oct 04 '22 20:10

falsetru