Verificación de contraseñas con cadena de esquemas y actualización oportunista
Project description
tumbaga
Verificación de contraseñas con cadena de esquemas y actualización oportunista: tus usuarios migran de un algoritmo a otro al iniciar sesión, sin restablecer nada y sin enterarse.
from tumbaga import Tumbaga
tumbaga = Tumbaga()
# Al crear un usuario
usuario.password_hash = tumbaga.cifrar("su contraseña")
# Al iniciar sesión
r = tumbaga.verificar("su contraseña", usuario.password_hash)
if r.valida:
if r.hash_nuevo: # quedó migrado a un esquema mejor
usuario.password_hash = r.hash_nuevo
db.commit()
entrar(usuario)
El nombre
La tumbaga es la aleación de oro y cobre que trabajaban los orfebres muiscas y quimbayas: dos metales distintos que se funden y se comportan como uno solo, más resistente que cualquiera de los dos por separado.
Esta librería hace lo mismo con los algoritmos de hash. Argon2id, bcrypt y los que vengan conviven en una sola cadena que se usa como si fuera un único esquema, y el paso de uno a otro ocurre sin que nadie lo note.
Por qué existe
Un hash de contraseña es de una sola vía. De bcrypt(clave) no se saca clave,
y sin la clave no se puede calcular argon2(clave).
Por eso no existe forma de migrar contraseñas con un script. Hay un solo instante en toda la vida de un sistema en que la contraseña está en claro: el momento en que el usuario la escribe para entrar. La migración es oportunista o no es.
tumbaga reconoce el esquema de cada hash —el algoritmo viaja dentro del propio
hash, no en una columna aparte que pueda desincronizarse—, verifica con él, y si
no es el mejor disponible devuelve el hash ya recalculado para que lo guardes.
Qué NO hace, a propósito
- No guarda nada. Devuelve el hash nuevo; tu aplicación decide cuándo persistirlo. Así funciona igual con SQLAlchemy, con SQLModel o sin ORM.
- No conoce tu modelo de usuario. No hay tablas ni migraciones que adoptar.
- No gestiona sesiones ni tokens.
Esquemas
| Esquema | Escribe | Verifica |
|---|---|---|
Argon2id |
sí (por defecto) | sí |
Bcrypt |
no | sí |
Bcrypt está solo para no dejar fuera a nadie cuando se importan usuarios de
otro sistema. Todo hash de bcrypt que se verifique con éxito se reescribe en el
acto con Argon2id.
Argon2id usa los parámetros recomendados por OWASP para 2024+ (19 MiB, 2
iteraciones, 1 hilo). Si mañana subes el costo, los hashes viejos se reescriben
solos al entrar: check_needs_rehash detecta el cambio de parámetros.
Cerrar la migración
Empezar una migración es fácil; olvidarla es lo normal. Mientras un esquema débil siga en la cadena, una base de datos filtrada se ataca por esa rama.
# Cuántos usuarios siguen en un esquema viejo
pendientes = sum(1 for u in usuarios if tumbaga.necesita_actualizacion(u.password_hash))
Cuando llegue a cero, quita ese esquema de la cadena:
tumbaga = Tumbaga(esquemas=[Argon2id()]) # sin bcrypt
A partir de ahí, un hash antiguo levanta EsquemaDesconocido en vez de
verificarse en silencio.
Cadena a medida
from tumbaga import Tumbaga, Argon2id, Bcrypt
tumbaga = Tumbaga(esquemas=[
Argon2id(memoria_kib=65536, iteraciones=3), # escribe con este
Bcrypt(), # solo verifica
])
El primer esquema que no sea de solo verificación es con el que se escribe.
Instalación
pip install tumbaga
Licencia
Apache-2.0. Copyright 2026 Juan Carlos Isaza Arenas. Ver NOTICE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tumbaga-0.2.0.tar.gz.
File metadata
- Download URL: tumbaga-0.2.0.tar.gz
- Upload date:
- Size: 13.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91094c42a487149927fbefd2b18bbad10ee4edaaf7abb961aee35d788310965c
|
|
| MD5 |
7adba9fd37bfc55caec58f869870f787
|
|
| BLAKE2b-256 |
c1a6cf74500067af7a52bc22f2664f6e38f421bf41b71dc59fef830eb56993a7
|
File details
Details for the file tumbaga-0.2.0-py3-none-any.whl.
File metadata
- Download URL: tumbaga-0.2.0-py3-none-any.whl
- Upload date:
- Size: 13.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21eb69192b6331c776f60e319e049ab7e509674d5fb50faad7ab3015e9d67e57
|
|
| MD5 |
0af4fc44960a3f0054f17454a6fa3037
|
|
| BLAKE2b-256 |
079bacbb17728895361854e419d6e3c34ffa58599ddd6d43850065035bcf1ec3
|