scrypt - Derivación de claves memory-hard
Lectura de 2 min aprox.
scrypt es una función hash de contraseñas de uso intensivo de memoria que resiste los ataques en paralelo de GPU y ASIC al consumir grandes cantidades de memoria. Fue diseñada por Colin Percival en 2009 para la derivación de claves del servicio de copias de seguridad en línea Tarsnap. Mientras que bcrypt está limitada por la CPU, scrypt exige un cálculo limitado por la memoria, lo que eleva el coste de los ataques en varios órdenes de magnitud. También es ampliamente conocida como el algoritmo de prueba de trabajo de la criptomoneda Litecoin.
Antecedentes históricos
A finales de la década de 2000, la computación de propósito general en GPU (GPGPU) se difundió rápidamente, y los ataques de fuerza bruta contra funciones hash limitadas por la CPU como bcrypt se convirtieron en una amenaza real. Para abordar este problema, Colin Percival diseñó scrypt en torno a la idea de que «si se obliga a consumir grandes cantidades de memoria además de cálculo, se puede neutralizar el paralelismo de las GPU». Se adoptó para el cifrado de copias de seguridad de Tarsnap en 2009 y se estandarizó como RFC 7914 en 2012. Cuando Litecoin, que apareció en 2011, adoptó scrypt, también obtuvo un amplio reconocimiento en la comunidad de criptomonedas.
Cómo funciona el algoritmo ROMix
El núcleo de scrypt es un algoritmo llamado ROMix. El procesamiento se divide a grandes rasgos en dos fases.
Genera N bloques pseudoaleatorios a partir de un valor inicial y los almacena en un arreglo enorme. Cuando N = 2^20 (cerca de 1 millón), consume más de 1 GB de memoria. No se puede pasar a la siguiente fase sin mantener todo este arreglo.
Mezcla los valores mientras hace referencia a posiciones aleatorias del arreglo N veces. Como cada posición de referencia depende del resultado de cálculo inmediatamente anterior, no se puede predecir de antemano. Reducir la memoria obliga a recalcular, lo que hace que el coste de tiempo aumente bruscamente.
Esta propiedad, en la que «reducir la memoria hace que el tiempo de cálculo se dispare», es la esencia de la dureza de memoria de scrypt. Cuando un atacante intenta ahorrar memoria para aumentar el paralelismo, el tiempo de cálculo por instancia aumenta de forma cuadrática, por lo que el coste total del ataque no disminuye.
Comparación con Argon2 y bcrypt
| Propiedad | bcrypt | scrypt | Argon2id |
|---|---|---|---|
| Año de aparición | 1999 | 2009 | 2015 |
| Uso intensivo de memoria | ✗ | ✓ | ✓ |
| Resistencia a canales laterales | Alta | Baja (acceso dependiente de datos) | Alta (modo híbrido de Argon2id) |
| Intuitividad de los parámetros | Sencilla con un solo parámetro de coste | La relación entre N, r, p es compleja | Memoria, tiempo y paralelismo son independientes |
| Orden de recomendación de OWASP | 2.º | 3.º | 1.º |
| Adopción en criptomonedas | Ninguna | Litecoin, Dogecoin, etc. | Algunos diseños resistentes a la minería |
Diseño de parámetros (N, r, p)
scrypt tiene tres parámetros, y es importante comprender la función de cada uno y sus interrelaciones.
Duplicar N duplica tanto el uso de memoria como el tiempo de cálculo. Como la interdependencia de los parámetros es compleja, el ajuste es algo más difícil en comparación con algoritmos como Argon2id, que permiten ajustar memoria, tiempo y paralelismo de forma independiente. Usa una sal de al menos 16 bytes y almacénala siguiendo los principios básicos del hash de contraseñas.
Adopción en Litecoin
Litecoin, que apareció en 2011, adoptó scrypt como su algoritmo de prueba de trabajo en lugar del SHA-256 de Bitcoin. El objetivo en aquel momento era «evitar la oligopolización de la minería por parte de los ASIC y permitir que los PC corrientes participaran en la minería». Sin embargo, alrededor de 2014 aparecieron ASIC compatibles con scrypt y no se alcanzó el objetivo inicial. Esta experiencia deja la lección de que ni siquiera una función de uso intensivo de memoria puede resistir el hardware dedicado sin un requisito de memoria suficiente. Explicamos la seguridad de las criptomonedas en seguridad de las carteras de criptomonedas.
Conceptos erróneos comunes
Algunos sostienen que «scrypt es antiguo, así que no debería usarse», pero si se opera con parámetros adecuados, sigue ofreciendo seguridad suficiente a fecha de 2025. OWASP también lo recomienda como la tercera opción después de Argon2id y bcrypt. No obstante, el enfoque práctico es elegir Argon2id como primera opción para los sistemas nuevos y seleccionar scrypt cuando se requiere compatibilidad con sistemas existentes. Para los fundamentos de la criptografía, consulta los fundamentos del cifrado, y para la visión general de la gestión de contraseñas, consulta también la guía de gestión segura de contraseñas.libros de introducción a la criptografía (Amazon) para aprender aún más a fondo.
¿Te resultó útil este artículo?