Um hash criptográfico ou soma de verificação idêntica para dois arquivos significa que eles são idênticos?

57

Eu tenho dois documentos do Excel e quero verificar se eles são exatamente iguais, além do nome do arquivo.

Por exemplo, os arquivos são chamados de fileone.xls e filetwo.xls . Além dos nomes dos arquivos, presume-se que seus conteúdos sejam idênticos, mas é isso que quero verificar.

Eu tenho procurado maneiras de revisar isso e sem instalar um monte de plugins. Não parece um caminho direto.

Eu tentei gerar hashes MD5 para os dois arquivos. Quando os hashes são idênticos, isso significa que o conteúdo do arquivo é 1: 1 o mesmo?

    
por sam 21.05.2018 / 14:38

17 respostas

93

When the hashes are identical, does this mean that the file contents are 1:1 the same?

Todos os arquivos são uma coleção de bytes (valores 0-255). Se dois arquivos MD5 hashes corresponderem, ambas as coleções de bytes são extremamente prováveis exatamente iguais (mesma ordem, mesmos valores).

Há uma chance muito pequena de que dois arquivos possam gerar o mesmo MD5, que é um hash de 128 bits. A probabilidade é:

Probability of just two hashes accidentally colliding is 1/2128 which is 1 in 340 undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607 trillion 431 billion 768 million 211 thousand 456. (from an answer on StackOverflow.)

Os hashes devem funcionar em "apenas uma direção" - ou seja, você pega uma coleção de bytes e obtém um hash, mas não pode receber um hash e recuperar uma coleção de bytes.

A criptografia depende disso (é uma maneira pela qual duas coisas podem ser comparadas sem saber quais são essas coisas.)

Por volta do ano de 2005, os métodos foram descobertos para pegar um hash MD5 e criar dados que correspondam a esse hash para criar dois documentos que tinham o mesmo hash MD5 ( ataque de colisão ). Consulte @ Comentário de user2357112 abaixo. Isso significa que um invasor pode criar dois executáveis, por exemplo, que possuem o mesmo MD5, e se você estiver dependendo do MD5 para determinar em qual confiar, você será enganado.

Assim, o MD5 não deve ser usado para criptografia ou segurança. É ruim publicar um MD5 em um site de download para garantir a integridade do download, por exemplo. Dependendo de um hash MD5 que você não gerou para verificar se o conteúdo de arquivos ou dados é o que você deseja evitar.

Se você gerar o seu próprio, você sabe que não está sendo malicioso consigo mesmo (espero). Portanto, para o seu uso, tudo bem, mas se você quiser que outra pessoa possa reproduzi-lo e publicar publicamente o hash MD5, um hash melhor deve ser usado.

Observe que é possível que dois arquivos do Excel contenham os mesmos valores nas mesmas linhas e colunas, mas que o bytestream do arquivo seja completamente diferente devido a diferentes formatações, estilos, configurações, etc.

Se você deseja comparar os dados no arquivo, exporte-os para CSV com as mesmas linhas e colunas primeiro, para remover toda a formatação e, em seguida, use o hash ou compare os CSVs.

    
por 21.05.2018 / 15:31
37

Na prática, sim, um hash criptográfico idêntico significa que os arquivos são os mesmos, contanto que os arquivos não tenham sido criados por um invasor ou outra entidade mal-intencionada. As chances de colisões aleatórias com qualquer função hash criptográfica bem projetada são tão pequenas que podem ser insignificantes na prática e na ausência de um atacante ativo.

Em geral, no entanto, não, não podemos dizer que dois arquivos arbitrários com o mesmo hash definitivamente significam que eles são idênticos.

A maneira como uma função hash criptográfica funciona é obter uma entrada de comprimento arbitrário e gerar um valor de comprimento fixo calculado a partir da entrada. Algumas funções hash têm vários comprimentos de saída para escolher, mas a saída ainda é, até certo ponto, um valor de comprimento fixo. Este valor terá até alguns bytes de comprimento; os algoritmos de hash com o maior valor de saída em uso comum hoje têm uma saída de 512 bits e uma saída de 512 bits é de 64 bytes.

