2009-02-11 12 views
5

Tengo un sitio web donde los usuarios pueden cargar 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ó?"¿Está utilizando 2 funciones de hash diferentes una buena manera de verificar la integridad del archivo?

Un ejemplo: para contenido de userfile.jpg, MD5 hash es 39f9031a154dc7ba105eb4f76f1a0fd4 y SHA-1 hash 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 puede obtener una colisión hash - ¿podría suceder esto con dos algoritmos de hashing diferentes a la vez?)

O está calculando dos hash diferentes para un archivo inútil (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 desapercibido (birthday attack 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 los comentarios ".

+0

No tengo conocimiento de ninguna vulnerabilidad en SHA1, a diferencia de MD5. Entonces, ¿por qué no solo vuelcas MD5 y usas SHA1? –

+0

@Paul Tomblin: Sí, probablemente vaya con SHA-algo :) Editado para reflejar esto. – Piskvor

+0

Como dice Bruce Schneier, ya hay suficientes sistemas rápidos e inseguros. – MichaelGG

Respuesta

7

MD5 es probablemente seguro para lo que está haciendo, pero no hay razón para seguir usando un hash con defectos conocidos. 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 hacer frente a un malentendido aparentemente todavía común: Encontrar una colisión aleatoria en un hash no es una probabilidad 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. Vea birthday attack para más detalles.

+0

también, usar dos hashes no agrega la cantidad de bits que se ponen exponencialmente más duros. agrietar dos hash al mismo tiempo es tan fácil (o difícil) como agrietar cada uno por separado. zanja MD5, ve por SHA-x solo. – Javier

+1

"Encontrar una colisión aleatoria en un hash no es una probabilidad 1/2^n" Verdadero si el objetivo es obtener un par de documentos colisionados. Falso si el objetivo es encontrar un documento que colisione con un documento dado. –

+0

@Jason S: Esto no descarta el escenario 1) generar dos documentos colisionados, 2) escribir uno 3) sobrescribir con el otro 4) beneficio. (asumiendo una función vulnerable, por ejemplo MD5) – Piskvor

4

Verificar el hash MD5 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 perderá con solo la comprobación de MD5 que es extremadamente remota.

Tenga en cuenta que, en términos de escalabilidad, la comprobación adicional agrega carga innecesaria en su servidor.

1

En general, si los valores 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.

Pienso 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 mucho que veas una corrupción tan sorprendente de un archivo como para conducir a un perfecto colisión.

Nota: Ignore las cosas acerca de que la verificación es un problema; 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, ese es qué significaba, entonces lo que dije todavía se aplica, creo.

+0

No era lo que tenía en mente originalmente, pero es un buen punto: si los archivos se pueden descargar, puedo proporcionar sumas de comprobación para los usuarios, ya que están precalculados. ¡Buena idea! – Piskvor

1

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 los algoritmos están 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 valores hash diferentes, está protegido muy bien contra ataques intencionales en uno de los algoritmos.

EDITAR: Después de algunas investigaciones, me encontré con Wikipedia Note 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 operations en este momento.

+0

Excepto que MD5 ha tenido problemas y ya ha provocado ataques de colisión en el mundo real. – MichaelGG

+2

Además, una colisión aleatoria no es 1/2^n, es aproximadamente 1/2^(n/2). Ver la paradoja del cumpleaños. – MichaelGG

1

Dado que los dos hash se calculan de forma diferente, dos archivos con el mismo hash MD5 no tienen más probabilidades de tener 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, se pasa 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.

2

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 del archivo (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 la búsqueda de fuerza bruta ("resistencia a la colisión" de MD5 se ha roto).

Pero no es (por lo que 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 un bruto búsqueda de fuerza (MD5 todavía tiene "resistencia de preimagen"). (La distinción es como la diferencia entre ir a una fiesta y encontrar 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 puede idear un algoritmo para crear documentos que coincidan con un hash arbitrario MD5 y un hash aritmético SHA1.

Esto suena como la tensión entre las dos máximas "no coloque todos sus huevos en una canasta" frente a "ponga todos sus huevos en una canasta y mire 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 el tiempo de la CPU calculando uno hash seguro de 256 bits en lugar de dos hash menos seguros de 128 bits utilizando 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, de nuevo, si esto solo es integridad para proteger contra errores, un hash MD5 está bien.

edición: citar algunas fuentes útiles: 1 2 3, "MD5 considered harmful today", RFC4270, NIST's latest update on the SHA-3 competition y "The SHA-3 Zoo".

+0

Exactamente. MD5 es seguro para algunas cosas, pero sin detalles, no hay razón para usarlo. – MichaelGG

Cuestiones relacionadas