Tengo 2 documentos de Excel y quiero verificar si son exactamente iguales, aparte del nombre del archivo.
Por ejemplo, los archivos se llaman fileone.xls
y 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?
cmp
en Unix ofc
(comparar archivos) en Windows.diff -s file1 file2
si 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.Respuestas:
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:
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.
fuente
diff
utilidad venerable o similar para confirmar que los archivos son idénticos byte por byte, en lugar de simplemente tener el mismo hash.diff -s
para verificar si los CSV son idénticos. De hecho, puedediff -s
incluso los archivos de Excel: sidiff
dice que son idénticos, no necesita ir a la comparación CSV.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.
fuente
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:
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.
fuente
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
cmp
para comparar dos archivos. Para comparar dos archivos en la misma máquina, las sumas de verificación solo complican las cosas.fuente
n
artículos se colocan enm
contenedoresn > 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.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:
fuente
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.
fuente
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
fuente
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.
fuente
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.
fuente
Para agregar las otras respuestas, aquí hay muchos ejemplos de pares de archivos con el mismo hash MD5 y contenido diferente.
fuente
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.
fuente
En la línea de comandos de Windows, puede usar la
comp
utilidad para determinar si dos archivos son exactamente iguales. Por ejemplo:fuente
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.
fuente
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:
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:
Dos razonamientos que no son estrictos :
fuente
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.
fuente
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.
fuente
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.
fuente