Eu tenho 2 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 fileone.xls
e filetwo.xls
. Além dos nomes dos arquivos, presume-se que seu conteúdo seja idêntico, 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?
cmp
Unix oufc
(comparação de arquivos) no Windows.diff -s file1 file2
se diz que são idênticos, são idênticos (na verdade, compara os arquivos byte por byte, de modo que até as colisões de hash são excluídas). as somas de verificação são usadas quando você possui apenas um hash e um item que é considerado idêntico ao originador desse hash.Respostas:
Todos os arquivos são uma coleção de bytes (valores 0-255). Se dois hashes de MD5 de arquivos corresponderem, ambas as coleções de bytes provavelmente serão exatamente as mesmas (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 é:
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 pegar um hash e recuperar uma coleção de bytes.
A criptografia depende disso (é uma maneira de comparar duas coisas sem saber o que são.)
Por volta do ano de 2005, foram descobertos métodos para
pegar um hash MD5 e criar dados que correspondam a esse hash,criando dois documentos com o mesmo hash MD5 ( ataque de colisão ). Veja o 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, será enganado.Portanto, 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, você não se gerou para verificar se o conteúdo de arquivos ou dados é o que você deseja evitar.
Se você gerar o seu próprio, saberá que não está sendo malicioso consigo mesmo (espero). Portanto, para seu uso, não há problema, mas se você quiser que outra pessoa possa reproduzi-lo e queira 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 o bytestream do arquivo seja completamente diferente devido a formatação, estilos, configurações etc. diferentes.
Se você deseja comparar os dados no arquivo, exporte-os para CSV com as mesmas linhas e colunas primeiro, para retirar toda a formatação e, em seguida, faça hash ou compare os CSVs.
fonte
diff
utilitário venerável ou semelhante para confirmar se os arquivos são idênticos em bytes por bytes, em vez de apenas ter o mesmo hash.diff -s
para verificar se os CSV são idênticos. Na verdade, você podediff -s
até mesmo os arquivos do Excel: sediff
eles forem idênticos, não será necessário compará-los com CSV.Na prática, sim, um hash criptográfico idêntico significa que os arquivos são os mesmos, desde que os arquivos não tenham sido criados por um invasor ou outra entidade maliciosa. As chances de colisões aleatórias com qualquer função hash criptográfica bem projetada são tão pequenas que são desprezíveis 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 de hash têm vários comprimentos de saída para escolher, mas a saída ainda é, até certo ponto, um valor de comprimento fixo. Esse valor terá até algumas dezenas de bytes; 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 que a entrada caiba na saída. Conseqüentemente, deve haver várias entradas de comprimentos maiores que o comprimento da saída, que geram a mesma saída.
Vamos tomar o cavalo de batalha atual, SHA-256, como 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 que não há falha no algoritmo) hash para valores diferentes, independentemente do conteúdo dos arquivos; em termos matemáticos, o hash é uma função que mapeia um espaço de 2 256 entradas para um espaço de 2 256 saídas, o que deve ser possível sem colisões. No entanto, se você tiver dois arquivos com 33 bytes de comprimento, deve existir alguma combinação de entradas que forneça o mesmo valor de hash de saída de 32 bytes para os dois arquivos, porque agora estamos mapeando um espaço de entrada de 2 264 em um 2 256espaço de saída; aqui, podemos ver prontamente que deve haver, em média, 2 8 entradas para cada saída. Vá além e, com arquivos de 64 bytes, devem existir 2 256 entradas para cada saída!
As funções de hash criptográfico são projetadas de forma que seja computacionalmente difícil compor uma entrada que fornece uma saída específica ou compor duas entradas que fornecem a mesma saída. Isso é conhecido como resistência ao ataque de pré-imagem ou resistência ao ataque de colisão . Não é impossível encontrar essas colisões; apenas pretende ser muito, muito, muito, muito difícil. (Um caso especial de ataque de colisão é um ataque de aniversário .)
Alguns algoritmos são melhores que outros para resistir a invasores. O MD5 é geralmente considerado completamente quebrado nos dias de hoje, mas, pela última vez que olhei, ele ainda exibia uma boa resistência à pré-imagem . O SHA-1 também é efetivamente quebrado; ataques de pré-imagem foram demonstrados, mas exigem condições específicas, embora não haja motivo para acreditar que esse será o caso indefinidamente; como diz o ditado, os ataques sempre melhoram, nunca pioram. Atualmente, o SHA-256/384/512 ainda é considerado seguro para a maioria dos propósitos. No entanto , se você estiver interessado apenas em ver se dois códigos não maliciosos, válidosComo os arquivos são iguais, qualquer um desses itens deve ser suficiente, porque o espaço de entrada já está suficientemente restrito para que você se interesse principalmente por colisões aleatórias. Se você tiver algum motivo para acreditar que os arquivos foram criados com intuito malicioso, use pelo menos uma função de hash criptográfico que atualmente é considerada segura, o que coloca a barra inferior no SHA-256.
A primeira pré-imagem é encontrar uma entrada que produza um valor de hash de saída específico; a segunda pré-imagem é encontrar uma entrada que produza a mesma saída que outra entrada especificada; colisão é encontrar duas entradas que produzem a mesma saída, sem levar em consideração o que é isso e, às vezes, sem levar em conta o que são as entradas.
Tudo isso dito, é importante ter em mente que os arquivos podem ter representações de dados muito diferentes e ainda exibir exatamente o mesmo. Portanto, eles podem parecer iguais, mesmo que seus hashes criptográficos não correspondam, mas se os hashes corresponderem, é extremamente provável que pareçam iguais.
fonte
É um jogo de probabilidade ... 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. Ao começar a executar arquivos pelo algoritmo, você começará a remover hashes ... mas em pouco tempo começará a ver " colisões de hash ". Isso significa que dois arquivos diferentes foram alimentados no algoritmo e produziram o mesmo valor de hash que sua saída. Claramente aqui, o hash não é forte 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 de hash criptográfico mais fortes podem 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, recomendo que você faça o seguinte:
Se você precisa ter 100% de certeza, comece com um hash, mas se os hashes corresponderem, siga-o com uma comparação de 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, os números e o layout visível podem ser os mesmos, mas os dados armazenados no arquivo podem ser diferentes.
O Excel é particularmente ruim nisso - basta abrir uma planilha e salvá-la (sem fazer nada ) pode produzir um novo arquivo, com conteúdo diferente.
fonte
Se dois arquivos tiverem o mesmo hash MD5 e não tiverem sido criados especialmente, serão idênticos. A dificuldade de criar arquivos com o mesmo hash MD5 depende do formato do arquivo; não sei como é fácil com os arquivos do Excel.
Portanto, se você possui seus próprios arquivos e deseja encontrar duplicatas, o MD5 é seguro. Se você escreveu um dos arquivos e o outro é 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 em quem você não confia envia uma proposta de orçamento e, posteriormente, envia outro arquivo que eles afirmam ser o mesmo, então 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. (Existe uma possibilidade teórica de que eles possam ser diferentes, mas a probabilidade disso acontecer acidentalmente é muito menor do que a probabilidade do seu computador inverter um pouco durante a verificação do que simplesmente não é relevante. Quanto a alguém criar deliberadamente dois arquivos com o mesmo hash, ninguém sabe como fazer isso no SHA-256 ou SHA-512.)
Se dois arquivos do Excel tiverem hashes diferentes, eles serão diferentes, mas não há como saber quanto eles diferem. Eles podem ter dados idênticos, mas com formatação diferente, ou podem apenas diferir nas propriedades, ou podem ter sido salvos por versões diferentes. De fato, se o Excel for parecido com o Word, apenas salvar um arquivo atualizará seus metadados. Se você deseja comparar apenas os dados numéricos e de texto e ignorar a formatação e as propriedades, pode exportar as planilhas para CSV para compará-las.
Se você possui ferramentas Unix / Linux disponíveis, pode
cmp
comparar dois arquivos. Para comparar dois arquivos na mesma máquina, as somas de verificação apenas tornam as coisas mais complicadas.fonte
n
itens são colocados emm
contêineresn > m
, então pelo menos um contêiner deve conter mais de um item". Se você criar mais de 2 ^ 64 mensagens, terá colisões sem nenhuma "criação especial". E você pode com apenas dois.Resposta curta: Um hash criptográfico deve ajudá-lo a ter razoavelmente confiança de que os arquivos com hashes correspondentes são os mesmos. A menos que deliberadamente criado, as chances de dois arquivos ligeiramente diferentes terem valores de hash semelhantes são ridiculamente pequenas. Mas quando se trata de comparar e verificar arquivos que poderiam ser deliberadamente adulterados, o MD5 é uma má escolha. (Use outra função de hash como SHA3 ou BLAKE2.)
Resposta longa: Uma função de hash ideal é aquela que cria um hash criptográfico quase único para todos os dados. Em outras palavras, nós definitivamente sabemos que existem dois arquivos neste universo cujos valores de hash colidem, a chance desses dois arquivos se unirem naturalmente é ridiculamente pequena.
Dez anos atrás, decidi que devia ficar o mais longe possível do MD5. (É claro que até ontem me lembrei do motivo errado; dez anos é muito tempo, você vê. Revi meus memorandos anteriores para lembrar o motivo e editei essa resposta.) Veja, em 1996, o MD5 foi encontrado para ser 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 houve muita polêmica em torno de colisões de hash que me deram problemas na época.)
Portanto, concluí que, embora o MD5 fosse (e ainda seja) confiável para comparar arquivos benignos, é preciso parar de usá-lo completamente. Eu concluí que confiar nele tem o risco de se transformar em indulgência e falsa confiança: quando você começa a comparar arquivos usando seus hashes MD5, um dia você esquece a impressão fina de segurança e compara dois arquivos deliberadamente criados para ter o mesmo hash. Além disso, é improvável que CPUs e criptoprocessadores adicionem suporte a ele.
O pôster original, no entanto, tem ainda menos motivos para usar o MD5, porque:
fonte
De uma perspectiva prática, comparar diretamente os arquivos para descobrir se eles são diferentes será mais rápido do que computar um hash para cada arquivo e compará-lo.
Para calcular os hashes, você precisa ler todo o conteúdo dos dois arquivos.
Para determinar se eles são idênticos por meio 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 não precisa ler mais dados de nenhum arquivo.
E antes de fazer qualquer um, você pode simplesmente comparar os tamanhos dos dois arquivos. se os tamanhos diferirem, o conteúdo não poderá ser o mesmo.
fonte
Hashes como MD5 ou SHA têm tamanho fixo, digamos que são 300 caracteres alfanuméricos (na realidade, são mais curtos e não usam todo o conjunto de caracteres alfanuméricos).
Digamos que os arquivos sejam feitos de caracteres alfanuméricos e com tamanho de até 2 GB.
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 pigeonhole diz que alguns arquivos (diferentes) devem ter os mesmos valores de hash.
Além disso, como demonstrado no shattered.io 1, é possível ter dois arquivos diferentes: shattered.io/static/shattered-1.pdf e shattered.io/static/shattered-2.pdf que possuem o mesmo valor de hash SHA-1 enquanto estão completamente diferente.
1 SHA1 é um algoritmo de hash "mais forte" que o md5
fonte
NÃO. Valores diferentes garantem que os arquivos sejam diferentes. Os mesmos valores não são garantia de que os arquivos são os mesmos. É relativamente fácil encontrar exemplos usando o CRC16.
No balanço de probabilidade dos esquemas de hash contemporâneos, eles são os mesmos.
fonte
Porém, sua pergunta é inversa - vamos supor que o hash significa que eles têm 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 causar uma colisão). Isso não significa 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 do Excel com os dados de outro arquivo do Excel, fazendo o hash do arquivo, porque existem muitas maneiras pelas quais dois arquivos podem diferir sem que os dados subjacentes sejam diferentes. Uma maneira óbvia - os dados são armazenados como XML, cada célula possui 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.
fonte
Para adicionar outras respostas, aqui estão muitos exemplos de pares de arquivos com o mesmo hash MD5 e conteúdo diferente.
fonte
A resposta para este OP foi dada, mas pode se beneficiar de um resumo.
Se você deseja 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 a partir dos arquivos e tiver certeza de que ninguém mais teve oportunidade / habilidade / motivação para tentar deliberadamente chegar à conclusão errada, quase todos os hash - mesmo os hashes "quebrados" conhecidos, como MD5 e SHA1, serão quase certo de ser suficiente. Mas isso significa que você pode gerar arquivos em alta velocidade por milhões de anos e ainda é improvável que acabe com dois arquivos realmente diferentes, mas com o mesmo hash. É quase certamente seguro.
Este é o cenário que você tem, quando deseja verificar rapidamente se dois diretórios no seu PC ou servidor de arquivos têm o mesmo conteúdo, se algum arquivo em um diretório é duplicado exato, etc., e você tem certeza de que os arquivos não foram foi projetado / modificado ilicitamente e você confia no seu aplicativo / utilitário de hash para fornecer os resultados corretos.
Se você estiver em um cenário em que um dos arquivos - ou um hash pré-calculado - possa ter sido manipulado ou projetado para levar você a uma conclusão errada, será necessário um hash mais forte (ininterrupto) e / ou outra segurança. Por exemplo, se você baixar um arquivo e verificar se ele é válido examinando um hash, um invasor poderá projetar um arquivo incorreto com o hash correto ou atacar o site para colocar um hash incorreto ao procurar a opção "correta". " (valor esperado. Isso se resume a problemas de segurança mais amplos.
fonte
Na linha de comando do Windows, você pode usar o
comp
utilitário para determinar se dois arquivos são exatamente iguais. Por exemplo:fonte
Não. Se os hashes são diferentes, isso não significa que os conteúdos são diferentes. Hashcodes iguais não implicam conteúdo igual. Um código de hash é uma redução de um domínio grande para um intervalo menor, por definição: a implicação é que códigos de hash sobre conteúdo desigual podem ser iguais. Caso contrário, não faria sentido computá-los.
fonte
Esta resposta pretende ser um mapa útil 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 de hash e cumpri-la, estas são todas as combinações a serem consideradas:
O cenário em que arquivos idênticos geram valores diferentes de hash é o único estritamente impossível.
Dois raciocínios que sempre se aplicam:
Dois raciocínios que não são estritos :
fonte
Para seus propósitos, 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 nesse sentido.
Portanto, use um algoritmo de hash mais forte se você planeja comparar um grande número de documentos do Excel ou se acha que alguém pode querer manipular a comparação. SHA1 é melhor que MD5. O SHA256 é melhor novamente e deve fornecer total confiança para seu uso específico.
fonte
Os arquivos provavelmente são idênticos se seus hashes forem idênticos. Você pode aumentar a confiança modificando os dois arquivos de maneira idêntica (por exemplo, coloque o mesmo valor na mesma célula não utilizada) e comparando os hashes dos arquivos modificados. É difícil criar uma colisão deliberada para um arquivo que é alterado de uma maneira que não se conhece previamente.
fonte
Vejamos isso de uma maneira prática. Em vez de dizer "os hashes são idênticos", direi "escrevi um programa de computador que calcula os hashes de dois arquivos e imprime se são iguais ou não", e executo o programa com dois arquivos, e diz "idêntico". Existem várias razões pelas quais isso pode ser feito:
Os arquivos podem ser idênticos. Meu código pode ter erros (um que realmente aconteceu na prática foi comparar dois hashes longos (256 bytes), não com o memcmp, mas com o strcmp: A comparação retornará "mesmo" se o primeiro byte em cada hash for zero e a chance de ou seja, 1 em 65536. Pode haver uma falha de hardware (raio cósmico atingindo uma célula de memória e alternando-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, de longe a causa mais provável é erro do programador, então vem o raio cósmico que mudou uma variável booleana com o resultado da comparação dos hashes de "falso" para "verdadeiro" e muito mais tarde a coincidência de uma colisão de hash.
Existem sistemas de backup corporativo que evitam fazer backup de arquivos idênticos de 10.000 usuários, fazendo hash em cada arquivo e verificando se há um arquivo com um hash idêntico já armazenado no servidor. Portanto, em caso de colisão, um arquivo não será copiado, possivelmente causando perda de dados. Alguém calculou que é muito mais provável que um meteorito atinja seu servidor e destrua todos os backups do que a perda de um arquivo porque sua soma de verificação corresponde a um arquivo diferente.
fonte