Ignorando la colisión y (segunda) resistencia a la preimagen, ¿qué hace que una función criptográfica de hash sea fuerte?

0

Con respecto a la resistencia contra el diccionario y los ataques de fuerza bruta para "crack" los hashes que contienen contraseñas, ¿qué determina la resistencia de una función criptográfica de hash? Dado que la resistencia a la colisión no es importante para el almacenamiento de contraseñas y, que yo sepa, todas las funciones populares de hash son lo suficientemente resistentes como para los ataques de pre-imagen y la segunda imagen previa para que sea un enfoque inviable, supongo que esos factores no lo hacen. realmente importa.

Lo primero que me viene a la mente es la cantidad de cálculos necesarios para calcular el hash (¿hay una palabra para esto?): cuanto mayor sea la cantidad, más tiempo tomará. ¿Hay algo mas? Longitud de bits? ¿La longitud de bits y la "cantidad de cálculo" están correlacionadas de alguna manera?

    
pregunta tsorn 13.09.2015 - 14:03
fuente

1 respuesta

2

Dado que el contexto de esto parece ser el descifrado de contraseñas y los hash criptográficos no son adecuados para almacenar contraseñas, la respuesta simple es simplemente "su pregunta es irrelevante".

Una buena función hash criptográfica tiene varios objetivos de diseño básicos:

  • Debería ser computacionalmente factible calcular un hash H (x) para algún valor de entrada x.
  • Cambiar un bit de la entrada debería cambiar todos los bits de salida con una probabilidad del 50%.
  • Dada solo la salida de hash, no debería ser computacionalmente viable recuperar ninguna información sobre la entrada (aparte de ataques genéricos como tablas de arco iris).
  • Dada una entrada x 1 , no debería ser computacionalmente factible encontrar otra entrada x 2 que satisfaga la condición H (x 1 ) == H (x 2 ), es decir, debería ser difícil encontrar colisiones.

Si bien estos objetivos básicos son ciertamente útiles, en realidad no cubren todos los requisitos de una buena función de almacenamiento de contraseñas. Para responder a su pregunta de manera más específica: el costo computacional grande o controlable ciertamente no es una característica de la mayoría de las funciones hash criptográficas "comunes".

Una buena función de almacenamiento de contraseña, junto con todo lo anterior, debe tener estos objetivos de diseño adicionales:

  • No debe ser determinista, es decir, dos contraseñas iguales para diferentes usuarios (u otras entidades) no deben dar como resultado el mismo hash de salida.
  • Debería implementar algún tipo de defensa contra ataques de precomputación (por ejemplo, tablas de arco iris)
  • Debería ser computacionalmente costoso forzar bruscamente la entrada original para todas las entradas del diccionario, excepto las triviales y comunes. Esto generalmente se controla mediante la implementación de un valor de costo, que permite la escala del rendimiento.
  • No debería haber una manera de producir más que ganancias de rendimiento despreciables utilizando compensaciones de tiempo / espacio.
  • El rendimiento de la función debe ser más o menos lineal en todas las arquitecturas, para evitar la aceleración por parte de las GPU, FPGA, etc., tal vez excluyendo el silicio diseñado específicamente.

Algunos de estos objetivos son similares a los implementados por funciones de derivación de claves (KDF) como PBKDF2, pero nuevamente estas funciones no están diseñadas para el almacenamiento de contraseñas, y en cambio se han apropiado para tales usos .

Aunque actualmente solo hay unos pocos diseños que implementan todo lo anterior, es un campo relativamente nuevo, por lo que se esperan trabajos futuros. Como cuestión de interés, el estado actual de la técnica para el almacenamiento de contraseñas, según PHC , es Argon .

    
respondido por el Polynomial 13.09.2015 - 15:30
fuente

Lea otras preguntas en las etiquetas