Hash MD5 in Python
Questo articolo dimostrerà come usare l’hash MD5 usando il modulo Python hashlib
.
Cos’è l’hashish?
Un hash è una funzione che prende dati di lunghezza variabile e li converte in una lunghezza fissa. Il valore restituito da una funzione hash è chiamato valore hash, codice hash o digest. I valori hash vengono solitamente utilizzati per indicizzare una tabella di dimensioni fisse denominata tabella hash.
Cos’è MD5?
L’algoritmo di digest dei messaggi MD5 è una popolare funzione hash che produce un valore hash a 128 bit. Inizialmente progettato come funzione di hash crittografico, ora è comunemente utilizzato per verificare l’integrità dei dati a causa di molteplici problemi di sicurezza e vulnerabilità.
Modulo hashlib
Python
La libreria standard di Python consiste in un modulo che implementa molti diversi algoritmi di hash sicuro e message digest chiamati hashlib
. Può anche includere algoritmi aggiuntivi disponibili a seconda della libreria OpenSSL che Python utilizza sulla tua piattaforma.
Per utilizzare gli algoritmi di hashing, importa il modulo hashlib
.
import hashlib
Ora possiamo usare gli algoritmi di hashing supportati da questo modulo. Per controllare gli algoritmi hash disponibili nell’interprete Python in esecuzione, utilizzare l’attributo costante algorithms_available
.
import hashlib
print(hashlib.algorithms_available)
Produzione:
{'md5', 'blake2s', 'sha256', 'sha384', 'sha3_512', 'blake2b', 'md4', 'md5-sha1', 'sha512_224', 'sha224', 'sha3_224', 'ripemd160', 'sha3_256', 'shake_256', 'sm3', 'shake_128', 'sha3_384', 'sha1', 'sha512_256', 'whirlpool', 'sha512'}
L’elenco sopra sono gli algoritmi disponibili in hashlib
, inclusi gli algoritmi disponibili di OpenSSL
Per verificare gli algoritmi hash garantiti per essere supportati su tutte le piattaforme da questo modulo, utilizzare l’attributo costante algorithms_guaranteed
.
import hashlib
print(hashlib.algorithms_guaranteed)
Produzione:
{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}
Nota: md5
è nella lista di algorithms_guaranteed
, ma alcuni fornitori upstream conformi a FIPS offrono una build Python che lo esclude.
Usa l’algoritmo MD5 in Python
Per utilizzare l’algoritmo md5, utilizzeremo il costruttore md5()
e alimenteremo l’oggetto hash con oggetti simili a byte utilizzando il metodo update()
o passeremo i dati come parametro del costruttore.
Per ottenere il valore hash, utilizzare il metodo digest()
, che restituisce un digest dell’oggetto bytes
dei dati inviati all’oggetto hash.
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.digest())
Produzione:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
Puoi anche passare i dati come parametro al costruttore e ottenere il valore hash
import hashlib
print(hashlib.md5(b"Hello World").digest())
Produzione:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
Simile al metodo digest()
, puoi anche usare hexdigest()
, che restituisce un oggetto stringa del digest contenente solo cifre esadecimali.
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.hexdigest())
Produzione:
b10a8db164e0754105b7a99be72e3fe5
Notare che c’è una b
prima della stringa letterale passata al metodo update()
. Viene utilizzato per creare un’istanza di tipo bytes
anziché di tipo str
. Poiché la funzione di hashing accetta solo una sequenza di byte come parametro. Il passaggio di oggetti stringa al metodo update()
non è supportato.
Puoi anche eseguire più chiamate al metodo update()
, che equivale a una singola chiamata con tutti gli argomenti concatenati.
import hashlib
first_hash = hashlib.md5()
first_hash.update(b"Hello World, Hello Python")
print(first_hash.hexdigest())
second_hash = hashlib.md5()
second_hash.update(b"Hello World,")
second_hash.update(b" Hello Python")
print(second_hash.hexdigest())
Produzione:
b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a
In sintesi, possiamo utilizzare l’algoritmo hash md5
tramite il modulo hashlib
che può essere alimentato con i dati passandolo come parametro del costruttore md5()
oppure utilizzando il metodo update()
. Possiamo ottenere il valore hash utilizzando il metodo digest()
, che restituisce un oggetto bytes
del metodo digest()
o hexdigest()
, che restituisce un oggetto stringa del digest contenente solo cifre esadecimali.