2015-08-06 11 views
19

Avevo uno script in Python2 che funzionava alla grande.Python3 e hmac. Come gestire la stringa non essendo binario

def _generate_signature(data): 
    return hmac.new('key', data, hashlib.sha256).hexdigest() 

Dove data era l'uscita di json.dumps.

Ora, se provo a eseguire lo stesso tipo di codice in Python 3, ottengo il seguente:

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' 

Se provo qualcosa come trasformare la chiave per byte in questo modo:

bytes('key') 

ottengo

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string argument without an encoding 

che sto ancora lottando per capire le codifiche in Python 3.

risposta

18

È possibile utilizzare bytes letterale: b'key'

def _generate_signature(data): 
    return hmac.new(b'key', data, hashlib.sha256).hexdigest() 

In aggiunta a ciò, assicurarsi che sia data byte anche. Ad esempio, se viene letto dal file, è necessario utilizzare la modalità binary (rb) all'apertura del file.

+1

come posso usare byte letterale per un param? –

+0

Con il prefisso 'b' davanti alla stringa letterale. ''chiave'': stringa,' b'key'': byte. – falsetru

8

Non far risorgere una vecchia questione ma volevo aggiungere qualcosa che sento che manca da questa risposta, a cui ho avuto problemi a trovare un adeguato spiegazione/esempio di altrove:

OP Aquiles Carattino era abbastanza vicino con il suo tentativo di convertire la stringa in byte, ma mancava il secondo argomento, la codifica della stringa da convertire in byte.

Se qualcuno vorrebbe convertire una stringa in byte attraverso altri mezzi di assegnazione statica (come ad esempio la lettura da un file di configurazione o di un DB), il seguente dovrebbe funzionare:

import hmac, hashlib 

def _generate_signature(data): 
    key = 'key' # Defined as a simple string. 
    key_bytes= bytes(key , 'latin-1') 
    data_bytes = bytes(data, 'latin-1') # Assumes `data` is also a string. 
    return hmac.new(key_bytes, data_bytes , hashlib.sha256).hexdigest() 

print(
    _generate_signature('this is my string of data') 
) 
Problemi correlati