¿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.
También en la biblioteca
Recommendations