El proceso de hash es una función unidireccional que convierte datos en una cadena única y de longitud fija. Este método permite a los sistemas verificar la validez de una contraseña sin conocer los datos originales, lo cual resuelve el problema del acceso inmediato con contraseñas expuestas.
Funciones de hash para contraseñas
Las funciones hash no fueron diseñadas específicamente para cifrar contraseñas. Sin embargo, su uso en este contexto requiere que el proceso sea lento, ya que una función rápida facilita ataques de fuerza bruta.
Para mitigar estos riesgos se han desarrollado algoritmos especializados como bCrypt, sCrypt, PBKDF2 y Argon2. Estos algoritmos incluyen mecanismos para hacer el proceso más lento, lo cual dificulta la obtención de contraseñas mediante ataques brutales.
Ataques comunes
Los atacantes pueden intentar recuperar contraseñas si tienen acceso a los hashes. Para ello utilizan tablas Rainbow o hardware especializado como ASIC y FPGA, que permiten calcular grandes cantidades de hashes en poco tiempo.
El uso de SALT ayuda a prevenir ataques con tablas Rainbow al añadir una secuencia aleatoria a la contraseña antes del hash. Sin embargo, el atacante puede seguir usando fuerza bruta si tiene acceso al SALT y al hash.
Funciones recomendadas
Argon2 es actualmente considerado como la mejor opción debido a su resistencia a ataques de hardware especializado. Tiene dos versiones principales: Argon2i, que es más segura contra ataques laterales, y Argon2d, que ofrece mayor protección contra ataques de GPU.
SCrypt también se considera una buena alternativa por su diseño robusto y uso en criptomonedas. PBKDF2, aunque ampliamente utilizado, es vulnerable a ataques de hardware especializado debido a su facilidad para paralelizar el proceso.
bCrypt ha sido usado durante más de 15 años, pero no se recomienda para aplicaciones modernas debido a su menor resistencia frente a ciertos tipos de ataque. Aunque algunas criptomonedas lo utilizan, no ha ganado tanta popularidad como Argon2.
Configuración recomendada
Según la hoja de trucos OWASP, se recomienda utilizar Argon2id con una configuración mínima de 19 MiB de memoria, 2 iteraciones y 1 grado de paralelismo. Si no está disponible, sCrypt puede ser una alternativa viable.
Para sistemas heredados que usan bCrypt, se recomienda usar un factor de trabajo de 10 o más y limitar la longitud de las contraseñas a 72 bytes. En caso de cumplimiento FIPS-140, PBKDF2 debe configurarse con un factor de trabajo de 600.000 o más y una función de hash interna HMAC-SHA-256.
En resumen, se recomienda evitar el uso de PBKDF2 y bCrypt en aplicaciones modernas, optando por Argon2 (preferentemente Argon2id) para los sistemas más nuevos. SCrypt puede ser una opción secundaria si Argon2 no está disponible.