¿Es una buena idea usar el nombre de usuario del usuario como una sal cuando se escribe un hash con una contraseña como hash (username_str + password_str)?

4

Estoy ayudando a mi amigo con el hashing de sus contraseñas, y tengo una pregunta: ¿Debería usar una cadena secreta como salt para el hashing o es mejor que cada usuario tenga su propia sal para el hashing?

Considera estos tres hashes:

hash("secretKey777" + password);
hash("secretKey777" + username + password);
hash(username + password);

¿Cuál es el más difícil de romper y el más seguro?

Creo que es mejor usar hash("secretKey777" + username + password); porque para cada usuario no solo tiene "secretKey777" como una sal, sino también su propio nombre de usuario. En el caso de un código que contenga las filtraciones de las contraseñas, no habrá ningún ataque en todos los hashes a la vez, cada uno tendrá su propia sal única.

    
pregunta bodacydo 11.10.2014 - 00:03
fuente

2 respuestas

5

La característica principal de un salt es que debe ser globalmente único para el hash de contraseña de cada usuario. No es necesario que sea secreto, y un nombre de usuario no cumplirá con los criterios de singularidad requeridos. Una cadena secreta compartida (utilizada para todos los usuarios) no es una sal, sino una pimienta, y no se ha demostrado que agregue seguridad sobre contraseñas sin sal, por lo que no es una opción viable.

Una construcción que tiene la propiedad de ser particularmente probable que sea única a nivel mundial son los datos aleatorios de longitud razonable. La sal no tiene que ser realmente aleatoria, pero un valor aleatorio, generado individualmente para cada usuario nos da una seguridad razonable de que tenemos la singularidad que necesitamos.

Hay un poco más en esta respuesta: ¿Qué se debe usar como sal?

    
respondido por el Xander 11.10.2014 - 00:21
fuente
0
  

Debería usar una cadena secreta como sal

No. Una sal de lado ancho codificada de manera rígida previene los ataques precalculados de la tabla del arco iris, pero estos no son realmente una preocupación importante en la actualidad. La principal ventaja de usar un salt aleatorio para cada contraseña con hash es que un atacante cuando Brute Forcing tiene que hashear cada contraseña con cada salt, en lugar de solo hashing una vez y verificar todas las contraseñas. Así que ralentiza el ataque en un factor igual al número de usuarios.

  

cada usuario no solo tiene "secretKey777" como una sal, sino también su propio nombre de usuario

No utilice los nombres de usuario como hashes. Realmente no afecta a la seguridad [*], pero tiene un efecto en la facilidad de uso y la capacidad de mantenimiento. ¿Qué pasa si un usuario quiere cambiar su nombre de usuario? Esto no sería posible con su enfoque.

[*] excepto por el punto @Xander . Es un impacto, pero es bastante bajo.

Entonces, ¿cuál es el enfoque correcto?

hash(password+ generateRandomSalt());

Y almacene la sal junto al nombre de usuario y contraseña en la base de datos. También puede usar una biblioteca que administre todo esto por usted (por ejemplo, si está usando PHP, password_hash usa bcrypt y administra las sales por usted).

    
respondido por el tim 11.10.2014 - 19:42
fuente

Lea otras preguntas en las etiquetas