¿Qué es scrypt?

scrypt es una función de hash de contraseñas, o función de derivación de claves, diseñada por Colin Percival en 2009 y publicada como RFC 7914. Al igual que bcrypt y Argon2, es lenta a propósito, por lo que cada intento le cuesta tiempo a un atacante. También requiere mucha memoria: cada hash llena un bloque grande de memoria y lo lee en un orden impredecible, lo que hace que descifrar contraseñas con GPU y chips especializados sea mucho más costoso. scrypt se usa para almacenar contraseñas en muchos marcos de trabajo web, en las bibliotecas estándar de Node.js, Python y Go, y en monederos de criptomonedas, como los almacenes de claves de Ethereum.

Descripción de la herramienta

Esta herramienta calcula el hash de una contraseña con scrypt en tu navegador. Empieza con una sal aleatoria y los ajustes que OWASP recomienda para almacenar contraseñas. Puedes cambiar la sal, el costo (N), el tamaño de bloque (r), la paralelización (p) y la longitud de la clave. El hash está disponible como cadena PHC para bibliotecas de contraseñas, y en formato hexadecimal y Base64 para código que almacena la sal y los parámetros por separado.

Características

  • Calcula el hash de una contraseña con scrypt, según lo definido en RFC 7914
  • Crea una sal aleatoria de 16 bytes e incluye un botón para generar una nueva
  • Permite introducir una sal propia para reproducir un hash generado en otro lugar
  • Permite establecer el costo (N) entre 2⁴ y 2²⁰, el tamaño de bloque (r), la paralelización (p) y la longitud de la clave
  • Proporciona el hash como cadena PHC, en formato hexadecimal y Base64
  • Muestra el progreso de los hashes lentos y avisa cuando los ajustes requieren más de 1 GiB de memoria
  • Se ejecuta en tu navegador, por lo que la contraseña nunca sale de tu dispositivo

Parámetros

Parámetro Valor predeterminado Función
Costo (N) 131072 (2¹⁷) Número de bloques de memoria. Duplicarlo duplica el tiempo y la memoria.
Tamaño de bloque (r) 8 Tamaño de cada bloque: 128 × r bytes. También aumenta el tiempo y la memoria.
Paralelización (p) 1 Número de ejecuciones independientes. Multiplica el tiempo, pero no la memoria.
Longitud de la clave 32 bytes Longitud del hash.

La memoria necesaria es de 128 × N × r bytes, es decir, 128 MiB con los valores predeterminados.

Formatos de salida

La cadena PHC contiene todo lo necesario para comprobar la contraseña más adelante: el algoritmo, los parámetros, la sal y el hash. La sal y el hash están en Base64 sin relleno:

$scrypt$ln=17,r=8,p=1$<salt>$<hash>

ln es el logaritmo en base 2 de N, así que ln=17 significa que N = 131072. Este es el formato que leen y escriben passlib de Python, el paquete scrypt de Rust y el paquete @phc/scrypt de Node.js.

Los campos hexadecimal y Base64 contienen únicamente el hash, tal como lo devuelven crypto.scrypt en Node.js, hashlib.scrypt en Python y scrypt.Key en Go. Almacena la sal y los parámetros junto con él.

Cómo funciona

El campo de la sal se lee como texto y se codifica en UTF-8, igual que al pasar una sal de tipo string a crypto.scrypt de Node.js. La sal aleatoria consta de 16 bytes aleatorios representados como 32 caracteres hexadecimales; esos 32 caracteres son la sal cuyo hash se calcula. La contraseña también se codifica en UTF-8. El hash se calcula en un hilo en segundo plano, así que la página sigue respondiendo, y el cálculo se reinicia cuando cambias cualquier valor de entrada.

Consejos

  • Usa una nueva sal aleatoria para cada contraseña. La misma contraseña con la misma sal siempre genera el mismo hash.
  • OWASP recomienda usar al menos N = 2¹⁷, r = 8 y p = 1 para almacenar contraseñas. Aumenta N tanto como tu servidor pueda permitirse en cada inicio de sesión.
  • De forma predeterminada, Node.js limita scrypt a 32 MiB de memoria. Pasa un valor mayor para maxmem a crypto.scrypt cuando uses N = 2¹⁷ o superior con r = 8.
  • Para comprobar un hash de otro sistema, introduce la misma contraseña, sal y parámetros, y compara los resultados.