MD5 Hash en Python
Este artículo demostrará cómo usar el hash MD5 usando el módulo Python hashlib
.
¿Qué es hachís?
Un hash es una función que toma datos de longitud variable y los convierte a una longitud fija. El valor devuelto por una función hash se denomina valor hash, código hash o resumen. Los valores hash se utilizan generalmente para indexar una tabla de tamaño fijo llamada tabla hash.
¿Qué es MD5?
El algoritmo de resumen de mensajes MD5 es una función hash popular que produce un valor hash de 128 bits. Inicialmente diseñado como una función hash criptográfica, ahora se usa comúnmente para verificar la integridad de los datos debido a múltiples problemas de seguridad y vulnerabilidades.
Módulo Python hashlib
La biblioteca estándar de Python consiste en un módulo que implementa diferentes algoritmos de resumen de mensajes y hash seguros llamados hashlib
. También puede incluir algoritmos adicionales disponibles según la biblioteca OpenSSL que Python usa en su plataforma.
Para utilizar los algoritmos hash, importe el módulo hashlib
.
import hashlib
Ahora podemos usar los algoritmos de hash compatibles con este módulo. Para comprobar los algoritmos hash disponibles en el intérprete de Python en ejecución, utilice el atributo constante algorithms_available
.
import hashlib
print(hashlib.algorithms_available)
Producción :
{'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'}
La lista anterior son los algoritmos disponibles en hashlib
, incluidos los algoritmos disponibles de OpenSSL
Para comprobar los algoritmos hash que este módulo garantiza que serán compatibles con todas las plataformas, utilice el atributo constante algorithms_guaranteed
.
import hashlib
print(hashlib.algorithms_guaranteed)
Producción :
{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}
Nota: md5
está en la lista de algorithms_guaranteed
, pero algunos proveedores ascendentes compatibles con FIPS ofrecen una compilación de Python que lo excluye.
Utilice el algoritmo MD5 en Python
Para usar el algoritmo md5, usaremos el constructor md5()
y alimentaremos el objeto hash con objetos tipo byte usando el método update()
o pasaremos los datos como un parámetro del constructor.
Para obtener el valor hash, utilice el método digest()
, que devuelve un resumen del objeto bytes
de los datos alimentados al objeto hash.
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.digest())
Producción :
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
También puede pasar los datos como parámetro al constructor y obtener el valor hash
import hashlib
print(hashlib.md5(b"Hello World").digest())
Producción :
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
Similar al método digest()
, también puede usar hexdigest()
, que devuelve un objeto de cadena del resumen que contiene sólo dígitos hexadecimales.
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.hexdigest())
Producción :
b10a8db164e0754105b7a99be72e3fe5
Observe que hay una b
antes de la cadena literal pasada al método update()
. Se utiliza para crear una instancia de tipo bytes
en lugar de tipo str
. Como la función hash solo acepta una secuencia de bytes como parámetro. No se admite el paso de objetos de cadena al método update()
.
También puede hacer múltiples llamadas al método update()
, que es equivalente a una sola llamada con todos los argumentos concatenados.
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())
Producción :
b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a
En resumen, podemos usar el algoritmo hash md5
a través del módulo hashlib
que puede ser alimentado con datos pasándolo como parámetro del constructor md5()
o usando el método update()
. Podemos obtener el valor hash usando el método digest()
, que devuelve un objeto bytes
del método digest()
o hexdigest()
, que devuelve un objeto de cadena del resumen que contiene sólo dígitos hexadecimales.