¿MD5 sigue siendo lo suficientemente bueno como para identificar archivos de forma exclusiva?

139

¿El hashing MD5 de un archivo todavía se considera un método lo suficientemente bueno como para identificarlo de manera única debido a la ruptura del algoritmo MD5 y problemas de seguridad, etc.? La seguridad no es mi principal preocupación aquí, pero sí la identificación única de cada archivo.

¿Alguna idea?

Ranhiru Jude Cooray
fuente
2
Actualmente lo estoy usando en una de mis aplicaciones y, por lo que sé, es lo suficientemente bueno como para identificar archivos de manera única.
No disponible el
2
Es probable que encuentre útil esta pregunta: stackoverflow.com/questions/862346/… .
Sharptooth
¿Cuántos archivos necesitas identificar? Produce 128 bits, por lo que si está tratando de identificar algunos miles de archivos, está bien. Pero si está intentando identificar mucho más que eso, es posible que se encuentre con colisiones / la paradoja del cumpleaños.
Marcin
Van a ser archivos de imagen, jpg, png y gif. Y sí, creo que el límite sería unos pocos miles ... ¿Pero cuántos archivos crees que me causarán problemas?
Ranhiru Jude Cooray

Respuestas:

89

Si. MD5 se ha roto por completo desde una perspectiva de seguridad, pero la probabilidad de una colisión accidental sigue siendo muy pequeña. Solo asegúrese de que los archivos no sean creados por alguien en quien no confíe y que pueda tener intenciones maliciosas.

Marcelo Cantos
fuente
2
@ninguno: para su primera pregunta, vea aquí . Me temo que no entiendo las otras preguntas.
Marcelo Cantos
9
@ 0xA3: Ni usted ni yo tenemos idea de a qué archivos se refiere el OP, ni a cuánto daño causaría un compromiso. Podría ser la colección de fotos para bebés de sus hijos, por lo que sabemos. Mi objetivo es proporcionar los hechos; lo que alguien más hace con ellos es asunto suyo. Considere también que Bruce Schneier recomienda escribir su contraseña; No todo debe almacenarse en Fort Knox. Algunas cosas se mantendrán bien debajo de la maceta.
Marcelo Cantos
3
@ Marcelo Cantos, creo que lo que falta aquí es una diferenciación o desempaquetado del término 'seguridad'. Obviamente, las personas asumen 'seguridad' para cualquier uso de trabajo de suma de verificación, pero la nomenclatura que Marcelo probablemente significa es 'en un laboratorio'.
hpavc
55
Estoy totalmente en desacuerdo. Un valor hash diferente indica que los archivos son diferentes. Pero para un valor hash igual: no puede decir "es muy probable que ambos sean iguales" si el hash es el mismo: solo puede comparar byte por byte. Un hash es muchos órdenes de magnitud más pequeño que el número de valores diferentes para todo el archivo, por lo que hay muchas, muchas, muchas posibles colisiones para cada valor de hash. Solo si está en el caso de copiar un archivo conocido (con un hash conocido), un valor de hash idéntico "probablemente significa" que el segundo se copió correctamente (incluso entonces, no es 100% seguro, pero muy probable).
Olivier Dulac
3
OK, mis matemáticas apestan. Los GUID tienen aproximadamente 122 bits de entropía, por lo que la probabilidad de una colisión en cualquier lugar de mil millones de archivos es de aproximadamente 2 ^ (2 * 30 - 122) = 2 ^ -62. Si bien esto es mucho más alto que mi cálculo original, todavía es minúsculo en aproximadamente uno de cada 4 quintillones.
Marcelo Cantos
32

Para fines prácticos, el hash creado puede ser adecuadamente aleatorio, pero en teoría siempre hay una probabilidad de colisión, debido al principio de Pigeonhole . Tener diferentes hashes ciertamente significa que los archivos son diferentes, pero obtener el mismo hash no significa necesariamente que los archivos sean idénticos.

El uso de una función hash para ese propósito, sin importar si la seguridad es una preocupación o no, por lo tanto, siempre debe ser solo el primer paso de una verificación, especialmente si se sabe que el algoritmo hash crea fácilmente colisiones. Para averiguar de manera confiable si dos archivos con el mismo hash son diferentes, tendría que comparar esos archivos byte por byte.

