O MD5 ainda é bom o suficiente para identificar arquivos de maneira exclusiva?

MD5 hash um arquivo ainda é considerado um método suficientemente bom para identificá-lo de forma exclusiva, considerando todos os problemas de algoritmo MD5 e de segurança, etc? Segurança não é minha principal preocupação aqui, mas identificar exclusivamente cada arquivo é.

Alguma ideia?

Sim. O MD5 foi completamente quebrado de uma perspectiva de segurança, mas a probabilidade de uma colisão acidental ainda é muito pequena. Apenas certifique-se de que os arquivos não estejam sendo criados por alguém em quem você não confia e que possam ter intenções maliciosas.

Para fins práticos, o hash criado pode ser apropriadamente random, mas, teoricamente, há sempre uma probabilidade de colisão, devido ao princípio de Pigeonhole . Ter hashes diferentes certamente significa que os arquivos são diferentes, mas obter o mesmo hash não significa necessariamente que os arquivos são idênticos.

Usar uma function hash para essa finalidade – não importando se a segurança é uma preocupação ou não – deve, portanto, ser sempre apenas a primeira etapa de uma verificação, especialmente se o algoritmo hash for conhecido por criar facilmente colisões. Para descobrir com segurança se dois arquivos com o mesmo hash são diferentes, você teria que comparar esses arquivos byte por byte.

O MD5 será bom o suficiente se você não tiver adversário. No entanto, alguém pode (propositalmente) criar dois arquivos distintos, cujo hash tem o mesmo valor (isso é chamado de colisão), e isso pode ou não ser um problema, dependendo da sua situação exata.

Como saber se os pontos fracos conhecidos do MD5 se aplicam a um determinado contexto é uma questão sutil, recomenda-se não usar o MD5. Usar uma function hash resistente à colisão (SHA-256 ou SHA-512) é a resposta segura. Além disso, usando MD5 é ruim relações públicas (se você usar MD5, esteja preparado para ter que justificar-se, enquanto ninguém vai questionar o seu usando SHA-256).

Um md5 pode produzir colisões. Teoricamente, embora altamente improvável, um milhão de arquivos seguidos pode produzir o mesmo hash. Não teste sua sorte e verifique se há colisões md5 antes de armazenar o valor.

Eu pessoalmente gosto de criar md5 de strings aleatórias, o que reduz a sobrecarga de hashing de arquivos grandes. Quando colisões são encontradas, eu faço iteração e re-hash com o contador de loops acrescentado.

Você pode ler o princípio do escaninho .

Eu não recomendaria isso. Se o aplicativo funcionasse no sistema multiusuário, poderia haver usuário, que teria dois arquivos com o mesmo hash md5 (ele poderia ser engenheiro e brincar com esses arquivos ou ser apenas curioso – eles podem ser facilmente baixados de http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , eu mesmo durante a gravação desta resposta baixei duas amostras). Outra coisa é que alguns aplicativos podem armazenar tais duplicatas por qualquer motivo (não tenho certeza se existem aplicativos desse tipo, mas a possibilidade existe).

Se você está identificando exclusivamente os arquivos gerados pelo seu programa, eu diria que está tudo bem em usar o MD5. Caso contrário, eu recomendaria qualquer outra function de hash em que nenhuma colisão seja conhecida ainda.

Pessoalmente, eu acho que as pessoas usam checksums brutos (escolha o seu método) de outros objects para agir como identificadores exclusivos de forma muito quando eles realmente querem fazer é ter identificadores exclusivos. A impressão digital de um object para esse uso não era a intenção e provavelmente exigiria mais raciocínio do que usar um mecanismo de integridade uuid ou semelhante.

O MD5 foi quebrado, você poderia usar o SHA1 (implementado na maioria dos idiomas)

Quando hash curto (

Para verificar se há colisões, é possível executar este teste para a exclusividade das chaves hash md5 para todos os bit_vectors em um database:

selecione md5 (bit_vector), count (*), bit_and (bit_vector) do db com bit_vector
group por md5 (bit_vector), bit_vector com bit_and (bit_vector) <> bit_vector

Eu gosto de pensar no MD5 como um indicador de probabilidade ao armazenar uma grande quantidade de dados de arquivo.

Se os hashes são iguais, então eu sei que eu tenho que comparar os arquivos byte por byte, mas isso só pode acontecer algumas vezes por uma razão falsa, caso contrário (hashes não são iguais) posso ter certeza de que estamos falando de dois arquivos diferentes .