Hashing de contraseñas
Nunca se deben almacenar contraseñas en texto plano. Si la base de datos se filtra, las contraseñas quedan expuestas directamente. El objetivo es guardar una representación irreversible de la contraseña que permita verificarla sin revelarla.
Conceptos previos
- Hash: Función unidireccional. A partir del hash no se puede recuperar el original.
- Salt: Valor aleatorio único añadido a cada contraseña antes de hashearla. Evita que dos usuarios con la misma contraseña tengan el mismo hash y anula las tablas rainbow.
- Factor de coste (work factor): Controla cuántas iteraciones realiza el algoritmo. Un factor más alto hace el hash más lento, lo que dificulta los ataques de fuerza bruta. Debe ajustarse con el tiempo conforme el hardware mejora.
¿Por qué no usar MD5, SHA-1 o SHA-256?
Son algoritmos diseñados para ser extremadamente rápidos (útiles para verificar integridad de archivos, firmas digitales, etc.), lo que los hace pésimos para contraseñas. Un atacante con una GPU moderna puede probar miles de millones de combinaciones por segundo.
Para contraseñas necesitamos algoritmos deliberadamente lentos y resistentes a paralelización.