Se uma entrada para uma função hash for maior que a saída da função hash, alguma fidelidade deve ser removida para ajustar a entrada na saída. Consequentemente, deve haver múltiplas entradas de comprimentos maiores que o comprimento da saída, que geram a mesma saída.

Vamos pegar o cavalo de batalha atual, o SHA-256, como um exemplo. Ele gera um hash de 256 bits ou 32 bytes. Se você tiver dois arquivos com exatamente 32 bytes de comprimento, mas diferentes, eles devem (assumindo qualquer falha no algoritmo) hash para valores diferentes, não importando o conteúdo dos arquivos; em termos matemáticos, o hash é uma função que mapeia um espaço de entrada 2 256 em um espaço de saída 2 256 , que deve ser possível sem colisões. No entanto, se você tiver dois arquivos com 33 bytes de comprimento, deverá existir uma combinação de entradas que forneça o mesmo valor de hash de saída de 32 bytes para ambos os arquivos, porque agora estamos mapeando um 2 264 espaço de entrada em um espaço de saída de 2 256 ; aqui, podemos facilmente ver que devem existir, em média, 2 8 entradas para cada saída. Leve isso adiante e, com arquivos de 64 bytes, devem existir 2 256 entradas para cada saída!

As funções hash criptográficas são projetadas de modo que seja computacionalmente difícil compor uma entrada que forneça uma saída específica ou compor duas entradas que forneçam a mesma saída. Isso é conhecido como ataque de pré-imagem resistência ou ataque de colisão resistência . Não é impossível encontrar essas colisões; Pretende-se que seja realmente, realmente, muito realmente difícil. (Um caso especial de ataque de colisão é um ataque de aniversário .)

Alguns algoritmos são melhores que outros em resistir a invasores. O MD5 é geralmente considerado completamente quebrado nos dias de hoje, mas por último eu olhei, ele ainda apresentou uma boa primeira pré-imagem resistência. O SHA-1 também é efetivamente quebrado; ataques de pré-imagem foram demonstrados, mas requerem condições específicas, embora não haja razão para acreditar que esse será o caso indefinidamente; Como diz o ditado, os ataques sempre melhoram, eles nunca pioram. O SHA-256/384/512 ainda é considerado seguro para a maioria dos propósitos. No entanto, , se você está interessado em ver se dois arquivos não-maliciosos, válidos são iguais, então qualquer um deles deve ser suficiente, porque o espaço de entrada é suficientemente restrito já que você estaria mais interessado em colisões aleatórias. Se você tem alguma razão para acreditar que os arquivos foram criados de forma maliciosa, então você precisa, no mínimo, usar uma função hash criptográfica que acredita ser segura, o que coloca a barra inferior em SHA-256.

Primeiro preimage é encontrar uma entrada que produza um valor de hash de saída específico; second preimage é encontrar uma entrada que forneça a mesma saída que outra entrada especificada; colisão é encontrar duas entradas que produzem a mesma saída, sem considerar o que é e, às vezes, sem considerar quais são as entradas.

Dito isso, é importante ter em mente que os arquivos podem ter representações de dados muito diferentes e ainda exibir exatamente o mesmo. Então eles podem parecer o mesmo mesmo que seus hashes criptográficos não combinem, mas se os hashes coincidirem, eles são extremamente prováveis para parecerem iguais.

    
por 21.05.2018 / 15:30
10

É um jogo de probabilidades ... os hashes são capazes de representar um número finito de valores.

