Argon2-cffi: Hash seguro de contraseñas en Python

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es argon2-cffi?

La librería argon2-cffi es un envoltorio oficial de Python para el algoritmo de hash de contraseñas Argon2, implementado a través de la interfaz CFFI (C Foreign Function Interface). Argon2 es un algoritmo moderno de hash de contraseñas que ganó el concurso Password Hashing Competition en 2015 y desde entonces se considera el estándar de oro para el almacenamiento seguro de contraseñas.

La principal ventaja de argon2-cffi es que ofrece un alto rendimiento gracias a su implementación en C, al mismo tiempo que proporciona una interfaz Python cómoda y fácil de usar. La librería cuenta con el apoyo activo de la comunidad y se actualiza periódicamente para cumplir con los últimos estándares de seguridad.

Instalación y configuración

Instalación estándar

pip install argon2-cffi

Instalación con dependencias adicionales

pip install argon2-cffi[dev]  # para desarrollo
pip install argon2-cffi[tests]  # para pruebas

Verificar la instalación

import argon2
print(argon2.__version__)

Variantes del algoritmo Argon2

Argon2i (Data-Independent)

Argon2i está optimizado para protegerse contra ataques de canal lateral (side-channel attacks). Accede a la memoria de forma independiente al contenido de la contraseña, lo que lo hace resistente a ataques de tiempo de ejecución. Se recomienda para escenarios donde la protección contra el análisis de tiempos de ejecución es crítica.

Argon2d (Data-Dependent)

Argon2d ofrece la máxima protección contra ataques GPU y ataques con hardware especializado. Utiliza accesos a memoria dependientes de los datos, lo que dificulta la paralelización de los ataques. Sin embargo, es menos resistente a ataques de canal lateral.

Argon2id (Híbrido)

Argon2id es un modo híbrido que combina las ventajas de ambas variantes. Es el modo predeterminado en argon2-cffi y se recomienda para la mayoría de los casos de uso. Las primeras pasadas se ejecutan como Argon2i y el resto como Argon2d.

Inicio rápido

Uso básico

from argon2 import PasswordHasher

# Crear una instancia del hasher
ph = PasswordHasher()

# Hash de una contraseña
password = "mi_contraseña_super_secreta"
hash_result = ph.hash(password)
print(f"Hash: {hash_result}")

# Verificar la contraseña
try:
    ph.verify(hash_result, password)
    print("¡Contraseña correcta!")
except Exception as e:
    print(f"Contraseña incorrecta: {e}")

Trabajar con diferentes tipos de datos

from argon2 import PasswordHasher

ph = PasswordHasher()

# Hash de una cadena de texto
string_hash = ph.hash("contraseña_de_texto")

# Hash de bytes
bytes_password = b"bytes_password"
bytes_hash = ph.hash(bytes_password)

# Verificación
ph.verify(string_hash, "contraseña_de_texto")
ph.verify(bytes_hash, bytes_password)

Configuración de PasswordHasher

Parámetros del constructor

from argon2 import PasswordHasher, Type

ph = PasswordHasher(
    time_cost=3,        # Número de iteraciones (por defecto 2)
    memory_cost=65536,  # Memoria en KB (por defecto 51200)
    parallelism=2,      # Número de hilos (por defecto 1)
    hash_len=32,        # Longitud del hash en bytes (por defecto 32)
    salt_len=16,        # Longitud del salt en bytes (por defecto 16)
    encoding="utf-8",   # Codificación (por defecto "utf-8")
    type=Type.ID        # Tipo de Argon2 (por defecto Type.ID)
)

Impacto de los parámetros en la seguridad

time_cost aumenta el tiempo de ejecución de forma lineal. Cada incremento de 1 duplica el tiempo de hash.

memory_cost determina la cantidad de memoria en kilobytes. Valores más grandes dificultan los ataques con hardware especializado.

Recommendations