Me preguntaba si los hashes diferentes (por ejemplo, md5 (sha1 ($ data)) ) se usan juntos para la seguridad de los datos y si existe algún motivo (respuesta positiva o negativa).
El uso de dos funciones hash juntas, como una seguridad adicional contra la violación de una de las funciones, es delicado. Concatenación (los datos se resumen con ambas funciones hash, los resultados están concatenados) produce una resistencia a la colisión equivalente al menos a la más fuerte de las dos funciones (y, sorprendentemente, no es realmente mejor que eso) ; por otro lado, la concatenación hace que la resistencia de preimagen no sea mejor que la más débil de las dos funciones. Composición (los datos se combinan con una función y el resultado se combinan con la otra función) ofrece lo contrario: la resistencia de preimagen es al menos tan buena como la más fuerte de las dos funciones (sujeto a alguna definición sutilezas, dependiendo de si desea resistencia contra la recuperación de los datos que se usaron, o simplemente cualquier mensaje que produzca el mismo resultado), pero para las colisiones, la función más débil define la resistencia general.
Por lo tanto, combinar dos funciones hash juntas es, en el mejor de los casos, una bendición mixta. SSL / TLS , hasta TLS 1.1, combina MD5 y SHA-1 en su "PRF" interno, que se usa especialmente como una función de derivación de claves (para extender el secreto negociado a claves para el cifrado simétrico y el control de integridad); ambas funciones se utilizan en HMAC y luego se convierten en PRNG personalizado, y las dos secuencias generadas se XORed juntas. La intención era tener una función de derivación clave que resista las roturas criptoanalíticas de MD5 o SHA-1 (si esto realmente funciona no se ha demostrado formalmente; realmente depende de la naturaleza de la "ruptura"). Es interesante observar que TLS 1.2 vuelve a usar una función hash única (configurable). Combinar dos funciones hash juntas significa que tiene que implementar ambas, lo cual es un problema para los sistemas integrados que a menudo tienen fuertes restricciones en el tamaño del código.
Así que el consejo habitual es: no lo hagas. Es difícil hacerlo bien, e incluso si no presenta ninguna debilidad, no está claro si realmente gana algo de esa manera, en cuanto a seguridad. Por otro lado, hay costes operativos claros. Parece mejor usar una única función hash mejor (lo que significa: ditch MD5 y SHA-1, simplemente use SHA-256 en su lugar), con agilidad de algoritmo (haga que la función hash sea configurable, para que podría cambiarlo más adelante).
Echa un vistazo a esta pregunta en Crypto.SE. Hay algunas sutilezas con este tipo de construcción. Por ejemplo, una colisión para sha1 (la función hash más interna) en tu ejemplo produce inmediatamente una colisión para toda la cosa.
Sorprendentemente, la concatenación de hashes es segura, ya que es el más débil de los hashes que usas cuando se trata de ataques de preimagen (es decir, dado x = hash (m), encuentra m 'tal que hash (m') == x , donde m 'podría ser igual a m). Para colisiones, es bastante fuerte, sin embargo.
Como nota al margen, MD5 y SHA1 son débiles y no deben usarse en sistemas nuevos.
Lea otras preguntas en las etiquetas hash