La seguridad en una función hash no es que el mecanismo sea desconocido, es que la función hash ha demostrado ser segura a lo largo del tiempo. Por ejemplo, la distribución uniforme en el espacio clave, y tiene propiedades criptográficas como la resistencia a la colisión, la resistencia de preimagen y la resistencia de segunda preimagen. Para el hashing de contraseña, no importan las propiedades de resistencia a la colisión y la segunda resistencia de preimagen, solo es importante la resistencia de preimagen preimage :
para esencialmente todas las salidas preespecificadas, es
computacionalmente inviable para encontrar cualquier entrada que hash a ese
salida
No se puede demostrar que una función hash desarrollada en casa tenga tales propiedades sin los ojos de otros criptógrafos para analizar correctamente su algoritmo.
Un algoritmo de hashing seguro no se puede revertir si se usa con un salt. La única forma en que un atacante puede descubrir la contraseña para obtener el hash y su sal es adivinar la contraseña. Es decir, calcularán cada conjetura y descubrirán si la contraseña se hash a la misma contraseña cuando se agrega el salt.
El uso de password_hash
en PHP sin el parámetro $algo
siempre usará el algoritmo más seguro en ese momento. Un algoritmo de hashing seguro es lento , de modo que si un atacante logra obtener el hashes y el salt, tiene que esperar mucho tiempo para ejecutar sus conjeturas de contraseña. Por lo tanto, un usuario real que inicie sesión debe esperar 1 *
del algoritmo lento, digamos un segundo. Un atacante que intente 10 millones de conjeturas de contraseñas tendría que esperar 10,000,000 segundos. Debes asumir que tienen mejor hardware que tú, así que en realidad estas matemáticas no resisten, el punto es que un algoritmo lento ralentizará suficientemente su ataque. El algoritmo password_hash
actual, que es bcrypt, ha demostrado ser lento sin ningún acceso directo disponible para determinar si una conjetura de contraseña determinada da como resultado el hash de contraseña.