¿Es más seguro usar la concatenación de múltiples algoritmos hash?

24

¿Es más seguro en la práctica usar la salida de múltiples algoritmos hash en lugar de uno solo (asumiendo que el tamaño de salida es el mismo)?

Por seguro, en este contexto, me refiero a la protección contra las colisiones y la reversibilidad de la función.

Un ejemplo en particular sería usar 128 bits de SHA-512 más 128 bits de MD5 en lugar de 256 bits de SHA-512.

Mi intuición es que, en teoría, esto debilitaría la función, porque hay ataques conocidos contra MD5 que, efectivamente, reducirían el tamaño de salida de la función combinada. Sin embargo, en la práctica, es más difícil encontrar una colisión / inversión para ambos algoritmos al mismo tiempo , porque implicará un trabajo teórico adicional en lugar de usar el existente (o próximo) publicados ?

EDIT:

Para aclarar, simplemente estoy preguntando sobre las propiedades básicas de la irreversibilidad y la resistencia a la colisión, no sobre un uso particular de las funciones hash, como la derivación clave de contraseñas (hay una cobertura excelente sobre eso en otras preguntas) o el uso de la salida como identificadores únicos.

Otra forma de expresar esto sería "¿es una función hash definida como la concatenación de otras dos funciones hash mejores que esas?". Además, soy (algo) consciente de que, información teóricamente , no puede ser.

    
pregunta goncalopp 16.03.2015 - 13:23
fuente

3 respuestas

18

Desde el punto de vista de la resistencia a la colisión (encontrar dos mensajes en colisión) y la resistencia de la segunda imagen (encontrar un mensaje diferente en colisión con uno dado), la concatenación de múltiples hashes es al menos tan segura como la más fuerte de las hashes (Prueba: para cualquiera de las dos propiedades, cualquier ataque que rompa la concatenación puede convertirse en un ataque que rompa cada hash. Por ejemplo, los mensajes hipotéticos de colisión para el MD5 || SHA-512 de 640 bits también chocan para SHA-512 , por lo tanto, si SHA-512 es resistente a la colisión, entonces MD5 || SHA-512 es resistente a la colisión).

Desde el punto de vista de encontrar un hashing de mensaje en un valor determinado ([primera-] resistencia de preimagen), o encontrar un mensaje desconocido (posiblemente corto o de baja entropía) conocido por el hash a un valor dado (la situación en el hashing de contraseña ), es prudente considerar que la concatenación de múltiples hashes es insegura (posiblemente mucho peor que cualquiera de los hashes). Podemos crear hashes para que cada uno sea resistente a encontrar un mensaje desconocido (elegido al azar en algún conjunto demasiado grande para explorar) a partir de su hash, pero la concatenación es totalmente débil en contra de eso.

Para muchos hashes iterados que incluyen todos los hashes Merkle-Damgård (por lo tanto, MD5, SHA-1, los varios SHA-2), utilizando el concepto de multicolisiones, se puede demostrar que la concatenación de múltiples hashes no es mucho más segura contra Colisiones que las más fuertes de los hashes. Consulte Antoine Joux: Multicolisiones en funciones de hash iteradas. Aplicación a las construcciones en cascada , en el procedimiento de Crypto 2004.

El artículo anterior sugiere que entre usar 128 bits de SHA-512 más 128 bits de MD5 (o) usar 256 bits de SHA-512 , más adelante mucho más seguro. La única seguridad que tenemos sobre el primero es que no es peor que el SHA-512 truncado a 128 bits, que puede ser atacado en aproximadamente 2 hashes 64 , cuando esperamos que el último requiera aproximadamente 2 < sup> 128 hashes para atacar.

    
respondido por el fgrieu 17.03.2015 - 14:34
fuente
26

No mencionas para qué usas los hashes, pero parece probable que tu intención sea usarlo para verificar la contraseña.

Por lo tanto, el primer problema que hay que resolver es la inquietud de que un algoritmo dado podría ser susceptible de colisiones. Las colisiones no son una amenaza para los hashes de contraseñas, e incluso si un algoritmo fuera susceptible de colisiones, no lo debilita con el propósito de hash de contraseñas. Para el hashing de contraseñas, nos preocupan los ataques de pre-imagen en su lugar ... Poder encontrar la entrada que se usó para crear un hash determinado.

