¿Qué se debe usar como sal?

42

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?

    
pregunta skizeey 10.10.2011 - 20:02
fuente

4 respuestas

13

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

  1. obtener el inicio de sesión del usuario
  2. obtener la contraseña
  3. generar algo de sal de valores aleatorios. Digamos que de / dev / random (como sugirió @Michal), obtuviste "a12bc34de56fg"
  4. Use alguna función de hashing para generar la contraseña hash. Digamos que la contraseña original era "1 contraseña" y usará cualquier hash SHA. Lo harás

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:

  1. obtener el nombre de usuario y la contraseña
  2. recupere el salt para ese inicio de sesión de la base de datos (tendrá el salt: a12bc34de56fg)
  3. concatene la contraseña de texto sin formato con el salt y vuelva a hacer todo el hashing:

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.

    
respondido por el woliveirajr 10.10.2011 - 21:12
fuente
30

La recomendación clásica para un salt para el hashing de contraseñas es:

  • A valor aleatorio de 128 bits o más ;
  • obtenido a partir de un generador criptográfico de números aleatorios ( /dev/random o /dev/urandom en los Unixes modernos );
  • único para cada entrada (es decir, no reutilice el mismo salt, genere un nuevo salt para cada nueva contraseña);
  • almacenado en texto sin formato en la base de datos (para que la sal esté disponible al verificar el hash).

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) .

    
respondido por el Jesper Mortensen 10.10.2011 - 23:37
fuente
10

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.

    
respondido por el Robert David Graham 12.10.2011 - 08:40
fuente
1

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.

    
respondido por el Michał Šrajer 10.10.2011 - 20:17
fuente

Lea otras preguntas en las etiquetas