Directrices

Almacenamiento de contraseñas

Si su aplicación autentica usuarios, es muy probable que también tenga que gestionar contraseñas.

Gestionar las contraseñas de los usuarios es un asunto muy serio, y hacerlo de forma adecuada lo es aún más.

Es difícil imaginar un escenario peor que el de una aplicación atacada y las contraseñas de los usuarios filtradas por todo internet para que cualquiera las vea. Personalmente, nos estremece solo pensarlo. Entonces, ¿cómo se pueden almacenar las contraseñas de forma segura y siguiendo las mejores prácticas? Echemos un vistazo a algunas formas.

Cifrado frente a hashing

A primera vista, uno podría pensar que el cifrado parece una solución decente para el almacenamiento seguro de contraseñas; sin embargo, depender totalmente de él podría ser algo problemático.

El cifrado es intrínsecamente una función bidireccional, lo que significa, por supuesto, que al igual que una contraseña puede cifrarse, también puede descifrarse. Tiene toda la lógica, ¿verdad? De lo contrario, ¿cómo podría validar si la contraseña de un usuario coincide con la almacenada en la base de datos?

Por lo tanto, la capacidad de descifrar contraseñas también supone un riesgo considerable. Si alguien compromete un servidor y obtiene el texto cifrado de una contraseña, hay muchas probabilidades de que también pueda obtener el material de clave necesario para descifrar esas contraseñas.

El hashing, por otro lado, es mucho más adecuado para las contraseñas debido a su naturaleza unidireccional. Una vez que se ha aplicado un hash a algo, no existe ninguna función para convertir directamente el texto cifrado de nuevo al texto plano original. Esta propiedad hace que los hashes sean especialmente adecuados para la protección de contraseñas.

No todos los hashes son iguales

Una vez que ha decidido utilizar el hashing para almacenar contraseñas, no es tan sencillo como aplicar una función hash y dar el trabajo por terminado.

Los hashes vienen en todas las formas y tamaños, y la mayoría no son precisamente adecuados para almacenar contraseñas, dados todos los avances en la tecnología informática de la última década.

Como se mencionó anteriormente, los hashes no se pueden revertir por ser una función unidireccional. Aunque técnicamente es cierto, el hashing también es determinista, lo que significa que es susceptible a tácticas de fuerza bruta que pueden permitir a un atacante revertir potencialmente un hash al texto plano original si dispone de suficiente tiempo y recursos.

Por esta razón, dividimos las funciones de hashing en dos categorías:

  • Hashes criptográficos
  • Hashes de contraseñas
Feature Cryptographic hash Password hash
Speed Very fast Intentionally slow
Work factor can be adjusted No Yes

Una característica clave de los hashes de contraseñas es que tienen un "factor de trabajo" (ya sea mediante un número entero único o múltiples parámetros) que define la cantidad de esfuerzo necesario para calcular el hash.

A medida que las CPU y GPU se han vuelto más rápidas con el paso de los años, ha resultado más fácil realizar ataques masivos de fuerza bruta contra hashes en hardware de consumo, lo que implica que un hash puede volverse cada vez menos seguro con el tiempo.

El "factor de trabajo" se utiliza para garantizar que los hashes se almacenen siguiendo las tendencias del sector. A medida que el hardware se vuelve más rápido, se aumenta el factor de trabajo del algoritmo para asegurar que el hash requiera más tiempo y esfuerzo para ser descifrado. Digamos, por ejemplo, 100 ms en hardware contemporáneo.

Esto significa que, en la práctica, es posible que el factor de trabajo deba aumentarse cada 2 o 3 años.

Cryptographic hash Password hash
MD5 bcrypt
SHA-1 scrypt
SHA-2 PBKDF2
SHA-3 Argon2

‍

Eslogan

Programación segura y práctica

Explore las directrices de programación segura para comprender y mitigar vulnerabilidades de software como el OWASP Top 10, y sumérjase en misiones de formación guiada para practicar en simulaciones de aplicaciones del mundo real.

Más directrices
Reservar una demostración