Se considerarmos um algoritmo de hash de 8 bits hipotético (e muito fraco), isso pode representar 256 valores distintos. Quando você começar a executar arquivos através do algoritmo, você começará a receber hashes ... mas em pouco tempo você começará a ver " colisões de hash ". Isso significa que dois arquivos diferentes foram alimentados no algoritmo e produziu o mesmo valor de hash como sua saída. Claramente aqui, o hash não é strong o suficiente, e não podemos afirmar que "arquivos com hashes correspondentes têm o mesmo conteúdo ".

Estender o tamanho do hash e usar algoritmos hash criptográficos mais strongs pode ajudar significativamente a reduzir colisões e aumentar nossa confiança de que dois arquivos com o mesmo hash têm o mesmo conteúdo.

Dito isto, nunca podemos alcançar 100% de certeza - nunca podemos afirmar com certeza que dois arquivos com o mesmo hash realmente têm o mesmo conteúdo.

Na maioria das situações, isso é bom, e comparar hashes é " bom o suficiente ", mas isso depende do seu modelo de ameaça.

Por fim, se você precisar aumentar os níveis de certeza, recomendamos que faça o seguinte:

  1. Usar algoritmos de hashing strongs ( MD5 não é mais considerado adequado se você precisar proteger contra usuários potencialmente mal-intencionados)
  2. Use vários algoritmos de hash
  3. Compare o tamanho dos arquivos - um ponto de dados extra pode ajudar a identificar possíveis colisões, mas observe que a colisão MD5 demonstrada não precisou alterar o tamanho dos dados.

Se você precisa ter 100% de certeza, então comece com um hash, mas se os hashes coincidirem, siga com uma comparação byte a byte dos dois arquivos.

Além disso, como apontado por outros ... a complexidade dos documentos produzidos por aplicativos como Word e Excel significa que o texto, números, layout visível podem ser os mesmos, mas os dados armazenados no arquivo podem ser diferentes.

O Excel é particularmente ruim nisso - simplesmente abrir uma planilha salvando-a (tendo feito nada ) pode produzir um novo arquivo, com conteúdo diferente.

    
por 21.05.2018 / 15:38
6

Se dois arquivos tiverem o mesmo hash MD5 e os dois não tiverem sido especialmente criados, eles serão idênticos. Como é difícil criar arquivos com o mesmo hash MD5 depende do formato do arquivo, não sei como é fácil com arquivos do Excel.

Portanto, se você tem arquivos próprios que estão por aí e quer encontrar duplicatas, o MD5 está seguro. Se você escreveu um dos arquivos, e o outro arquivo é de origem duvidosa, o MD5 ainda é seguro (a única maneira de obter arquivos diferentes com a mesma soma de verificação MD5 é criar os dois arquivos). Se alguém que você não confia envia uma proposta de orçamento e depois envia outro arquivo que afirma ser o mesmo, o MD5 pode não ser suficiente.

Para evitar qualquer risco, use SHA-256 ou SHA-512 em vez de MD5. Se dois arquivos tiverem o mesmo hash SHA-256, eles serão idênticos. O mesmo vale para o SHA-512. (Há uma possibilidade teórica de que eles poderiam ser diferentes, mas a probabilidade de isso acontecer acidentalmente é muito menor do que a probabilidade de o seu computador virar um pouco durante a verificação do que simplesmente não é relevante. o mesmo hash, ninguém sabe como fazer isso para SHA-256 ou SHA-512.)

Se dois arquivos do Excel tiverem hashes diferentes, eles são diferentes, mas não há como saber quanto eles diferem. Eles poderiam ter dados idênticos, mas formatação diferente, ou poderiam diferir apenas nas propriedades, ou poderiam ter sido salvos por versões diferentes. Na verdade, se o Excel é parecido com o Word, apenas salvar um arquivo atualiza seus metadados. Se você quiser comparar apenas os dados numéricos e de texto e ignorar a formatação e as propriedades, poderá exportar as planilhas para o CSV para compará-las.

