¿Qué es Argon2?
Argon2 es un algoritmo para guardar contraseñas de forma segura. Ganó en 2015 la Password Hashing Competition, un concurso abierto para elegir el sucesor de bcrypt, scrypt y PBKDF2, y desde 2021 es un estándar de internet, el RFC 9106.
Su clave es que, además de tiempo, necesita memoria. Un atacante que roba una base de datos intenta probar miles de millones de contraseñas con tarjetas gráficas o chips especializados, que tienen mucha potencia de cálculo pero poca memoria por núcleo. Si cada intento necesita, por ejemplo, 64 MiB, el ataque se vuelve muchísimo más lento y caro.
Argon2id, Argon2i y Argon2d
- Argon2id: combina las otras dos y es la que se recomienda para contraseñas. Es la que usan PHP, libsodium y casi todas las librerías.
- Argon2i: protegida frente a ataques que espían cómo usa la memoria el procesador (de canal lateral).
- Argon2d: la más resistente a las tarjetas gráficas, pero expuesta a esos ataques de canal lateral. Se usa en criptomonedas, no para contraseñas.
Los parámetros
| Parámetro | Qué es | PHP por defecto |
|---|---|---|
Memoria (m) | La memoria que necesita cada cálculo, en KiB. | 65.536 KiB (64 MiB) |
Iteraciones (t) | Cuántas veces se recorre esa memoria. | 4 |
Paralelismo (p) | En cuántos hilos se reparte el trabajo. | 1 |
| Sal | Bytes aleatorios distintos para cada contraseña, para que dos iguales no tengan el mismo hash. | 16 bytes |
| Longitud | El tamaño del hash resultante. | 32 bytes |
OWASP recomienda como mínimo Argon2id con 19 MiB, 2 iteraciones y 1 hilo. El RFC 9106 propone, para equipos con poca memoria, 64 MiB, 3 iteraciones y 4 hilos. Lo ideal es ajustarlos para que en tu servidor cada hash tarde unas décimas de segundo: lo suficiente para frenar a un atacante sin hacer esperar a tus usuarios.
Cómo leer un hash Argon2
Un hash Argon2 lleva dentro todo lo necesario para comprobarlo después:
$argon2id$v=19$m=65536,t=4,p=1$c2FsdGFsZWF0b3JpYQ$hash…
argon2id: la variante.v=19: la versión del algoritmo (la 1.3, la actual).m=65536,t=4,p=1: la memoria, las iteraciones y el paralelismo.- Las dos últimas partes son la sal y el hash, en Base64.
Por eso no hace falta guardar la sal ni los parámetros aparte: basta con guardar el hash entero.
¿Argon2 o bcrypt?
Los dos son buenas opciones, y mucho mejores que guardar contraseñas con MD5 o SHA-256, que son rápidos a propósito. Argon2id es la primera recomendación de OWASP para proyectos nuevos porque, además de tiempo, exige memoria. bcrypt sigue siendo seguro con un coste adecuado, aunque solo tiene en cuenta los primeros 72 bytes de la contraseña.
Cómo usarlo en tu aplicación
En PHP basta con las funciones de siempre:
$hash = password_hash($password, PASSWORD_ARGON2ID);
if (password_verify($password, $hash)) {
// Contraseña correcta.
}
Con password_needs_rehash() puedes actualizar los hashes antiguos cuando cambies los parámetros: se comprueba al iniciar sesión, que es cuando tienes la contraseña. En Python, la librería argon2-cffi, y en Node.js, el paquete argon2, generan y verifican este mismo formato.