Rondas en una función hash

1

En primer lugar, ¡Hola! Soy nuevo en el sitio, no sé ningún equivalente en inglés a "yoroshiku".

Entonces, estaba leyendo la documentación del generador de cifrado SHA-512 y encontré la parte:

  

El número predeterminado de rondas para ambos algoritmos es 5,000. Para asegurar   Mínima seguridad y estabilidad por otro lado, mínimo y máximo.   se aplican los valores de N:

     

mínimo para N = 1,000

     

máximo para N = 999,999,999

Bery es interesante, ya que, en mi humilde mente, si se aplica a muchas rondas en una función de hash, podría terminar con una colisión que lo lleve de nuevo al cuadrado del hash.

¿Estoy en lo correcto? ¿O es incorrecto mi comprensión de las colisiones?

A mi modo de ver, ambos pueden provocar una colisión con textos simples demasiado largos o con demasiadas aplicaciones de la misma función de hashing.

Lo siento por cualquier error gramatical, no soy un hablante nativo de inglés.

    
pregunta WOkzinhan 24.01.2017 - 17:15
fuente

3 respuestas

4

Creo que en este contexto, yoroshiku se puede representar como la esperanza de una presencia larga y productiva en Security.StackExchange :-). Así que, ¡Bienvenido!

Usted es parcialmente correcto en su comprensión del problema de colisión; el riesgo existe, pero si el algoritmo tiene una salida "plana" suficiente, el riesgo es esencialmente el mismo, independientemente del número de rondas.

La "seguridad" que se incrementa al incrementar el número de rondas es la garantía de que cualquier persona que intente generar grandes cantidades de hashes (por ejemplo, para un ataque de fuerza bruta) requerirá una cantidad de potencia de cálculo adecuadamente improbable.

Digamos que SHA-512 con 10,000 rondas cuesta diez veces más que SHA-512 con 1,000 rondas. Luego, enumerar los hashes redondos de 10K para cualquier propósito tomará diez veces más tiempo que con los hashes redondos de 1K.

Por lo general, en la mayoría de las aplicaciones, el "escenario del día feliz" implica solo una llamada una a la función hash (por ejemplo, hashing la contraseña suministrada por el usuario). Por lo tanto, podemos usar un número alto y aún así permitir que el usuario experimente un retraso insignificante.

  

A mi modo de ver, ambos pueden provocar una colisión con textos simples demasiado largos o con demasiadas aplicaciones de la misma función de hash

Sí, pero solo estás comparando llamadas con el mismo número de rondas . Digamos que, por ejemplo, el hash de 10K de "foo" es abcdef, y el hash de 1K de "barra" es demasiado abcdef. Esto es una especie de colisión.

Pero cuando se ejecuta el sistema, no utilizará el resultado de hash en cada ronda; esperará hasta que haya completado la ronda 10K antes de devolver el hash. Nunca sabrá que se generó una "colisión" en la ronda 1.000.

    
respondido por el LSerni 24.01.2017 - 17:39
fuente
0

Actualicemos un poco tu comprensión de los algoritmos hash.

Las funciones de hash pueden ser criptográficamente seguras o no. Las funciones hash no seguras son útiles para tareas como mapeo de cadenas, detección de errores en protocolos de comunicaciones, por lo que aún tienen un lugar. Pero no son útiles para propósitos criptográficos, porque tienen ciertas debilidades.

Para estar seguro, una función de hashing debe tener estos tres atributos específicos:

  • Cambios en cascada: un cambio de un bit en el mensaje debe resultar en un cambio impredecible de aproximadamente el 50% de los bits en el resumen.
  • No reversible: no puede volver a crear un mensaje dado el hash, excepto por ataque de fuerza bruta.
  • Resistencia a colisiones: no es posible encontrar dos mensajes con el mismo valor hash.

En su esencia, el efecto de cascada es el atributo más importante, ya que proporciona la fuerza detrás de los otros dos atributos.

Cada uno de estos atributos protege contra cierto tipo de ataque. Al ejecutar una ronda de hash, el algoritmo de cifrado realiza al menos un cambio de bit en el mensaje, lo que resulta en un hash completamente nuevo. Si el algoritmo hash no tuviera una fuerte resistencia a la colisión, entonces sí, sería posible tener múltiples rondas que no cambien mucho el hash.

No tener resistencia a la colisión ha sido un problema con las rutinas hash no criptográficas como CRC-32, donde si el mismo mensaje se altera solo ligeramente, puede producir el mismo valor de resumen. Entonces, si una fuente está extrayendo datos que varían solo unos pocos bytes, es posible que algunos puedan colisionarse y dejarlo en el círculo que describió. Es por eso que estos atributos son tan importantes para fines de seguridad.

    
respondido por el John Deters 24.01.2017 - 17:41
fuente
0

La función de hashing puede tener un ciclo corto o un punto fijo. Un punto fijo es un valor para el cual hash(value) == value . Esto reduce en gran medida la seguridad de un hash iterativo, porque cualquier iteración realizada después de alcanzar el punto fijo ya no cambia nada.

Para resolver esto, el hash también puede usar el recuento de iteraciones como parte del hash:

hash = hmac(password, salt)
for (i = 0; i < iter_count; i++) {
    hash = hmac(password, hash + i)
}
return hash

Otra solución, que usa PBKDF2, es XOR todos los hashes intermedios juntos en el resultado.

Los ciclos de hash y los puntos fijos son un riesgo teórico. La posibilidad de golpear uno es muy baja, y no se conocen ciclos conocidos para funciones hash como SHA1.

    
respondido por el Sjoerd 24.01.2017 - 20:30
fuente

Lea otras preguntas en las etiquetas