Skip to main content

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)
Bcrypt no

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tumbaga-0.2.0.tar.gz (13.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tumbaga-0.2.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

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

Hashes for tumbaga-0.2.0.tar.gz
Algorithm Hash digest
SHA256 91094c42a487149927fbefd2b18bbad10ee4edaaf7abb961aee35d788310965c
MD5 7adba9fd37bfc55caec58f869870f787
BLAKE2b-256 c1a6cf74500067af7a52bc22f2664f6e38f421bf41b71dc59fef830eb56993a7

See more details on using hashes here.

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

Hashes for tumbaga-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 21eb69192b6331c776f60e319e049ab7e509674d5fb50faad7ab3015e9d67e57
MD5 0af4fc44960a3f0054f17454a6fa3037
BLAKE2b-256 079bacbb17728895361854e419d6e3c34ffa58599ddd6d43850065035bcf1ec3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page