¿Un hash o suma de comprobación criptográfica idéntico para dos archivos significa que son idénticos?


57

Tengo 2 documentos de Excel y quiero verificar si son exactamente iguales, aparte del nombre del archivo.

Por ejemplo, los archivos se llaman fileone.xlsy filetwo.xls. Además de los nombres de archivo, se presume que su contenido es idéntico, pero esto es lo que quiero verificar.

He estado buscando formas de revisar esto y sin instalar un montón de complementos. No parece un camino directo.

Intenté generar hash MD5 para ambos archivos. Cuando los hashes son idénticos, ¿significa esto que el contenido del archivo es 1: 1 igual?


8
los cifrados y, a veces, incluso los hash normales pueden ser útiles para comparar archivos en diferentes sistemas, o buscar entre una gran cantidad de archivos, pero si dos archivos están en el mismo sistema, puede compararlos fácilmente cmpen Unix o fc(comparar archivos) en Windows.
dave_thompson_085

10
shattered.io - SHA1 es un algoritmo de hash "más fuerte" que md5 y todavía shattered.io/static/shattered-1.pdf y shattered.io/static/shattered-2.pdf tienen el mismo valor de hash y son completamente diferentes.
espuma de poliestireno volar

30
Nota al margen: verifique sus tamaños primero. Si tienen diferentes tamaños, no se moleste en abrir los archivos, son diferentes.
Emilio M Bumachar

42
Versión simplista: un hash MD5 es lo suficientemente bueno como para protegerse contra un accidente , no es lo suficientemente bueno como para evitar la malicia . Si eso es lo suficientemente bueno para usted, debe decidir según sus circunstancias.
Euro Micelli

99
diff -s file1 file2si dice que son idénticos, son idénticos (en realidad compara los archivos byte por byte, por lo que incluso se excluyen las colisiones hash). las sumas de verificación se utilizan cuando solo tiene un hash y un elemento que se cree que es idéntico al creador de ese hash.
Bakuriu

Respuestas:


92

Cuando los hashes son idénticos, ¿significa esto que el contenido del archivo es 1: 1 igual?

Todos los archivos son una colección de bytes (valores 0-255). Si coinciden dos hashes MD5 de archivos, es muy probable que ambas colecciones de bytes sean exactamente iguales (el mismo orden, los mismos valores).

Existe una pequeña posibilidad de que dos archivos puedan generar el mismo MD5, que es un hash de 128 bits. La probabilidad es:

La probabilidad de colisión accidental de solo dos hashes es 1/2 128, que es 1 en 340 undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607 trillion 431 billones 768 millones 211 mil 456. (de una respuesta en StackOverflow ).

Los hash están destinados a funcionar en "una sola dirección", es decir, toma una colección de bytes y obtiene un hash, pero no puede tomar un hash y recuperar una colección de bytes.

La criptografía depende de esto (es una forma de comparar dos cosas sin saber cuáles son esas cosas).

Alrededor del año 2005, se descubrieron métodos para tomar un hash MD5 y crear datos que coinciden con ese hash, creando dos documentos que tenían el mismo hash MD5 ( ataque de colisión ). Vea el comentario de @ user2357112 a continuación. Esto significa que un atacante puede crear dos ejecutables, por ejemplo, que tienen el mismo MD5, y si depende de MD5 para determinar en qué confiar, se lo engañará.

Por lo tanto, MD5 no debe usarse para criptografía o seguridad. Es malo publicar un MD5 en un sitio de descarga para garantizar la integridad de la descarga, por ejemplo. Dependiendo de un hash MD5 que no haya generado usted mismo para verificar el contenido del archivo o datos, es lo que desea evitar.

Si genera el suyo, sabe que no se está haciendo daño a sí mismo (con suerte). Entonces, para su uso, está bien, pero si desea que otra persona pueda reproducirlo y desea publicar públicamente el hash MD5, se debe usar un mejor hash.


Tenga en cuenta que es posible que dos archivos de Excel contengan los mismos valores en las mismas filas y columnas, pero que el bytestream del archivo sea completamente diferente debido a diferentes formatos, estilos, configuraciones, etc.

Si desea comparar los datos en el archivo, expórtelos a CSV con las mismas filas y columnas primero, para eliminar todo el formato, y luego haga hash o compare los CSV.


107
Los archivos de Excel y otros documentos de Office también pueden tener diferentes valores hash porque se han abierto y vuelto a guardar sin cambiar nada, debido a que los metadatos en el archivo tienen un nuevo valor almacenado allí para la última fecha y hora guardada.
BeowulfNode42

29
Bonificación: si ha exportado a CSV, puede usar la diffutilidad venerable o similar para confirmar que los archivos son idénticos byte por byte, en lugar de simplemente tener el mismo hash.
Monty Harder