Se você tiver ferramentas Unix / Linux disponíveis, poderá usar cmp para comparar dois arquivos. Para comparar dois arquivos na mesma máquina, as somas de verificação tornam as coisas mais complicadas.

    
por 21.05.2018 / 23:38
6

Resposta curta: Uma hash criptográfica deve ajudá-lo a ter uma confiança razoável de que os arquivos com hashes correspondentes são os mesmos. A menos que deliberadamente trabalhada, as chances de dois arquivos ligeiramente diferentes com valores de hash semelhantes são ridiculamente pequenas. Mas quando se trata de comparar e verificar arquivos que podem ser deliberadamente adulterados, o MD5 é uma má escolha. (Use outra função hash como SHA3 ou BLAKE2.)

Resposta longa: Uma função de hash ideal é aquela que cria um hash criptográfico quase exclusivo para cada parte única de dados. Em outras palavras, nós definitivamente sabemos que existem dois arquivos neste universo cujos valores de hash colidem, a chance de esses dois arquivos naturalmente se unirem é ridiculamente pequena.

Dez anos atrás, decidi ficar o mais longe possível do MD5. (Claro que, até ontem, lembrei-me da razão errada para fazê-lo; dez anos é muito tempo, veja você. Revisei meus últimos memorandos para lembrar por que e editei essa resposta.) Você vê, em 1996, a MD5 foi considerada suscetível a ataques de colisão. 9 anos depois, os pesquisadores conseguiram criar pares de documentos PostScript e (ai!) Certificados X.509 com o mesmo hash! O MD5 estava claramente quebrado. (O Megaupload.com também estava usando o MD5, e havia muita trapaça em torno de colisões de hash que me davam problemas na época.)

Então, eu concluí que enquanto o MD5 era (e ainda é) confiável para comparar arquivos benignos, é preciso parar de usá-lo completamente. Eu argumentei que confiar nele tem o risco de se transformar em indulgência e falsa confiança: uma vez que você começa a comparar arquivos usando seus hashes MD5, um dia você esquece a impressão digital de segurança e compara dois arquivos que são deliberadamente criados para ter o mesmo hash. Além disso, era improvável que CPUs e criptocompressores adicionassem suporte a ele.

O cartaz original, no entanto, tem ainda menos motivos para usar o MD5, porque:

  1. Desde que se esteja comparando apenas dois arquivos, a comparação byte a byte é realmente mais rápida do que gerar os próprios hashes MD5. Para comparar três ou mais arquivos ... bem, agora você tem uma causa legítima.
  2. O OP especificou "maneiras de revisar isso e sem instalar um monte de plugins". Comando Get-FileHash do Windows PowerShell pode gerar hashes SHA1, SHA256, SHA384, SHA512 e MD5. Em computadores modernos com suporte de hardware para funções hash SHA, gerá-los é mais rápido.
por 21.05.2018 / 14:51
5

I have 2 excel documents and I want to check if they are exactly the same, apart from the file name.

De uma perspectiva prática, comparar diretamente os arquivos para descobrir se eles são diferentes será mais rápido do que calcular um hash para cada arquivo e comparar esse hash.

Para calcular os hashes, você precisa ler a totalidade do conteúdo de ambos os arquivos.

Para determinar se são idênticos através de uma comparação direta, basta ler o conteúdo dos dois arquivos até que eles não correspondam. Depois de encontrar a diferença, você sabe que os arquivos não são idênticos e você não precisa ler mais dados de nenhum arquivo.

E, antes de fazer isso, você pode simplesmente comparar os tamanhos dos dois arquivos. se os tamanhos forem diferentes, o conteúdo não poderá ser o mesmo.

    
por 23.05.2018 / 11:58
5

Hashes como MD5 ou SHA têm tamanho fixo, digamos que são 300 caracteres alfanuméricos (na realidade, eles são mais curtos e não usam o conjunto de caracteres alfanuméricos).

Digamos que os arquivos sejam feitos com caracteres alfanuméricos e até 2 GB de tamanho.

