Usando los últimos caracteres de hash como salt [duplicar]

3

En una discusión reciente, alguien mencionó el siguiente esquema de hashing:

passHash = sha256(password)
saltedHash = sha256(passHash+passHash.substr(-10)
finalHash = sha256(secret+saltedHash)

La contraseña está en hash, luego en hash nuevamente con los últimos 10 caracteres del hash anterior como 'sal'. Finalmente, se adjunta un secreto y todo se revisa nuevamente antes de guardarlo en la base de datos.

¿Qué tan seguro es esto? Sé que contraseñas iguales tendrán el mismo FinalHash. Pero aparte de eso, ¿qué tan malo es usar parte de la contraseña hash como sal? ¿Tener una sal secreta ayuda más tarde? ¿Qué tan malo es tener solo 3 iteraciones de sha256 en lugar de unos pocos miles? ¿Hay un ataque fácil que demuestre que este esquema de hash es una tontería?

    
pregunta Lincoln 18.08.2014 - 20:13
fuente

4 respuestas

17

No lo hagas. Las sales tienen que ser únicas, ese es su único requisito. Pero su enfoque no genera sales únicas, sino dependientes de la contraseña.

Un salt per-db-unique ayuda cuando es lo suficientemente largo (256 bits), y también hash en el nombre de usuario, pero eso aún deja problemas.

Tener solo 3 iteraciones de SHA256 no es la forma en que los hashes de contraseña deberían ser, aunque no solo "más alto es mejor". Si un atacante está ocupado haciendo muchas iteraciones de sha, no puede probar nuevas contraseñas. Asegúrate de usar PBKDF2 o similar para evitar nuevos ataques. Puede tomar el logaritmo por 2 del recuento de iteraciones y luego obtiene los 'bits de seguridad' adicionales para romper una contraseña. Las iteraciones le dan una compensación entre el poder de cómputo y la seguridad, pero a una tasa de conversión muy eficiente (1: 1 en lugar de 1: exp con longitud de contraseña).

Lo que estás haciendo es no hacer sal, es hornear una nueva función de hash de otra. Para cada usuario, crea una cadena aleatoria con 256 bits de entropía de un PRNG, y úsala como sal .

    
respondido por el user10008 18.08.2014 - 20:55
fuente
4

Respuesta corta: no lo hagas.

Salt se debe usar para proporcionar algo de seguridad contra las contraseñas de hash filtradas, ya que la misma contraseña tendrá el mismo hash, cuando no esté salada.

Si la sal es predecible, no hay ganancia.

Dado que no estás agregando ninguna entropía al hacer eso, no hay ganancia haciendo ese tipo de cosas.

Y como está usando un número muy pequeño de iteraciones, solo deja la SHA-256 demasiado rápida para ser utilizada en las contraseñas, propensa a toda la debilidad que dijo en su pregunta.

    
respondido por el woliveirajr 18.08.2014 - 20:57
fuente
1

Su "sal" no parece proporcionar ninguno de los beneficios que son el punto de usar una sal. Al usar su esquema, cada contraseña solo produce una salida única, por lo que un atacante que conozca su esquema (que debe asumir que sí) puede producir fácilmente una tabla de arcoiris de posibles hashes para que coincida con los de su base de datos.

Se supone que una sal previene esto, porque una sal diferente para cada contraseña significa que incluso si son la misma contraseña, el hash resultante será diferente, por lo que generar una tabla de arco iris es inviable, porque no solo debería contener un hash para cada contraseña posible, pero un hash para cada combinación posible de contraseña y salt.

Como han dicho otros, 3 iteraciones de SHA256 todavía se ejecutarán demasiado rápido. Debe utilizar un mecanismo que haya sido diseñado específicamente para las contraseñas de hash como BCrypt. Incluso cuando esté utilizando un mecanismo que sea adecuadamente lento, no debe atarse permanentemente a una sola velocidad o cantidad de iteraciones; Las velocidades de las computadoras siempre están aumentando y usted querrá aumentar la cantidad de iteraciones para mantenerse por delante de ellas. BCrypt te permite hacer esto sin romper los hashes existentes, ya que codifica la fuerza que se almacenará junto con la contraseña hash.

    
respondido por el Sean Burton 18.08.2014 - 23:43
fuente
1

En pocas palabras, el propósito de la sal es hacer hash diferente para la misma contraseña.

hash('password') == hash('password') // same password, same hash
hash('password'+salt#1) != hash('password'+salt#2) // avoid hash collision with salt

Ahora vamos a tomar su enfoque y expandirlo. Es equivalente a:

finalHash = sha256(secret+sha256(sha256(password)+sha256(password).substr(-10)))

Para una contraseña dada, esto devolverá el mismo valor cada vez. Esto es esencialmente una nueva función hash construida sobre sha256 . Eso significa que su tabla de credenciales tiene colisiones hash. Pero ya sabes eso. Pero sabes esto:

Esto significa que el atacante puede incluso encontrar el secret por la fuerza bruta (si el secreto es considerablemente más pequeño o la función hash tiene colisiones), porque siempre hay un grupo de usuarios que usan 'password' , '123456' , etc. para su contraseña. El atacante simplemente tiene que atacar contra los hashes más comunes en su base de datos de credenciales.

A partir de este punto, el encadenamiento de funciones hash no le dará mucha seguridad adicional, ya que cuatro llamadas a sha256 no tienen una sobrecarga práctica para un atacante que una sola llamada.

TL; DR: No hagas esto.

    
respondido por el Krumia 19.08.2014 - 06:59
fuente

Lea otras preguntas en las etiquetas