18
Tomar un hash y crear datos que coincidan con el hash es un ataque de preimagen. Creo que MD5 es actualmente vulnerable a los ataques de colisión, pero no creo que los ataques de preimagen o de segunda preimagen sean actualmente viables.
user2357112

2
@Tim, ¿qué estás diciendo? Él dijo: exportarlos a CSV y usar diff -spara verificar si los CSV son idénticos. De hecho, puede diff -sincluso los archivos de Excel: si diffdice que son idénticos, no necesita ir a la comparación CSV.
Bakuriu

2
@Bakuriu Claramente, mi comentario estaba muy mal redactado: quise decir que exportar a CSV perderá mucha información, especialmente fórmulas, gráficos, formato condicional y estándar.
Tim

37

En la práctica, sí, un hash criptográfico idéntico significa que los archivos son iguales, siempre que los archivos no hayan sido creados por un atacante u otra entidad maliciosa. Las probabilidades de colisiones aleatorias con cualquier función hash criptográfica bien diseñada son tan pequeñas que pueden ser insignificantes en la práctica y en ausencia de un atacante activo.

En general, sin embargo, no, no podemos decir que dos archivos arbitrarios que tienen el mismo hash definitivamente significan que son idénticos.

La forma en que funciona una función de cifrado hash es tomar una entrada de longitud arbitraria y generar un valor de longitud fija calculado a partir de la entrada. Algunas funciones hash tienen múltiples longitudes de salida para elegir, pero la salida sigue siendo hasta cierto punto un valor de longitud fija. Este valor tendrá una longitud de unas pocas docenas de bytes; Los algoritmos hash con el valor de salida más largo de uso común en la actualidad tienen una salida de 512 bits y una salida de 512 bits es de 64 bytes.

Si una entrada a una función hash es más larga que la salida de la función hash, se debe eliminar cierta fidelidad para que la entrada encaje en la salida. En consecuencia, deben existir múltiples entradas de longitudes mayores que la longitud de la salida, que generan la misma salida.

Tomemos el caballo de batalla actual, SHA-256, como ejemplo. Produce un hash de 256 bits o 32 bytes. Si tiene dos archivos que tienen exactamente 32 bytes de longitud, pero diferentes, estos deberían (suponiendo que no haya fallas en el algoritmo) hash a valores diferentes, sin importar el contenido de los archivos; en términos matemáticos, el hash es una función que asigna un espacio de entrada de 2 256 a un espacio de salida de 2 256 , que debería ser posible sin colisiones. Sin embargo, si tiene dos archivos que son cada 33 bytes de longitud, debe existir alguna combinación de entradas que dan el mismo valor hash de salida de 32 bytes para los archivos, ya que estamos ahora la asignación de un 2 264 espacio de entrada en un 2 256espacio de salida; aquí, podemos ver fácilmente que, en promedio, deberían existir 2 8 entradas para cada salida individual. Lleve esto más lejos, y con archivos de 64 bytes, ¡debe haber 2 256 entradas para cada salida!

Las funciones hash criptográficas están diseñadas de tal manera que es computacionalmente difícil componer una entrada que da una salida particular, o componer dos entradas que dan la misma salida. Esto se conoce como resistencia al ataque de preimagen o resistencia al ataque de colisión . No es imposible encontrar estas colisiones; solo pretende ser muy, muy, muy, muy difícil. (Un caso especial de un ataque de colisión es un ataque de cumpleaños ).

Algunos algoritmos son mejores que otros para resistir a los atacantes. El MD5 generalmente se considera completamente roto en estos días, pero la última vez que miré, todavía tenía una buena resistencia a la preimagen . SHA-1 también está efectivamente roto; Se han demostrado ataques previos a la imagen, pero requieren condiciones específicas, aunque no hay razón para creer que ese será el caso indefinidamente; Como dice el refrán, los ataques siempre mejoran, nunca empeoran. SHA-256/384/512 actualmente todavía se cree seguro para la mayoría de los propósitos. Sin embargo , si solo está interesado en ver si dos , válidos y no maliciososlos archivos son los mismos, entonces cualquiera de estos debería ser suficiente, porque el espacio de entrada ya está lo suficientemente limitado como para que le interesen principalmente las colisiones aleatorias. Si tiene alguna razón para creer que los archivos fueron creados de manera maliciosa, entonces necesita al menos usar una función de cifrado hash que actualmente se considera segura, lo que pone la barra inferior en SHA-256.

La primera imagen previa es encontrar una entrada que produzca un valor hash de salida específico; la segunda preimagen es encontrar una entrada que proporcione la misma salida que otra entrada especificada; colisión es encontrar dos entradas que produzcan la misma salida, sin tener en cuenta lo que es y, a veces, sin tener en cuenta cuáles son las entradas.