Você pode ver facilmente que há muito mais arquivos (com tamanho de até 2 GB) do que possíveis valores de hash. O princípio do escaninho diz que alguns arquivos (diferentes) devem ter os mesmos valores de hash.

Além disso, conforme demonstrado no arquivo shattered.io 1 você pode ter dois arquivos diferentes: shattered.io/static/shattered-1.pdf e shattered.io/static/shattered-2.pdf tem o mesmo valor hash SHA-1 enquanto é completamente diferente.

1 SHA1 é um algoritmo de hash "mais strong" que md5

    
por 21.05.2018 / 18:25
4

NÃO. Valores diferentes garantem que os arquivos são diferentes. Os mesmos valores não garantem que os arquivos sejam iguais. É relativamente fácil encontrar exemplos usando o CRC16.

No equilíbrio da probabilidade com esquemas de hash contemporâneos eles são os mesmos.

    
por 21.05.2018 / 20:06
3

Sua pergunta é ao contrário - vamos supor que o hash signifique ter os mesmos dados (o que não é 100% garantido, mas é bom o suficiente para uma vida inteira comparando arquivos a cada segundo para não atingir uma colisão). Não segue necessariamente que ter os mesmos dados significa que eles terão o mesmo hash. Portanto, não - você não pode comparar os dados em um arquivo excel com os dados em outro arquivo do Excel, fazendo o hash do arquivo porque há um lote de maneiras que dois arquivos podem diferir sem que os dados subjacentes sejam diferentes . Uma maneira óbvia - os dados são armazenados como XML, cada célula tem seu próprio nó XML. Se esses nós forem armazenados em ordens diferentes, os dados serão os mesmos, mas o arquivo será diferente.

    
por 22.05.2018 / 17:25
3

Para adicionar as outras respostas, aqui são muitos exemplos de pares de arquivos com o mesmo MD5 hash e conteúdo diferente.

    
por 24.05.2018 / 14:18
2

A resposta para este OP foi dada, mas pode se beneficiar de um resumo.

Se você quiser verificar se dois arquivos são iguais, muito depende se os arquivos e hashes estão sob seu controle.

Se você mesmo gerar os hashes dos arquivos, e tiver certeza de que ninguém mais teve oportunidade / habilidade / motivação para deliberadamente tentar fazer com que você chegue à conclusão errada, então qualquer hash - mesmo "conhecido" quebrado como MD5 e o SHA1 é quase certo que será suficiente. Mas isso, quero dizer, você poderia gerar arquivos em alta velocidade por milhões de anos e você ainda provavelmente acabaria com dois arquivos que são realmente diferentes, mas que possuem o mesmo hash. É quase certamente seguro.

Este é o cenário que você tem, quando você quer verificar rapidamente se dois diretórios em seu PC ou servidor de arquivos têm o mesmo conteúdo, se algum arquivo em um diretório é duplicado, etc., e você tem certeza que os arquivos não foi modificada / modificada ilicitamente e você confia em seu aplicativo / utilitário hash para fornecer resultados corretos.

Se você estiver em um cenário em que um dos arquivos - ou um hash pré-calculado - possa ter sido manipulado ou criado para enganar você em uma conclusão errada, será necessário um hash mais strong (ininterrupto) e / ou outra segurança. Por exemplo, se você fizer o download de um arquivo e verificar se ele é válido examinando um hash, um invasor poderá criar um arquivo incorreto com o hash correto ou atacar o site para colocar um hash incorreto ao procurar o "direito". " (valor esperado. Isso se resume a questões de segurança mais amplas.

    
por 22.05.2018 / 17:56
2

Na linha de comando do Windows, você pode usar o utilitário comp para determinar se dois arquivos são exatamente iguais. Por exemplo:

comp fileone.xls filetwo.xls
    
por 23.05.2018 / 16:19
1

When the hashes are identical, does this mean that the file contents are 1:1 the same?

