Siempre escucho que es mejor usar sales encima de las contraseñas almacenadas, que luego de alguna manera se concatenan y se procesan después. Pero no sé qué usar como sal. ¿Qué sería una buena sal?
Supongamos que tiene una tabla donde almacenará la contraseña de cada persona.
Para "guardar" la contraseña que se está generando, haga lo siguiente
hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg")))))))))))
Almacene ese hash_password, con el inicio de sesión y el salt, en la tabla.
login password salt
--------------------------------------
john a7b82783... a12bc34de56fg
Y luego, para verificar cuándo un usuario accede a tu aplicación:
hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg")))))))))))
Verifique si el hash_password que calculó es el mismo que se almacenó en la base de datos. Sabrás si la contraseña es correcta o no.
Eso es todo !. Puede obtener la sal de cualquier fuente aleatoria que desee. ¿Por qué debería ser aleatorio? Porque cualquier sal no aleatoria haría mucho más fácil intentar la fuerza bruta de su aplicación.
La recomendación clásica para un salt para el hashing de contraseñas es:
/dev/random
o /dev/urandom
en los Unixes modernos ); Hay un montón de discusiones anteriores sobre temas relacionados . Y lo más importante, debe no implementar su propio esquema de hashing de contraseñas, debe usar un implementación probada, probada, revisada por pares (bcrypt / PBKDF2) .
La respuesta es "casi cualquier cosa", aunque algunas son más fuertes que otras.
Supongamos que está utilizando md5 (salt.password).
Sin sal, los piratas informáticos rápidamente descifran la mayoría de las contraseñas con solo buscar el hash en una tabla de arco iris.
Supongamos que usa "x" como la sal para todas sus contraseñas. Todavía se encontrarán muchas de sus contraseñas, pero menos. Esto se debe a que si la contraseña es "p4ssw0rd", se convierte en "xp4ssw0rd" con el salt, lo que lo hace un poco más difícil, pero no significativamente.
Ahora digamos que usa "% X88Fc + 7" como el único valor para todas sus contraseñas. En este punto, las tablas del arco iris no van a funcionar. Pero, como consecuencia de usar una sal para todas las contraseñas, el pirata informático podrá generar una tabla de arco iris con esa suposición y construir tablas de arco iris con anticipación. Es mucho más seguro, pero no perfecto.
La siguiente opción más segura es usar el nombre de usuario como salt, en otras palabras, usar 'md5 (nombredeusuario.control).' Nuevamente, esto derrota a la tabla estándar del arco iris, pero un pirata informático puede generar una tabla del arco iris para un nombre de usuario específico (como "raíz" o "administrador"), de modo que cada vez que se cambia la contraseña, el pirata informático puede buscar en un arco iris mesa en lugar de romperlo de nuevo.
Por lo tanto, para ser aún más seguro, elija una sal aleatoria diferente para diferentes usuarios. Tienes que almacenar esto junto con el hash de nombre de usuario y contraseña. Esto derrota completamente las tablas del arco iris.
Algunos sugieren un generador de números aleatorios "seguro", en lugar de algo simple. Por ejemplo, hacer un MD5 (marca de tiempo + nombre de usuario) cuando el usuario crea una cuenta es simple, pero no criptográficamente seguro (ya que las marcas de tiempo y los nombres de usuario son predecibles y, por lo tanto, de baja entropía). Pero, dado que el pirata informático tiene una copia de la sal de todos modos cuando roba la base de datos, no es un problema.
Para la sal solo usa un bit aleatorio.
En Linux puedes usar /dev/random
. Es un generador de números aleatorios basado en el ruido ambiental. Es bastante impredecible a excepción de las máquinas virtuales. Entonces, si tienes un mouse físico conectado a tu caja, /dev/random
te dará bits aleatorios de alta calidad que son buenos para la sal.
Aquí hay un buen artículo para comenzar. Vea también las referencias externas.
Aquí hay un código java de ejemplo . Vea cómo la sal se genera y almacena en la base de datos en la función createUser()
. Excepto por usar import sun.misc. ...
es un código muy bueno.
Lea otras preguntas en las etiquetas passwords password-management salt