Dicho todo esto, es importante tener en cuenta que los archivos pueden tener representaciones de datos muy diferentes y aún mostrar exactamente lo mismo. Por lo tanto, pueden parecer iguales a pesar de que sus hashes criptográficos no coinciden, pero si los hashes coinciden, es muy probable que aparezcan igual.


2
Si los hashes coinciden, los archivos son el resultado de una colisión deliberada o no lo son y se garantiza que serán los mismos. La probabilidad de una colisión accidental es puramente teórica. Decir que "si los hashes coinciden es muy probable que aparezcan igual" es engañoso: si hay malicia en marcha y es una situación de colisión, entonces no es probable que sean iguales, y de lo contrario la probabilidad es efectivamente cero, no es No es un evento de baja probabilidad que deba defenderse.
Gilles 'SO- deja de ser malvado'

99
@Gilles: Por el contrario. La redacción de Michael es exactamente correcta, y "garantizado" es engañoso (o, bueno, de hecho erróneo). La probabilidad de que dos archivos con hashes idénticos no coincidan (a pesar de la modificación maliciosa) es extremadamente baja, y puede descuidarse en la práctica. Sin embargo, no es cero . En general, hay una oportunidad, que por cualquier razón las diferentes entradas se producirá el mismo hash, y posiblemente incluso con una probabilidad mucho mayor que 2 ^ -128 (algoritmos criptográficos son arte negro, el algortihm pueden tener defectos de una manera sutil, desconocido y no tenemos forma de estar 100% seguros).
Damon

55
@Gilles " efectivamente cero " todavía no es cero , lo que significa que todavía hay alguna probabilidad (ciertamente pequeña) de que dos conjuntos diferentes de datos den como resultado el mismo hash. No puedes discutir en contra de eso.
Attie

55
@Attie: La probabilidad de que dos archivos no relacionados tengan un hashing del mismo valor está muy por debajo de la probabilidad de que muchas otras cosas puedan salir mal (por ejemplo, errores de bits aleatorios que corrompen los archivos en el disco) que no vale la pena protegerse contra coincidencias. Puede valer la pena protegerse contra los partidos diseñados deliberadamente, pero los partidos accidentales son tan improbables que cualquier esfuerzo dedicado a protegerlos podría gastarse mejor en otro lugar.
supercat

3
@Gilles equivocado. No puede decirme de una sola vez que existe la posibilidad, por pequeña que sea de calificarla, de que se pueda producir una colisión accidental y, en el próximo beneficiario, no puede producirse una colisión. Decir eso es muy engañoso, ya que implica una propiedad del algoritmo de hash que ya se sabe que es completamente falso.
iheanyi

10

Es un juego de probabilidad ... los hashes pueden representar un número finito de valores.

Si consideramos un algoritmo de hash hipotético (y muy débil) de 8 bits, esto puede representar 256 valores distintos. A medida que comience a ejecutar archivos a través del algoritmo, usted comenzará a obtener los hashes ... pero después de poco tiempo usted comenzará a ver " colisiones hash ". Esto significa que se introdujeron dos archivos diferentes en el algoritmo y produjo el mismo valor hash que su salida. Claramente aquí, el hash no es lo suficientemente fuerte, y no podemos afirmar que "los archivos con hashes coincidentes tienen el mismo contenido ".

Extender el tamaño del hash y usar algoritmos de hash criptográficos más fuertes puede ayudar significativamente a reducir las colisiones y aumentar nuestra confianza en que dos archivos con el mismo hash tienen el mismo contenido.

Dicho esto, nunca podemos alcanzar el 100% de certeza; nunca podemos afirmar con certeza que dos archivos con el mismo hash realmente tengan el mismo contenido.

En la mayoría de las situaciones, esto está bien, y comparar hashes es " suficientemente bueno ", pero esto depende de su modelo de amenaza.

En última instancia, si necesita elevar los niveles de certeza, le recomendaría que haga lo siguiente:

  1. Use algoritmos de hashing fuertes ( MD5 ya no se considera adecuado si necesita protegerse contra usuarios potencialmente maliciosos)
  2. Usa múltiples algoritmos de hashing
  3. Compare el tamaño de los archivos: un punto de datos adicional puede ayudar a identificar posibles colisiones, pero tenga en cuenta que la colisión MD5 demostrada no necesitaba alterar la longitud de los datos.

Si necesita estar 100% seguro, comience con un hash, pero si los hashes coinciden, continúe con una comparación byte por byte de los dos archivos.


Además, como lo señalaron otros ... la complejidad de los documentos producidos por aplicaciones como Word y Excel significa que el texto, los números y el diseño visible pueden ser los mismos, pero los datos almacenados en el archivo pueden ser diferentes.