Stapeluberlauf
fuente
16
@Ranhiru. No. El hash le da un valor de 'resumen' que (para MD5) tiene solo 16 bytes de longitud. Para garantizar que los archivos sean idénticos, deberá realizar una comprobación byte por byte. Esto es cierto, independientemente del algoritmo hash que elija, siempre existe la posibilidad de una colisión.
PaulG
66
@Ranhiru. Vuelva a leer esta respuesta, es en mi opinión la más completa aquí. El hash podría usarse como un primer paso, lo que le permite tener una certeza del 99,99% de certeza de que los archivos son idénticos, pero si desea estar absolutamente seguro al 100% , deberá realizar una comprobación byte por byte. Esto es cierto si usa MD5, SHA o cualquier otro algoritmo.
PaulG
77
Esta respuesta es incorrecta. La prevención de la manipulación y la verificación de la unicidad son lo mismo. Además, aunque el hash no garantiza la unicidad, tampoco lo hace la comparación real. De hecho, la probabilidad de que un hash choque accidentalmente es en realidad menor que la probabilidad de que la comparación falle debido a fallas en la CPU generadas por las emisiones normales de rayos gamma solares. Y no olvide que a menudo la única fuente del archivo se encuentra en el otro lado del mundo dentro de un servidor web, y la única información independiente que tiene para fines de comparación es el hash.
Marcelo Cantos
8
@Marcelo. No soporta el razonamiento lógico de que la colisión accidental es menos probable que los cambios de bits accidentales (al hacer una comparación byte por byte). Todavía tiene la misma posibilidad de cambios de bits al construir el hash (y posiblemente más porque implica más tiempo de procesamiento). @Thomas planteó el punto originalmente para sugerir que no hay una forma garantizada de identificar la unicidad, aunque el impacto de los cambios de bits es muy discutible. La estimación más pesimista es 1 volteo por GB / hora, y la RAM ECC eliminaría incluso eso.
PaulG
2
"La probabilidad de que un hash choque accidentalmente es en realidad menor que la probabilidad de que la comparación falle debido a fallas en la CPU generadas por las emisiones normales de rayos gamma solares" [cita requerida]
endolito
20

MD5 será lo suficientemente bueno si no tienes adversario. Sin embargo, alguien puede (a propósito) crear dos archivos distintos que se combinan con el mismo valor (que se llama colisión), y esto puede o no ser un problema, dependiendo de su situación exacta.

Dado que saber si las debilidades conocidas de MD5 se aplican a un contexto dado es un asunto sutil, se recomienda no usar MD5. El uso de una función hash resistente a colisiones (SHA-256 o SHA-512) es la respuesta segura. Además, el uso de MD5 es una mala relación pública (si usa MD5, prepárese para tener que justificarse, mientras que nadie cuestionará su uso de SHA-256).

Thomas Pornin
fuente
2
Esta respuesta puede ser un poco engañosa si el lector no está muy familiarizado con el hash. El SHA no tiene nada de mágico que evite las colisiones de hash, simplemente son más resistentes a los ataques de colisión de hash . Si desea estar más de 99.999 ^ e% seguro de que los archivos son idénticos, aún necesitaría una verificación byte por byte.
PaulG
77
En realidad, una comparación byte a byte puede fallar debido a que un rayo cósmico se voltea un poco (por ejemplo, transformando a return 0;en a return 1;). Esto es muy poco probable, pero el riesgo de una colisión con SHA-256 es aún menor que eso. Matemáticamente, no puede estar seguro de que dos archivos que tengan el mismo valor hash sean idénticos, pero tampoco puede estar seguro de eso al comparar los archivos, siempre y cuando utilice una computadora para la comparación. Lo que quiero decir es que no tiene sentido ir más allá de 99.999 ... 9% de certeza, y SHA-256 ya ofrece más que eso.
Thomas Pornin
2
¿Qué, no usas memoria ECC? ;). Buen comentario, pensamientos muy interesantes.
PaulG
1
¡No olvides el sombrero de papel de aluminio! Más en serio, ¿cómo sabes estos datos sobre colisiones y has verificado esto de alguna manera?
James P.
@ThomasPornin Los cambios de bits de rayos cósmicos también afectarían el método MD5, por lo que aún es peor.
endolito
9