Hoy en día, el mecanismo principal para atacar los hashes de contraseña es un ataque de fuerza bruta basado en un diccionario. Has hash tantas entradas posibles como puedas, lo más rápido que puedas, para determinar qué entrada da como resultado el hash que estás intentando hacer coincidir. Por lo tanto, la característica más deseable de la función de hash de contraseña es la lentitud. Desea asegurarse de que el atacante tarde todo el tiempo posible en probar las entradas necesarias para encontrar la correcta.

Entonces, ahora que entendemos lo que estamos buscando, echemos un vistazo a su propuesta.

Si hash la contraseña dos veces, con SHA-512 y MD-5, y truncas a 128 bits de cada uno, y concaténalos juntos, para todos los propósitos y propósitos, le estás dando al atacante dos hashes con los que trabajar. En muchos casos, la seguridad de un hash no se reduce terriblemente por el truncamiento, siempre que la longitud resultante sea razonable, lo que probablemente sea de 128 bits.

Esto significa que está tomando dos funciones hash rápidas (SHA-512 y MD-5 son demasiado rápidas para ser algoritmos de hash de contraseña efectivos) y le ofrece al atacante la oportunidad de elegir cuál le gustaría usar para agrieta tu hash En este caso, ciertamente eligen MD-5 y alimentan entradas, truncan el hash a 128 bits, y lo combinan con la parte MD-5 de su hash, y tan pronto como tienen la coincidencia, hay cerca 100% de certeza de que también tienen el valor que necesitan para calcular la porción SHA-512 del hash en un solo intento.

Entonces, no solo esta construcción específica no mejora la seguridad, sino que, en realidad, la invalida significativamente. Si bien hay otras construcciones potenciales que podrían aumentar la seguridad, no es una cuestión simple hacerlo bien, por lo que si realmente desea una seguridad razonable, use una construcción probada como bcrypt con un factor de trabajo razonable.

    
respondido por el Xander 16.03.2015 - 14:19
fuente
12

Haciendo referencia a los primeros párrafos de este artículo: enlace

Si está pensando en escribir su propio código de hashing de contraseña, ¡no lo haga!

Comprendo que no consideras escribir tu propio código hash, sino que utilizas múltiples de los estandarizados para aumentar la seguridad. Sin embargo, esto te dará ninguna o ninguna ventaja.

Ratchet Freak ( enlace ) señala que su función hash solo sería tan segura como su función más débil en la cadena. También se sabe que los algoritmos más débiles chocan con mayor frecuencia y, por lo tanto, aumentan el riesgo de colisiones, lo que reduce su seguridad general.

Además, esto, como se mencionó, disminuirá la entropía en lugar de aumentarla.

Tampoco hay ninguna razón por la que prefiera seguir adelante e implementar dos métodos diferentes y combinarlos. En la práctica, no habrá ninguna ganancia o muy poca. SHA-512 de 256 bits será más fuerte que dos hashes combinados de 128 bits, ya que la entropía aumenta y en general es más fuerte. MD5 contendrá una entropía más baja y, por lo tanto, disminuirá la seguridad.

EDIT

Para aclarar la respuesta:

SHA-512 es más fuerte que MD5 (para el recuento de bits que se mencionó, 256 y 128) para el caso mencionado. MD5 es más probable que resulte en colisiones. ( enlace )

  

128 bit MD5 y 128 bit SHA512 vill solo ser como   resistente a las colisiones como el más débil de los dos: el MD5 de 128 bits.   ( enlace )

     

EDIT

     

Como lo señaló fgrieu en los comentarios, esto no es cierto.

     
    

Como ilustración, podemos encontrar nuevas colisiones MD5 a alta velocidad, pero no se conoce ninguna colisión para SHA512 truncado a 128 bits, por lo tanto no se conoce colisión para la concatenación de 256 bits de MD5 y SHA512 truncado a 128 bits. - fgrieu

  

La única forma en que podría ser beneficioso es la protección contra Rainbow Tables, que probablemente no estaría preparada para la concentración de hash. En lugar de concentrar los hashes, se deben usar sales. Pero como no estaba interesado en la parte de seguridad de la contraseña de las cosas ( "No tengo ninguna intención en particular, y esperaba tratarlo como simplemente otra función hash" )

Puntos mencionados en los comentarios.

  • Para reducir las colisiones, la concatenación es mejor (porque necesita colisiones en ambos hashes simultáneamente). Para reducir los ataques de preimagen, el encadenamiento es mejor (porque necesita revertir ambos hashes en secuencia). - Ben Voigt
respondido por el Alex 16.03.2015 - 13:56
fuente

Lea otras preguntas en las etiquetas