Excel es particularmente malo en esto: simplemente abrir una hoja de cálculo y guardarla (sin haber hecho nada ) puede producir un nuevo archivo, con contenido diferente.


66
MD5 ya no se considera adecuado, es muy cierto criptográficamente, pero para la comprobación de unicidad (en ausencia de malicia, por ejemplo, si controla la entrada) es agradable y rápido (y 128 bits deberían ser suficientes)
Chris H

44
" siga con una comparación byte por byte de los dos archivos " . Si va a hacer una comparación de archivos, también puede hacerlo primero ... no tiene sentido leer todos los archivos para calcular su ¡hashes solo para volver a leer ambos archivos para compararlos!
TripeHound

3
@TripeHound Depende de si los archivos son locales o no ... si ya tiene un hash de uno y está introduciendo un nuevo archivo en el sistema, si el nuevo archivo necesita un hash almacenado en una base de datos, etc. Haga la llamada que se adapte a su situación.
Attie

55
No, no es un juego de probabilidad. Estás desestimando lo improbable que es una colisión accidental. Simplemente no sucederá. Voltear un poco durante la comparación es más probable. Por otro lado, en algunos escenarios, puede ocurrir una colisión deliberada, y ese no es un juego de probabilidad en absoluto.
Gilles 'SO- deja de ser malo'

3
@mbrig: un hash de 32 bits tendría un riesgo significativo de desajuste accidental. Sin embargo, ir a 128 o 256 bits hace una gran diferencia. Con 128 bits, mil millones de monos, cada uno escribiendo mil millones de documentos genuinamente aleatorios de tamaño decente, tendría aproximadamente un 0.3% de posibilidades de crear dos documentos con el mismo hash. Con 256 bits, incluso si miles de millones de monos pudieran escribir mil millones de documentos aleatorios de tamaño decente por segundo durante mil millones de años, la probabilidad de que cualquiera de esos miles de millones de documentos que tengan valores de coincidencia coincidentes sea muy pequeña.
supercat

6

Si dos archivos tienen el mismo hash MD5, y no han sido especialmente diseñados, entonces son idénticos. Lo difícil que es crear archivos con el mismo hash MD5 depende del formato del archivo, no sé lo fácil que es con archivos Excel.

Entonces, si tiene archivos propios que simplemente están por ahí y quiere encontrar duplicados, MD5 es seguro. Si escribió uno de los archivos y el otro archivo es de origen dudoso, MD5 sigue siendo seguro (la única forma de obtener diferentes archivos con la misma suma de comprobación MD5 es crear ambos archivos). Si alguien en quien no confía le envía una propuesta de presupuesto y luego envía otro archivo que, según ellos, es el mismo, MD5 puede no ser suficiente.

Para evitar cualquier riesgo, use SHA-256 o SHA-512 en lugar de MD5. Si dos archivos tienen el mismo hash SHA-256, entonces son idénticos. Lo mismo ocurre con SHA-512. (Existe la posibilidad teórica de que puedan ser diferentes, pero la probabilidad de que esto ocurra accidentalmente es mucho menor que la probabilidad de que su computadora se voltee un poco durante la verificación que simplemente no es relevante. En cuanto a alguien que deliberadamente crea dos archivos con el mismo hash, nadie sabe cómo hacer esto para SHA-256 o SHA-512.)

Si dos archivos de Excel tienen hashes diferentes, entonces son diferentes, pero no hay forma de saber cuánto difieren. Podrían tener datos idénticos pero con un formato diferente, o simplemente podrían diferir en las propiedades, o podrían haber sido guardados por diferentes versiones. De hecho, si Excel se parece a Word, simplemente guardar un archivo actualiza sus metadatos. Si solo desea comparar los datos numéricos y de texto e ignorar el formato y las propiedades, puede exportar las hojas de cálculo a CSV para compararlas.

Si tiene herramientas Unix / Linux disponibles, puede usar cmppara comparar dos archivos. Para comparar dos archivos en la misma máquina, las sumas de verificación solo complican las cosas.


Si dos archivos tienen el mismo hash MD5, y ambos no han sido especialmente diseñados, entonces son idénticos. Eso es incorrecto. Hay una infinidad de mensajes posibles, pero solo hay 2 ^ 64 posibles hashes de 64 bits. Se llama el "principio del casillero" : "el principio del casillero establece que si los nartículos se colocan en mcontenedores n > m, entonces, al menos un contenedor debe contener más de un artículo". Si crea más de 2 ^ 64 mensajes, tendrá colisiones sin ninguna "creación especial". Y podría hacerlo con solo 2.
Andrew Henle

