¿Por qué ciframos las contraseñas? ¿Es para proteger la contraseña de las escuchas ilegales? ¿Para proteger la contraseña después de guardarla en la base de datos? ¿ambos? ¿O por alguna otra razón?
Escribí un artículo del blog específicamente sobre ese tema. Resumen: la contraseña debe estar oculta ("cifrado" no es el término correcto para eso) para proteger contra los atacantes que obtienen acceso de solo lectura a la base de datos donde un servidor almacena todo lo que necesita para verificar las contraseñas.
El cifrado de una contraseña se suele utilizar para protegerla de las escuchas ilegales. Por ejemplo, cuando inicia sesión en un sitio web que se ha configurado correctamente, su contraseña se cifra mediante SSL. Ningún intruso puede arrebatar la contraseña en tránsito.
En cuanto a guardar una contraseña encriptada en una base de datos, a menos que haya una buena razón para hacerlo y sepa lo que está haciendo, esta es una mala idea. Almacenar un resumen (por ejemplo, sha-256 (salt + contraseña)) es una idea mucho mejor. La razón de esto es que ¿dónde se almacena la clave de cifrado? En el servidor. Entonces, si un pirata informático puede entrar en la máquina y robar la base de datos, seguramente podrá robar la clave de cifrado y descifrar fácilmente cada contraseña.
Un ejemplo válido que se me ocurre, sin embargo, para almacenar una contraseña cifrada en una base de datos es un administrador de contraseñas.
La forma correcta es no almacenar contraseñas (incluso encriptadas), sino almacenar un hash con sal de la contraseña.
A veces es necesario almacenar una contraseña, generalmente para iniciar sesión / acceder a otros sistemas. Luego, debe almacenarlo encriptado, de modo que si alguien lo recibe (mediante inyección SQL o lo que sea) no podrá utilizarlo para acceder a esos sistemas.
Use hashing, en lugar de cifrar contraseñas. ¿Por qué? Bueno, para cifrar algo, necesitas otra clave (otra contraseña). Entonces, ¿cómo almacenar esa clave de forma segura? Estarías atrapado en un bucle.
Entonces, usa una función de hashing. Mirando alrededor de Internet, encontrará millones de artículos y sugerencias que indican el uso de funciones como MD5, SHA1, SHA256, HMAC, Hashes salados, ... y así sucesivamente. La lista es larga, pero no los use.
Utilice PBKDF2 con un salt de 64 bits por usuario (posiblemente derivado de un generador de números pseudoaleatorios criptográficos ). Una de las razones para usar PBKDF2 sobre cualquier otra función de hashing es que es lenta, lo que significa que no es muy vulnerable a los ataques de fuerza bruta. Una sal por usuario ayuda a proteger contra los tabla de arco iris .
Entonces, almacenarías
USERNAME, PBKDF2DIGEST, SALT
como registro en tu tabla de SQL y listo!
(prefiero PBKDF2 sobre bcrypt porque se siente más usado y por lo tanto más probado)
El hash se utiliza para proteger las contraseñas dentro de la base de datos (ya sea en un sistema operativo como Linux o una aplicación). Para proteger el hash de ataques como las tablas de arco iris, se agrega un valor de sal al hash. La sal hará que los ataques de las tablas del arco iris sean poco prácticos porque el valor de la sal es único para cada usuario.
La protección de la contraseña de las escuchas ilegales generalmente utiliza cifrado. Por ejemplo, envíe la contraseña a través de SSL.
Por favor, siga la respuesta de Thomas Pornin arriba. Saber que debe hash + salt sus contraseñas antes de almacenarlas no es suficiente. Es suficiente información para meterte en problemas.
Por ejemplo, una ronda de hash md5 es tremendamente débil, con una configuración de 8 GPU y 33.1 mil millones de hashes por segundo , puede rompa todas las contraseñas de 8 dígitos con caracteres alfanuméricos en 15 horas.
Thomas habla sobre bcrypt y PBKDF2 y el fondo detrás de su uso.
Lea otras preguntas en las etiquetas passwords password-management encryption