¿Cómo puede ser seguro un hash que contiene un algoritmo para elegir?

2

Estaba pensando en crear mi propia función hash + salt, algo como sha1(password + md5(login)) , luego leí aquí (parte 4) que crear su propia función hash + salt es una mala idea, porque si el pirata informático recupera el contenido de la base de datos y el código, puede entender el mecanismo detrás de él.

Así que leí el manual de PHP para las funciones password_hash() y password_verify() (apareció con PHP 5.5), primero no entendí por qué password_verify() solo acepta 2 parámetros (la contraseña real y su hash), luego vi esto en la documentación : el hash contiene El algoritmo a elegir .

Entonces, considero que decido almacenar este hash generado en mi base de datos, y un pirata informático que sabe cómo password_hash() trabaja para encontrar el contenido de mi base de datos, ¿no sería tan seguro como crear mi propia función hash + salt? ¿Por qué debería usar password_hash() / password_verify() ?

    
pregunta Gugelhupf 28.07.2015 - 17:17
fuente

3 respuestas

2

Consulte this para obtener una introducción al hashing de contraseñas.

El atacante puede suponer que su método ("sha1 (contraseña + md5 (inicio de sesión))") no es un problema . Bueno, es un problema indirecto . Idealmente, un "algoritmo secreto" lo protegería incluso si dicho algoritmo secreto fuera extremadamente débil, porque el atacante aún no sabría los extremos o las colas de lo que hace. Desafortunadamente, los algoritmos no se pueden mantener en secreto; y, aún más desafortunadamente, su sugerencia específica es extremadamente débil.

Hay dos problemas principales en tu sugerencia:

  • El nombre de inicio de sesión es un error, porque no cambia cuando el usuario cambia su contraseña; y también, los mismos nombres de inicio de sesión pueden aparecer en varios sistemas, lo que hace que valga la pena calcular previamente los hashes para el inicio de sesión 'admin'.
  • Todo es demasiado rápido. Una GPU básica disponible podrá probar miles de millones (literalmente) de contraseñas por segundo. No muchas contraseñas de usuario resisten por mucho tiempo a ese ritmo.

Luego está el problema más conceptual que es que estás "rodando tu propio cripto", que se sabe que es una mala idea. El problema con crypto es que no puede probar la seguridad: no hay forma de determinar si lo que produjo es seguro o no. Las pruebas funcionales pueden decirle si su sistema funciona , no si resiste los ataques. Para evaluar la seguridad de un algoritmo o protocolo criptográfico, la mejor manera (que no es necesariamente buena, pero no tenemos mejor) es publicarla y dejar que docenas de criptógrafos intenten romperla durante algún tiempo (contada en años, porque < em> no puedes apresurar el arte ). Si el algoritmo sobrevive a 5 años de intentos activos, entonces es probable que sea bueno, o al menos no trivialmente débil.

    
respondido por el Thomas Pornin 28.07.2015 - 20:11
fuente
0

Ha entendido mal la razón por la que no debería intentar rodar su propio procedimiento de hashing de contraseñas: no es que conocer los detalles del algoritmo pueda llevar a alguien a entender el mecanismo detrás de él (de hecho, se espera que: vea principio de Kerechoff ), es que escribir un buen criptografía es difícil.

Como ejemplo, la función que propusiste es débil: no estás usando salt aleatorio y no son estirando sus llaves , dos fallas que hacen que su algoritmo sea vulnerable a ataques de fuerza bruta por parte de cualquiera que tenga acceso a su base de datos.

    
respondido por el Stephane 28.07.2015 - 17:32
fuente
0

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.

    
respondido por el SilverlightFox 28.07.2015 - 17:36
fuente

Lea otras preguntas en las etiquetas