@AndrewHenle, MD5 no es de 64 bits, es de 128. Si generar una colisión accidental nos lleva a escalas temporales de muerte por calor del universo, es "posible" solo para una definición extremadamente académica (por lo tanto, inútil) de la misma.
Charles Duffy

@CharlesDuffy Asumes que el hash se distribuye aleatoriamente. No es.
Andrew Henle

Ser efectivamente equivalente a la distribución aleatoria es parte de la definición de lo que constituye un buen hash criptográfico: tiene muchas rondas de mezcla por una razón. Ciertamente, hay algoritmos de hash débiles, pero centrarnos en esas debilidades nos lleva a las advertencias mencionadas anteriormente sobre los ataques intencionales. (¿O está diciendo que se ha demostrado que MD5 solo tiene 64 bits que son efectivamente aleatorios? Admito que no me he mantenido al día, por lo que es plausible, ¿por favor, enlace?)
Charles Duffy,

@ AndrewHenle No afirmo que una colisión es matemáticamente imposible, lo cual sería incorrecto, pero no relevante aquí. Declaro que no ha sucedido, lo cual es cierto. Su comentario es incorrecto de una manera que cambia completamente el trato. Hay 2 ^ 128 posibles hashes MD5, no 2 ^ 64. Esto significa que necesitaría generar 2 ^ 128 hashes para asegurarse de generar una colisión. En realidad, por la paradoja del cumpleaños, 2 ^ 64 le daría una posibilidad macroscópica de una colisión entre los hashes que generó (no con un hash generado previamente). Pero esto es discutible ya que sabemos cómo crear colisiones.
Gilles 'SO- deja de ser malvado'

6

Respuesta corta: se supone que un hash criptográfico lo ayudará a estar razonablemente seguro de que los archivos con hash coincidentes son los mismos. A menos que se haya creado deliberadamente, las posibilidades de que dos archivos ligeramente diferentes tengan valores hash similares son ridículamente pequeñas. Pero cuando se trata de comparar y verificar archivos que podrían ser manipulados deliberadamente, MD5 es una mala elección. (Use otra función hash como SHA3 o BLAKE2).

Respuesta larga: una función hash ideal es aquella que crea un hash criptográfico casi único para cada pieza única de datos. En otras palabras, definitivamente sabemos que hay dos archivos en este universo cuyos valores hash chocan, la posibilidad de que estos dos archivos se unan naturalmente es ridículamente pequeña.

Hace diez años, decidí que debía permanecer lo más lejos posible de MD5. (Por supuesto, hasta ayer, recordé la razón equivocada para hacerlo; diez años es mucho tiempo, ya ves. Revisé mis notas anteriores para recordar por qué y edité esta respuesta). Verás, en 1996, se descubrió que MD5 Ser susceptible a los ataques de colisión. 9 años después, los investigadores pudieron crear pares de documentos PostScript y (¡ay!) Certificados X.509 con el mismo hash! MD5 estaba claramente roto. (Megaupload.com también estaba usando MD5, y hubo un montón de colisiones en torno a hash que me causaron problemas en ese momento).

Entonces, llegué a la conclusión de que si bien MD5 era (y aún es) confiable para comparar archivos benignos, uno debe dejar de usarlo por completo. Pensé que confiar en él tiene el riesgo de convertirse en indulgencia y falsa confianza: una vez que comience a comparar archivos con sus hash MD5, un día olvidará la letra pequeña de seguridad y comparará dos archivos que están diseñados deliberadamente para tener el mismo hash. Además, era poco probable que las CPU y los criptoprocesadores agregaran soporte para ello.

Sin embargo, el póster original tiene aún menos razones para usar MD5, porque:

  1. Mientras uno solo compare dos archivos, la comparación byte por byte es realmente más rápida que generar los propios hash MD5. Para comparar tres o más archivos ... bueno, ahora tienes una causa legítima.
  2. El OP especificó "formas de revisar esto y sin instalar un montón de complementos". El comando Get-FileHash de Windows PowerShell puede generar hash SHA1, SHA256, SHA384, SHA512 y MD5. En computadoras modernas con soporte de hardware para funciones hash SHA, generarlas es más rápido.

66
Puede crear su propia función hash criptográfica de cualquier longitud que elija, verdadero; pero luego tiene una longitud fija y el principio del casillero se aplica de todos modos. La respuesta general es: "al comparar solo sus hashes, no puede estar seguro de que los dos archivos sean idénticos".
Kamil Maciorowski

2
@KamilMaciorowski En teoría, sí puedo. Mi función hash personalizada puede generar simplemente una copia del archivo más grande. Pero no tengo interés en discutir esto más a fondo; la verdad es que usted votó en contra por una razón que equivale a ser quisquilloso solo para demostrar que es más inteligente y fue contraproducente para usted. Ahora no puede retirar la votación.

