programacion - ¿Está utilizando 2 funciones hash diferentes una buena forma de verificar la integridad del archivo?
obtener hash de un archivo (6)
Tengo un sitio web donde los usuarios pueden subir sus archivos; estos se almacenan en el servidor y sus metadatos se registran en una base de datos. Estoy implementando algunas comprobaciones simples de integridad, es decir, "¿es el contenido de este archivo ahora byte por byte idéntico a cuando se cargó?"
Un ejemplo: para el contenido de userfile.jpg
, el hash MD5 es 39f9031a154dc7ba105eb4f76f1a0fd4
y el hash SHA-1 es 878d8d667721e356bf6646bd2ec21fff50cdd4a9
. Si el contenido de este archivo cambia, pero tiene el mismo hash MD5 antes y después, ¿es probable que el hash SHA-1 también permanezca igual? (Con hash, a veces puedes obtener una colisión hash, ¿podría suceder esto con dos algoritmos hash diferentes a la vez?)
¿O está computando dos hashes diferentes para un archivo sin sentido (y debería probar algún otro mecanismo para verificar la integridad)?
Editar: No estoy realmente preocupado por la corrupción accidental, pero se supone que debo evitar que los usuarios cambien el archivo sin que se note ( cumpleaños y amigos).
Probablemente vaya con un hash, SHA-512: los controles no suelen ser un cuello de botella de rendimiento y, de todos modos, "como dice Bruce Schneier, ya hay suficientes sistemas rápidos e inseguros". @ MichaelGG en el comentarios ".
Como estimación aproximada, la posibilidad de un falso positivo MD5 es 1 / (2 ^ 128), la probabilidad de un falso positivo SHA-1 es 1 / (2 ^ 160), por lo que la probabilidad de un falso positivo para ambos algoritmos es entre 1 / (2 ^ 128) y 1 / (2 ^ 288), pero puede estar bastante seguro de que está cerca de 1 / (2 ^ 288) ya que ambos algoritmos se han probado exhaustivamente estadísticamente.
Al menos, al usar dos hashes diferentes, estás protegido muy bien contra ataques intencionales en uno de los algoritmos.
EDITAR: Después de algunas investigaciones, me encontré con esta nota de Wikipedia que los ataques de cumpleaños MD5 se pueden hacer en menos de 1 minuto, por lo que parece mejor utilizar un algoritmo diferente como MD5 junto con SHA-1 aquí. Los ataques de cumpleaños para SHA-1 toman 2 ^ 69 operaciones en este momento.
Como los dos hash se calculan de forma diferente, no es más probable que dos archivos con el mismo hash MD5 tengan el mismo hash SHA-1 que dos archivos aleatorios. Si tu probabilidad de colisión aleatoria con hash es (estadio de béisbol) 2 ^ 128, tu probabilidad de colisión aleatoria en ambos será de 2 ^ 256.
En efecto, pasas de extremadamente bajo a extremadamente, extremadamente bajo.
Es el equivalente de pasar del cifrado de 128 bits a 256 bits para evitar que alguien adivine al azar su clave de 128 bits.
En general, si los hash MD5 no coinciden, el SHA1 (o cualquier otro hash similar) tampoco coincidirá. No voy a decir que no hay casos posibles en los que no podría suceder (porque todos sabemos que hay colisiones en ambos algoritmos), pero diría que probablemente nunca ocurra en su situación.
Mi opinión es que proporcionar un hash probablemente sea suficiente; más de un hash se vuelve difícil de verificar (tener que verificar que uno es suficientemente malo, dependiendo de las utilidades disponibles para la plataforma) , y dudo seriamente que veas una corrupción tan sorprendente de un archivo como para conducir a una colisión perfecta.
Nota: Ignore las cosas sobre la verificación siendo un dolor; Al volver a leer la pregunta, revisé esto: tomé el significado original de verificación de hash para los usuarios que descargan el archivo. Si, por supuesto, eso es lo que quería decir, entonces lo que dije todavía se aplica, creo.
MD5 probablemente sea seguro para lo que está haciendo, pero no hay razón para continuar usando un hash con fallas conocidas. De hecho, no hay ninguna razón por la que no deba usar SHA256 o SHA512, a menos que tenga algún cuello de botella de rendimiento importante conocido.
Editar: para aclarar, no hay ninguna razón para usar dos algoritmos; solo use uno que se adapte a lo que necesita. Si le preocupan las personas que le hacen colisiones MD5 (como en, ¿es esto una amenaza para la seguridad?), Utilice un algoritmo que no sea tan débil, como SHA256.
Editar 2: Para abordar un malentendido aparentemente todavía común: Encontrar una colisión aleatoria en un hash no es una probabilidad de 1/2 ^ n. Está más cerca de 1/2 ^ (n / 2). Entonces, un hash de 128 bits probablemente pueda colisionar con 2 ^ 64 intentos. Ver el ataque de cumpleaños para más detalles.
Para la integridad del archivo (por ejemplo, corrupción accidental / aleatoria), un hash debería ser suficiente. 128 bits = 2 -128 probabilidad de un error no detectado, que para todos los propósitos prácticos es lo suficientemente pequeño.
Para la integridad criptográfica de archivos (por ejemplo, la seguridad de que alguien no ha sustituido maliciosamente un archivo alternativo), creo que estás hablando de un enfoque de cinturones y tirantes.
MD5 se considera "débil" en el sentido de que es posible construir dos documentos con el mismo hash con una cantidad mucho menor de tiempo de CPU que el necesario para una búsqueda de fuerza bruta (se ha roto la "resistencia a la colisión" de MD5). )
Pero no es (hasta donde yo sé) "débil" desde el punto de vista, si tienes un documento X arbitrario, alguien más puede crear un documento Y con el mismo hash con un tiempo mucho más fácil que una búsqueda de fuerza bruta (MD5 todavía tiene "resistencia de preimagen"). (La distinción es como la diferencia entre ir a una fiesta y encontrar a dos personas con el mismo cumpleaños, o encontrar a otra persona con el mismo cumpleaños que el tuyo).
Incluso si MD5 está roto en ese sentido, es improbable que alguien pueda encontrar un algoritmo para crear documentos que coincidan con un hash MD5 arbitrario y un hash aritmético SHA1.
Esto suena como la tensión entre las dos máximas "no pongas todos tus huevos en una canasta" vs. "pon todos tus huevos en una canasta, y mira la canasta". O como gastar dinero en dos cerraduras de cerrojo contra una cerradura de cerrojo que es dos veces mejor y cuesta el doble. Idealmente, sería mejor pasar tiempo de CPU calculando un hash seguro de 256 bits en lugar de dos hashes de 128 bits menos seguros usando diferentes algoritmos. (sí, sé que SHA1 es de 160 bits, esto es solo una ilustración). Es más probable que obtenga un mejor rendimiento de esta manera para un nivel deseado de seguridad, es decir, si el hash de 256 bits no está roto. Si está roto, es posible que estés mejor con el enfoque de dos algoritmos solo para cubrir tus apuestas.
Pero nuevamente, si esto es solo integridad para protegerse contra errores, un hash MD5 está bien.
editar: para citar algunas fuentes útiles: 1 2 3 , "MD5 considerado dañino hoy" , RFC4270 , la última actualización del NIST sobre la competencia SHA-3 y "El zoológico SHA-3" .
Verificar el hash MD5 por sí solo es suficiente para la mayoría de los propósitos. Aunque si debe hacerlo, no hay ningún problema en verificar el SHA1 además. Tenga en cuenta la posibilidad de atrapar algo que se extrañaría con solo la comprobación de MD5 que es extremadamente remota.
Tenga en cuenta que, en términos de escalabilidad, la verificación adicional agrega carga innecesaria en su servidor.