Não. Se os hashes são diferentes, isso significa que o conteúdo é diferente. Códigos hash iguais não implicam conteúdo igual. Um hashcode é uma redução de um domínio grande para um intervalo menor, por definição: a implicação é que hascodes sobre conteúdo desigual podem ser iguais. Caso contrário, não faria sentido computá-los.

    
por 24.05.2018 / 12:34
1

Esta resposta pretende ser um mapa prático de cenários que podem ou não acontecer e raciocínios que você pode aplicar. Consulte outras respostas para saber por que as funções hash funcionam dessa maneira.

Depois de escolher uma função hash e ficar com ela, essas são todas as combinações a serem consideradas:

          |    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

O cenário no qual arquivos idênticos geram valores hash diferentes é o único que é estritamente impossível.

Dois raciocínios que sempre se aplicam:

  • Se os arquivos forem idênticos, os valores de hash serão idênticos, com certeza .
  • Se os valores de hash forem diferentes, os arquivos serão diferentes , com certeza .

Dois raciocínios não estritos :

  • Se os arquivos forem diferentes, os valores de hash serão provavelmente diferentes.
  • Se os valores de hash forem idênticos, os arquivos serão provavelmente idênticos.
por 12.06.2018 / 17:43
0

Para seus objetivos, sim, hashes idênticos significam arquivos idênticos.

Como outras respostas deixam claro, é possível construir 2 arquivos diferentes que resultam no mesmo hash e o MD5 não é particularmente robusto a esse respeito.

Portanto, use um algoritmo de hash mais strong se você planeja comparar um grande número de documentos do Excel ou se acha que alguém pode querer manipular a comparação. O SHA1 é melhor que o MD5. O SHA256 é melhor novamente e deve lhe dar total confiança para seu uso particular.

    
por 21.05.2018 / 16:01
-1

Os arquivos são provavelmente idênticos se seus hashes são idênticos. Você pode aumentar a confiança modificando os dois arquivos de maneira idêntica (por exemplo, colocar o mesmo valor na mesma célula não usada) e comparar os hashes dos arquivos modificados. É difícil criar uma colisão deliberada para um arquivo que é alterado de uma forma não conhecida antecipadamente.

    
por 25.05.2018 / 03:16
-2

Vamos ver isso de uma maneira prática. Em vez de dizer "os hashes são idênticos", eu digo "Eu escrevi um programa de computador que calcula os hashes de dois arquivos e imprime se eles são iguais ou não", e eu corro o programa com dois arquivos, e ele diz "idêntico". Existem várias razões pelas quais isso pode acontecer:

Os arquivos podem ser idênticos. Meu código pode ter bugs (um que realmente aconteceu na prática foi comparar dois hashes longos (256 bytes) não com memcmp, mas com strcmp: A comparação retornará "same" se o primeiro byte em cada hash for zero, e a chance de isto é 1 em 65536. Pode haver uma falha de hardware (raio cósmico atingindo uma célula de memória e comutando-a). Ou você pode ter o caso raro de dois arquivos diferentes com hash idêntico (uma colisão de hash).

Eu diria que, para arquivos não-idênticos, a causa mais provável é o erro do programador, então vem o raio cósmico que alterou uma variável booleana com o resultado de comparar os hashes de "falso" para "verdadeiro" e muito mais tarde vem a coincidência de uma colisão de hash.

Existem sistemas de backup corporativo que evitam o backup de arquivos idênticos de 10.000 usuários, fazendo o hash de cada arquivo e verificando um arquivo com um hash idêntico já armazenado no servidor. Assim, no caso de uma colisão, um arquivo não será copiado, possivelmente levando à perda de dados. Alguém calculou que é muito mais provável que um meteorito atinja seu servidor e destrua todos os backups do que perder um arquivo, porque sua soma de verificação correspondia a um arquivo diferente.

    
por 27.05.2018 / 02:51

Tags