Estoy de acuerdo con @KamilMaciorowski ... Es un juego de probabilidad ... usando un solo hash, puedes estar " razonablemente seguro " de que los archivos con hashes coincidentes son iguales, pero no hay una garantía del 100%. El uso de mejores algoritmos, o el uso de múltiples algoritmos puede mejorar su confianza, incluso comparar tamaños de archivos puede ayudar ... pero nunca puede estar 100% seguro sin verificar byte por byte.
Attie

1
@Attie Huh! A eso me refería originalmente. Gracias. 🙏 Solo que no estoy familiarizado con frases elegantes como "puedes estar razonablemente seguro". Lo siento. 😜 Aún así, es por eso que tenemos un botón de edición. Yo personalmente nunca rechazaría una buena respuesta solo porque una palabra está mal. Lo edito

1
Acerca de "tirar a la basura una buena respuesta": tenga en cuenta que me aseguré primero de que no es un error tipográfico y lo dice en serio; luego voté en contra y al mismo tiempo le di retroalimentación, revelé mi razón con la esperanza de que su respuesta mejore. Lo hizo, así que mi voto negativo ya no existe. Básicamente te dije lo que creo que estaba mal con tu respuesta, Attie ayudó a aclarar, mejoró la respuesta. Desde mi punto de vista, todos manejamos esta situación correctamente y toda la historia resultó muy bien. Gracias.
Kamil Maciorowski

5

Tengo 2 documentos de Excel y quiero verificar si son exactamente iguales, aparte del nombre del archivo.

Desde una perspectiva práctica, comparar directamente los archivos para averiguar si son diferentes será más rápido que calcular un hash para cada archivo y luego comparar ese hash.

Para calcular los hashes, debe leer la totalidad del contenido de ambos archivos.

Para determinar si son idénticos a través de una comparación directa, solo necesita leer el contenido de ambos archivos hasta que no coincidan. Una vez que encuentra una diferencia, sabe que los archivos no son idénticos y no tiene que leer más datos de ninguno de los archivos.

Y antes de hacerlo, simplemente puede comparar los tamaños de los dos archivos. Si los tamaños difieren, el contenido no puede ser el mismo.


Cuando se usan dos archivos en una unidad física, el uso de una función hash que puede mantenerse al día con la velocidad de E / S en cada archivo por separado puede ser un poco más rápido que comparar los archivos, ya que no habría necesidad de cambiar entre leer los dos archivos. Sin embargo, los hash del lugar realmente brillan cuando se trata de hacer comparaciones que involucran muchos archivos que son demasiado grandes para caber en la memoria. Incluso si simplemente desea saber si todos coinciden, comparar el archivo 1 con el archivo 2, luego el archivo 1 con el archivo 3, luego el archivo 1 con el archivo 4, etc. puede ser casi el doble de lento que calcular todos sus hash.
supercat

@supercat Si los archivos se leen en fragmentos de más de un MB, el cambio entre archivos no se notará. Y si un flujo de trabajo implica comparar un montón de archivos para encontrar duplicados, el hash también podría calcularse a medida que se escribe cada archivo, ya que hacerlo puede hacerse de forma gratuita.
Andrew Henle

Si uno tiene suficiente espacio para almacenar grandes cantidades de archivos, los tiempos de cambio no tienen por qué ser un problema, pero de lo contrario podrían serlo. En cuanto a la computación de los hash cuando se escriben los archivos, eso podría estar bien si se pudiera garantizar que los archivos no se puedan modificar sin cambiar o al menos invalidar los hashes almacenados. Si uno está tratando de evitar hacer copias de seguridad de archivos de forma redundante, mirar solo los valores hash almacenados puede hacer que uno haga una copia de seguridad de un archivo dañado accidentalmente, pero no se moleste en hacer una copia de seguridad de los archivos no dañados que el archivo dañado debe coincidir pero no .
supercat

"Una vez que encuentra una diferencia, sabe que los archivos no son idénticos", no necesariamente. Los archivos XLSX son archivos ZIP que potencialmente podrían almacenar el contenido en un orden diferente que todavía tiene el mismo contenido. Pero incluso si los descomprime y compara cada archivo individual, el archivo XLSX contiene documentos XML que pueden tener, por ejemplo, diferentes finales de línea sin afectar el contenido.
Thomas Weller

5

Los hashes como MD5 o SHA tienen una longitud fija, digamos que son 300 caracteres alfanuméricos (en realidad son más cortos y no usan todo el conjunto de caracteres alfanuméricos).

Digamos que los archivos están hechos de caracteres alfanuméricos y de hasta 2 GB de tamaño.

