Cuando crea un producto que requiere la autenticación de usuarios mediante contraseñas, es necesario ocuparse de cómo se almacenarán esas contraseñas. Guardar contraseñas directamente en la base de datos en texto plano representa una amenaza grave para la seguridad, ya que en caso de filtración de datos los atacantes podrían obtener las contraseñas. Muchos usuarios tienden a usar la misma contraseña en distintos sitios, y si un atacante descubre una contraseña, puede probarla en otras cuentas más importantes, como las bancarias.
Uno de los métodos más fiables para almacenar contraseñas es el hash de las mismas. Analicemos qué es, cómo funciona y por qué es importante usarlo.
Fundamentos del hash de contraseñas
El hash es el proceso de transformar una contraseña en un código especial (hash) mediante una función matemática. Este hash es irreversible: no se puede descifrar para recuperar la contraseña original. Cuando el usuario introduce su contraseña al iniciar sesión, se aplica el hash de nuevo y el sistema compara ese nuevo hash con el almacenado en la base de datos. Si los valores coinciden, se concede el acceso.
Almacenar contraseñas en forma de hash aumenta considerablemente la seguridad en comparación con almacenarlas en texto plano. Incluso si un atacante obtiene acceso a la base de datos, le resultará difícil aprovechar esos datos.
¿Por qué el hash es mejor que el cifrado?
El cifrado de contraseñas implica la posibilidad de descifrarlas si se dispone de la clave, lo que crea un riesgo adicional. Si un hacker o un empleado malintencionado obtiene acceso a las claves de cifrado, podrá recuperar fácilmente las contraseñas. El hash, a diferencia del cifrado, es un proceso unidireccional: tras aplicar el hash no hay forma de recuperar la contraseña original. Esto hace que el hash sea un método más seguro.
¿Qué ataques son posibles contra los hashes?
A pesar de todas las ventajas del hash, existen métodos que permiten a los atacantes intentar quebrar los hashes. Los principales tipos de ataques:
- Ataque por diccionario: los atacantes usan una lista de palabras preparada de antemano (diccionarios) y verifican si el hash de alguna de esas palabras coincide con el hash de la contraseña.
- Ataque de fuerza bruta: prueba automática de todas las combinaciones posibles de caracteres hasta encontrar la contraseña adecuada.
- Ataque con tablas arcoíris: tablas especiales con hashes calculados previamente para contraseñas populares.
¿Cómo reforzar la protección de las contraseñas con sal?
Para hacer el proceso de hash más robusto se utiliza la llamada "sal": una secuencia aleatoria de caracteres que se añade a la contraseña antes de aplicar el hash. Esto impide el uso de tablas arcoíris, ya que para cada contraseña se crea un hash único incluso cuando distintos usuarios utilizan contraseñas idénticas.
Algoritmos de hash lentos
El uso de algoritmos de hash rápidos, como MD5 o SHA1, ya no es seguro, ya que los procesadores y tarjetas gráficas actuales pueden generar millones de hashes por segundo, lo que permite a los atacantes realizar ataques exitosos. Algoritmos más lentos, como bcrypt, scrypt o Argon2, hacen que el proceso de búsqueda del hash tarde considerablemente más, lo que aumenta la probabilidad de defenderse contra el acceso no autorizado.
Conclusión
El hash de contraseñas es un paso clave para garantizar la seguridad en el mundo digital. Protege los datos de los usuarios frente a atacantes y reduce el riesgo de filtraciones. Incluso al usar hashes conviene aplicar medidas adicionales de seguridad, como el uso de sal y algoritmos de hash más lentos, para minimizar las posibilidades de ataque.