Un md5 puede producir colisiones. Teóricamente, aunque altamente improbable, un millón de archivos seguidos pueden producir el mismo hash. No pruebe su suerte y verifique las colisiones md5 antes de almacenar el valor.

Personalmente, me gusta crear md5 de cadenas aleatorias, lo que reduce la sobrecarga de hashing archivos grandes. Cuando se encuentran colisiones, itero y vuelvo a hacer hash con el contador de bucle adjunto.

Puede leer sobre el principio del casillero .

afilina
fuente
6

No lo recomendaría Si la aplicación funcionara en un sistema multiusuario, podría haber un usuario, que tendría dos archivos con el mismo hash md5 (podría ser ingeniero y jugar con dichos archivos, o simplemente sentir curiosidad: se pueden descargar fácilmente desde http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , yo mismo al escribir esta respuesta descargué dos muestras). Otra cosa es que algunas aplicaciones pueden almacenar tales duplicados por cualquier razón (no estoy seguro, si existen tales aplicaciones pero existe la posibilidad).

Si está identificando de manera única los archivos generados por su programa, diría que está bien usar MD5. De lo contrario, recomendaría cualquier otra función hash donde todavía no se conozcan colisiones.

tach
fuente
2

Personalmente, creo que las personas usan sumas de verificación sin procesar (elija su método) de otros objetos para actuar como identificadores únicos, demasiado cuando realmente quieren hacerlo es tener identificadores únicos. La toma de huellas dactilares de un objeto para este uso no era la intención y es probable que requiera más pensamiento que usar un mecanismo de integridad uuid o similar.

hpavc
fuente
0

MD5 se ha roto, podría usar SHA1 en su lugar (implementado en la mayoría de los idiomas)

Guillaume Lebourgeois
fuente
Esta es una respuesta perfectamente buena. MD5 es inaceptable para casos de uso en Derecho y Contabilidad en Europa desde mayo de 2018 en adelante.
Bert Sinnema
@BertSinnema, ¿podría indicarme la fuente que define qué funciones hash son aceptables, etc., por favor?
berezovskyi
@GregSchmit tal vez porque a OP no le importaba la fuerza criptográfica per se. Comprendí la pregunta como "Ya uso MD5 en un contexto que no es de seguridad, ¿necesito pasar tiempo para actualizar el código? Tipo de cosa. Y en este contexto, la respuesta probablemente fue incorrecta y SHA1 también se ha roto desde entonces.
berezovskyi
0

Cuando se combinan cadenas (o archivos) cortos (<unas pocas K?), Se pueden crear dos claves hash md5, una para la cadena real y otra para el reverso de la cadena concatenada con una cadena asimétrica corta. Ejemplo: md5 (reverse (string || '1010')). Agregar la cadena adicional asegura que incluso los archivos que consisten en una serie de bits idénticos generan dos claves diferentes. Por favor, comprenda que incluso bajo este esquema hay una posibilidad teórica de que las dos claves hash sean idénticas para cadenas no idénticas, pero la probabilidad parece extremadamente pequeña, algo en el orden del cuadrado de la probabilidad de colisión md5 individual, y el ahorro de tiempo puede ser considerable cuando el número de archivos está creciendo. También se podrían considerar esquemas más elaborados para crear la segunda cadena,

Para verificar las colisiones, se puede ejecutar esta prueba para determinar la unicidad de las claves hash md5 para todos los bit_vectors en una base de datos:

seleccione md5 (bit_vector), count (*), bit_and (bit_vector) de db con el
grupo bit_vector por md5 (bit_vector), bit_vector que tiene bit_and (bit_vector) <> bit_vector

Marco Polo
fuente
Idea inteligente. Si un "atacante" crea un archivo falso con el mismo hash md5, no servirá de nada a menos que conozca su "salazón", y revertir el contenido crearía un hash diferente. Usar teclas de 2 md5 como esas reduciría mucho las probabilidades. Si es solo para evitar un "ataque" usando una sal antes de calcular localmente será suficiente.
Wolf5
0

Me gusta pensar en MD5 como un indicador de probabilidad al almacenar una gran cantidad de datos de archivo.

Si los valores hash son iguales, sé que tengo que comparar los archivos byte por byte, pero eso podría suceder solo algunas veces por una razón falsa; de lo contrario (los hashes no son iguales), puedo estar seguro de que estamos hablando de dos archivos diferentes .

Shimmy Weitzhandler
fuente