¿Cómo se deriva un sal aleatorio de la salida de password_hash (), dado que las funciones de hash son deterministas?

0

Con respecto a la función de PHP password_verify() , ¿cómo se deriva la sal aleatoria "no lavada" de la salida de password_hash() , dado que las funciones de hashing son deterministas? Me parece que, si la sal original puede derivarse del hash final, entonces la sal solo se usó para producir el hash final después de que la función hash haya completado su recuento de iteraciones. Si este es el caso, ¿para qué usar una sal en primer lugar? ¿Por qué no solo proporcionar un recuento de iteraciones arbitrarias (pero aún grandes)?

    
pregunta user1100793 27.03.2018 - 16:19
fuente

2 respuestas

4

password_hash y password_verify actualmente usan bcrypt o argon2 , los cuales usan formato de cadena PHC . La sal se incluye en el formato de hash. No se deriva por password_verify , está literalmente justo ahí en el hash que le das. Esto no es una debilidad porque no se requiere que la sal sea secreta, solo debe ser universalmente única.

Su confusión acerca de cómo password_verify obtiene la sal parece deberse a una terminología conflictiva. La palabra "hash" se usa a menudo para referirse a la cadena de formato PHC completa (incluido el identificador de la función de hash, los parámetros, la sal y el valor de hash real), así como la salida de hash real mediante una función de hashing.

Consulte aquí para saber por qué se usan las sales. Si quieres un secreto que un atacante debería saber para hacer hash de las contraseñas, se llama un pepper .

    
respondido por el AndrolGenhald 27.03.2018 - 16:55
fuente
0

Eche un vistazo a esta simplificación extrema de lo que sucede debajo del capó en PHP:

password_hash(password):
    salt = get_random_salt()
    hash = actual_hashing_function(salt + password)
    return salt + hash
password_verify(password, password_hash):
    salt, actual_hash = split(password_hash)
    compare_hash = actual_hashing_function(salt + password)
    return actual_hash == compare_hash

Como puede ver, password_hash no puede ser determinista como parte de la salida (la sal) depende de una función aleatoria. Sin embargo, actual_hashing_function es determinista.

La confusión aquí proviene de una terminología algo imprecisa. En un contexto de criptografía, "función hash" probablemente se refiere a algo como actual_hashing_function en el ejemplo, y un "hash" significa que es el resultado. Sin embargo, en un contexto más aplicado como la programación, "función hash" puede significar algo como password_hash y un "hash" es un resultado no determinista que incluye la sal.

    
respondido por el Anders 27.03.2018 - 17:24
fuente

Lea otras preguntas en las etiquetas