Módulo Hashlib de Python

El módulo hashlib proporciona funciones hash seguras como SHA-256 y MD5.

import hashlib

Las funciones hash convierten los datos en un resumen de longitud fija. Un pequeño cambio en la entrada produce un resumen muy diferente.

Crear un hash

Normalmente empiezas eligiendo un algoritmo y pasando bytes.

import hashlib

digest = hashlib.sha256(b'hello world')
print(digest.hexdigest())
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

Las cadenas deben codificarse primero a bytes:

import hashlib

message = 'hello world'
digest = hashlib.sha256(message.encode('utf-8')).hexdigest()
print(digest)
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

Actualización incremental

Los hashes se pueden actualizar por partes.

hasher = hashlib.sha256()
hasher.update(b'hello ')
hasher.update(b'world')
print(hasher.hexdigest())
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

Comparar algoritmos

Los distintos algoritmos producen resúmenes de distinto tamaño.

print(hashlib.md5(b'abc').hexdigest())
print(hashlib.sha1(b'abc').hexdigest())
print(hashlib.sha256(b'abc').hexdigest())
900150983cd24fb0d6963f7d28e17f72
a9993e364706816aba3e25717850c26c9cd0d89d
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

Calcular el hash de un archivo

Lee los archivos por bloques para no tener que cargar archivos grandes completos en memoria.

import hashlib
from pathlib import Path

path = Path('example.txt')
path.write_text('hello world')

hasher = hashlib.sha256()
with path.open('rb') as file:
    for chunk in iter(lambda: file.read(8192), b''):
        hasher.update(chunk)

print(hasher.hexdigest())
path.unlink()
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

WARNING

Para código nuevo, prefiere algoritmos modernos como SHA-256 o SHA-512. MD5 y SHA-1 siguen siendo útiles para sumas de comprobación, pero no son adecuados para usos sensibles a la seguridad.

Enlaces relacionados