Puede ver fácilmente que hay muchos más archivos (con un tamaño de hasta 2 GB) que los posibles valores hash. El principio del casillero dice que algunos archivos (diferentes) deben tener los mismos valores hash.

Además, como se demostró en shattered.io 1 , puede tener dos archivos diferentes: shattered.io/static/shattered-1.pdf y shattered.io/static/shattered-2.pdf que tienen el mismo valor hash SHA-1 mientras se completamente diferente.

1 SHA1 es un algoritmo de hash "más fuerte" que md5


La probabilidad de colisiones accidentales es demasiado baja para tener en cuenta. El riesgo de una colisión deliberada también existe para MD5 y es peor que para SHA-1, que no es terriblemente relevante aquí.
Gilles 'SO- deja de ser malvado'

4

NO. Diferentes valores garantizan que los archivos son diferentes. Los mismos valores no garantizan que los archivos sean iguales. Es relativamente fácil encontrar ejemplos usando CRC16.

En el balance de probabilidad con los esquemas de hashing contemporáneos, son los mismos.


1
La pregunta es sobre MD5, que no tiene riesgo de colisiones accidentales. Tiene el riesgo de colisiones deliberadas, pero eso no es una cuestión de probabilidades.
Gilles 'SO- deja de ser malvado'

1
También se trata de hojas de cálculo de Excel con diferentes nombres, ¿qué tan grandes pueden ser que un byte por comparación de byte no puede ser una opción? Dos esquemas de hashing juntos proporcionarían certeza.
mckenzm

2
@Gilles Todos los códigos hash tienen riesgo de colisiones accidentales, por definición. La única forma de salir de eso es usar todo el archivo como código hash. Tu comentario no tiene sentido.
user207421

3

Sin embargo, su pregunta es al revés: supongamos que el hash significa que tienen los mismos datos (lo cual no está 100% garantizado, pero es lo suficientemente bueno como para comparar archivos cada segundo para no chocar). No necesariamente se deduce que tener los mismos datos significa que tendrán el mismo hash. Entonces, no, no puede comparar los datos en un archivo de Excel con los datos en otro archivo de Excel al mezclar el archivo porque hay muchas maneras en que dos archivos pueden diferir sin que los datos subyacentes sean diferentes. Una forma obvia: los datos se almacenan como XML, cada celda tiene su propio nodo XML. Si esos nodos se almacenan en diferentes órdenes, entonces los datos son los mismos pero el archivo es diferente.


3

Para agregar las otras respuestas, aquí hay muchos ejemplos de pares de archivos con el mismo hash MD5 y contenido diferente.


Toda una respuesta de solo enlace, pero interesante.
Thomas Weller,

2

La respuesta para este OP se ha dado, pero podría beneficiarse de un resumen.

Si desea verificar si dos archivos son iguales, mucho depende de si los archivos y hashes están bajo su control.

Si genera los hashes a partir de los archivos, y está bastante seguro de que nadie más tuvo la oportunidad / habilidad / motivación para intentar deliberadamente y llegar a la conclusión equivocada, entonces casi cualquier hash, incluso los hashes "conocidos rotos" como MD5 y SHA1 son casi seguro que será suficiente. Pero eso, quiero decir que podría generar archivos a alta velocidad durante millones de años y aún es poco probable que termine con dos archivos que son realmente diferentes pero tienen el mismo hash. Es casi seguro que es seguro.

Este es el escenario que tiene, cuando desea verificar rápidamente si dos directorios en su PC o servidor de archivos tienen el mismo contenido, si alguno de los archivos de un directorio es duplicado exacto, etc., y está bastante seguro de que los archivos no ha sido diseñado / modificado ilícitamente, y usted confía en su aplicación / utilidad de hashing para obtener resultados correctos.

