héroe bg sin separador
Pautas

Almacenamiento de contraseñas

Si tu aplicación es auténtica para los usuarios, lo más probable es que también se ocupe de las contraseñas.

Manejar las contraseñas de los usuarios es muy importante y manejarlas de manera adecuada es aún más importante.

Es difícil imaginar un escenario peor que el ataque de una aplicación y la filtración de las contraseñas de los usuarios a través de Internet para que todas las vean. Personalmente, nos estremece pensarlo. Entonces, ¿cómo se pueden almacenar las contraseñas de forma segura y de acuerdo con las mejores prácticas? Vamos a echar un vistazo a algunas maneras.

Cifrado versus hashing

A nivel superficial, uno podría pensar que el cifrado parece una solución decente para el almacenamiento seguro de contraseñas, sin embargo, confiar totalmente en él podría resultar algo problemático.

El cifrado es intrínsecamente una función bidireccional, lo que, por supuesto, significa que, al igual que una contraseña se puede cifrar, también se puede cifrar. desencriptado. Perfectamente lógico, ¿verdad? De lo contrario, ¿cómo podría validar si la contraseña de un usuario coincide con la que está almacenada en la base de datos?

Por lo tanto, la capacidad de descifrar contraseñas también es una gran desventaja. Si alguien pone en peligro un servidor y obtiene el texto cifrado de una contraseña, es muy probable que también pueda obtener el material 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 hayas descifrado algo, no hay ninguna función para volver a convertir directamente el texto cifrado en el texto plano original. Esta propiedad hace que los hashes sean especialmente adecuados para la protección de contraseñas.

No todos los hashes se crean de la misma manera

Una vez que te hayas decidido a usar el hash de las contraseñas para almacenarlas, tampoco es tan sencillo como aplicar una función de hash y dar por terminado el día.

Los hashes vienen en todas las formas y tamaños, la mayoría de los cuales no son exactamente 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 debido a que son una función unidireccional. Si bien esto es técnicamente cierto, el hash también es determinista, lo que significa que también es susceptible a tácticas de fuerza bruta que pueden permitir a un atacante revertir un hash y convertirse en texto plano original si cuenta con el tiempo y los recursos suficientes.

Por este motivo, dividimos las funciones de hash en dos categorías:

  • Hashes criptográficos
  • Hashes de contraseñas
Característica Hash criptográfico Contraseña hash
Velocidad Muy rápido Intencionadamente lento
Factor de trabajo ajustable No

Una característica clave de los hashes de contraseñas es que tienen un «factor de trabajo» (ya sea por un solo entero o por varios parámetros) que define la cantidad de esfuerzo que se necesita para calcular el hash.

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

El «factor trabajo» se utiliza para garantizar que los hashes se almacenen de forma que sigan las tendencias de la industria. A medida que el hardware se hace más rápido, se aumenta el factor de trabajo del algoritmo para garantizar que el hash requiera más tiempo y esfuerzo para descifrar el hash. Digamos, por ejemplo, 100 ms en el hardware contemporáneo.

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

Hash criptográfico Contraseña hash
MD5 bcrypt
SHA-1 scrypt
SHA-2 PBKDF2
SHA-3 Argón2