hashlib, secrets & uuid
hashlib proporciona hashes criptográficos y rápidos (SHA-256). secrets genera tokens impredecibles. uuid crea identificadores únicos estándar: elige la herramienta adecuada para sumas de verificación frente a tokens de sesión frente a claves primarias.
Receta
import hashlib
import secrets
digest = hashlib.sha256(b"payload").hexdigest()
token = secrets.token_urlsafe(32)Cuándo usar esto:
- Sumas de verificación de integridad de archivos -> hashlib
- Tokens de sesión/API -> secrets
- Claves primarias de bases de datos -> uuid4
- Almacenamiento de contraseñas -> nunca hashlib solo; usa argon2/bcrypt en PyPI
- Autenticación de mensajes HMAC -> módulo hmac con clave secreta
Ejemplo de trabajo
import hashlib
import secrets
import uuid
def sha256_hex(data: bytes) -> str:
return hashlib.sha256(data).hexdigest()
def new_session_token() -> str:
return secrets.token_hex(16)
def new_record_id() -> str:
return str(uuid.uuid4())
payload = b"important"
print("sha256", sha256_hex(payload))
print("session", new_session_token())
print("uuid", new_record_id())
# compara los digests en tiempo constante
a = sha256_hex(b"x")
b = sha256_hex(b"x")
print(secrets.compare_digest(a, b))Lo que esto demuestra:
- sha256 para la huella digital del contenido (no para contraseñas)
- Módulo secrets para tokens CSPRNG
- IDs aleatorios uuid4 para sistemas distribuidos
compare_digestpreviene fugas de tiempo en las comparaciones
Inmersión Profunda
Guía de elección
| Necesidad | Módulo |
|---|---|
| Token aleatorio para URL | secrets.token_urlsafe |
| Hash de contenido estable | hashlib.sha256 |
| Columna uuid de BD | uuid.uuid4 |
| Hash de contraseña | argon2-cffi / bcrypt |
Versiones de uuid
- uuid4 aleatorio - IDs por defecto
- uuid7 (3.14+ ordenado por tiempo) - amigable para índices donde se admite
Trampas
- sha256 para contraseñas - demasiado rápido, sin salt. Solución: hashers de contraseñas dedicados.
- módulo random para tokens - predecible. Solución: solo secrets.
- Fuga de MAC de uuid1 - preocupación de privacidad. Solución: uuid4 para IDs públicos.
- Caso del digest hexadecimal - compara consistentemente; usa compare_digest.
- Hashing de archivos grandes - carga de memoria. Solución:
hashlib.file_digestincremental (3.11+) o bucle de actualización.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| argon2 | Almacenamiento de contraseñas | Suma de verificación de archivos |
| ULID PyPI | IDs ordenables antes de uuid7 | Solo biblioteca estándar |
| HMAC | Tokens firmados | Digest simple es suficiente |
Preguntas Frecuentes
¿secrets vs os.urandom?
secrets envuelve urandom con ayudantes; ambos son CSPRNG para tokens.
¿algoritmos de hashlib?
sha256 común; evita md5/sha1 para integridad sensible a la seguridad.
¿uuid en URLs?
uuid4 está bien; usa un token de secrets si necesitas una URL de capacidad opaca.
¿file_digest?
3.11+ lee el archivo en trozos: hashlib.file_digest(open(path,"rb"), "sha256").
¿saltar contraseñas?
Usa una biblioteca - nunca sal manual + una sola iteración de hash.
¿token_hex vs urlsafe?
urlsafe es más corto para la misma entropía en rutas de URL; hex es más simple para logs.
¿tipo de BD UUID?
Columna UUID nativa en Postgres; almacena como tipo str o uuid según el ORM.
¿ejemplo de HMAC?
hmac.new(key, msg, hashlib.sha256).hexdigest() para webhooks firmados.
¿longitud de entropía?
Mínimo 16 bytes (128 bits) para tokens de sesión en muchos modelos de amenaza.
¿beneficio de uuid7?
Ordenado por tiempo reduce la fragmentación del índice de la BD frente a uuid4 aleatorio.
Relacionados
- json & Serialización - tokens en JSON
- subprocess - verifica sumas de verificación de artefactos
- Descripción general de la biblioteca estándar - mapa
- Manejo de contraseñas y credenciales - patrones de autenticación
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.