Si se encuentra en un escenario en el que uno de los archivos, o un hash precalculado, podría haber sido manipulado o diseñado para engañarlo a una conclusión incorrecta, entonces necesita un hash más fuerte (ininterrumpido) y / u otra seguridad. Por ejemplo, si descarga un archivo y comprueba si es válido examinando un hash, entonces un atacante podría diseñar un archivo incorrecto con el hash correcto o atacar el sitio web para colocar un hash incorrecto cuando busque el "correcto " (valor esperado. Esto se reduce a problemas de seguridad más amplios.


2

En la línea de comandos de Windows, puede usar la computilidad para determinar si dos archivos son exactamente iguales. Por ejemplo:

comp fileone.xls filetwo.xls

1

Cuando los hashes son idénticos, ¿significa esto que el contenido del archivo es 1: 1 igual?

No. Si los hashes son diferentes, lo que hace media que los contenidos son diferentes. Los códigos hash iguales no implican contenido igual. Un código hash es una reducción de un dominio grande a un rango más pequeño, por definición: la implicación es que los códigos hash sobre contenido desigual pueden ser iguales. De lo contrario, no tendría sentido calcularlos.


De lo contrario, no tendría sentido calcularlos. Si ha violado las leyes de las matemáticas e inventado una función de compresión sin pérdidas que puede comprimir datos aleatorios, violando el principio del casillero, ¡sería muy valioso usarlo! Sería muy conveniente si un hash de 128 bits se representan de forma única a todo el contenido de un archivo. Incluso si no hubiera una función de descompresión para volver a convertir el hash en el archivo, sería bueno tener un hash sin colisiones matemáticamente imposible, por ejemplo, para acelerar la búsqueda de datos duplicados en datos no confiables, como en las imágenes de VM.
Peter Cordes

"Si los hashes son diferentes, significa que los contenidos son diferentes". No necesariamente. Los archivos XLSX son archivos ZIP y sería posible tener el mismo contenido almacenado en un orden de archivos diferente.
Thomas Weller,

1

Esta respuesta está destinada a ser un mapa útil de escenarios que pueden o no suceder, y los razonamientos que puede aplicar. Consulte otras respuestas para saber por qué las funciones hash funcionan de esta manera.


Después de elegir una función hash y mantenerla, estas son todas las combinaciones a tener en cuenta:

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

El escenario en el que los archivos idénticos generan valores hash diferentes es el único que es estrictamente imposible.


Dos razonamientos que siempre se aplican:

  • Si los archivos son idénticos, los valores hash son idénticos con seguridad .
  • Si los valores hash son diferentes, los archivos son diferentes con seguridad .

Dos razonamientos que no son estrictos :

  • Si los archivos son diferentes, los valores hash probablemente sean diferentes.
  • Si los valores hash son idénticos, entonces los archivos probablemente sean idénticos.

0

Para sus propósitos, sí, hashes idénticos significa archivos idénticos.

Como otras respuestas dejan en claro, es posible construir 2 archivos diferentes que dan como resultado el mismo hash y MD5 no es particularmente robusto en este sentido.

Por lo tanto, use un algoritmo de hash más fuerte si planea comparar una gran cantidad de documentos de Excel o si cree que alguien podría querer manipular la comparación. SHA1 es mejor que MD5. SHA256 es mejor de nuevo y debería brindarle total confianza para su uso particular.


-1

Los archivos son probablemente idénticos si sus hashes son idénticos. Puede aumentar la confianza modificando ambos archivos de una manera idéntica (por ejemplo, poner el mismo valor en la misma celda no utilizada) y luego comparar los hash de los archivos modificados. Es difícil crear una colisión deliberada para un archivo que se cambia de una manera que no se conoce de antemano.


Esto no funcionará debido a los datos adicionales almacenados en los archivos de Office. Debe, por ejemplo, colocar el cursor en la misma celda antes de guardar, guardar en el momento exacto, etc. Pero incluso entonces, los archivos XLSX son archivos zip internamente, por lo que si ese algoritmo almacena los archivos individuales en un orden diferente (para cualquier propósito), el archivo es idéntico pero el hash no lo es
Thomas Weller

-2

Miremos esto de una manera práctica. En lugar de decir "los hashes son idénticos", diré "escribí un programa de computadora que calcula los hashes de dos archivos e imprime si son iguales o no", y ejecuto el programa con dos archivos, y dice "idéntico". Hay varias razones por las que podría hacer eso:

Los archivos pueden ser idénticos. Mi código puede tener errores (uno que realmente sucedió en la práctica fue comparar dos hashes largos (256 bytes) no con memcmp sino con strcmp: la comparación devolverá "lo mismo" si el primer byte en cada hash es cero, y la posibilidad de eso es 1 en 65536. Puede haber una falla de hardware (un rayo cósmico golpeando una celda de memoria y cambiándola), o puede tener el raro caso de dos archivos diferentes con hash idéntico (una colisión de hash).

Yo diría que para archivos no idénticos, la causa más probable es el error del programador, luego viene el rayo cósmico que cambió una variable booleana con el resultado de comparar los hashes de "falso" a "verdadero", y mucho más tarde aparece La coincidencia de una colisión de hash.

Hay sistemas de copia de seguridad empresariales que evitan hacer copias de seguridad de archivos idénticos de 10.000 usuarios al hacer un hash de cada archivo y buscar un archivo con un hash idéntico ya almacenado en el servidor. Por lo tanto, en caso de colisión, no se realizará una copia de seguridad de un archivo, lo que posiblemente provocará la pérdida de datos. Alguien calculó que es mucho más probable que un meteorito golpee su servidor y destruya todas las copias de seguridad que perder un archivo porque su suma de comprobación coincide con un archivo diferente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.