O hash MD5 de um arquivo ainda é considerado um método bom o suficiente para identificá-lo exclusivamente, considerando todas as falhas do algoritmo MD5 e problemas de segurança etc? A segurança não é minha principal preocupação aqui, mas é a identificação exclusiva de cada arquivo.
Alguma ideia?
Respostas:
Sim. O MD5 foi completamente quebrado da 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 possa ter intenções maliciosas.
fonte
Para fins práticos, o hash criado pode ser adequadamente aleatório, mas teoricamente sempre há uma probabilidade de colisão, devido ao princípio Pigeonhole . Ter hashes diferentes certamente significa que os arquivos são diferentes, mas obter o mesmo hash não significa necessariamente que os arquivos sejam idênticos.
O uso de uma função de hash para esse fim - não importa se a segurança é uma preocupação ou não - deve, portanto, sempre ser apenas o primeiro passo de uma verificação, especialmente se o algoritmo de hash for conhecido por criar colisões com facilidade. Para descobrir com segurança se dois arquivos com o mesmo hash são diferentes, você precisará comparar esses arquivos byte a byte.
fonte
O MD5 será bom o suficiente se você não tiver adversário. No entanto, alguém pode (propositalmente) criar dois arquivos distintos com o mesmo valor (que é chamado de colisão), e isso pode ou não ser um problema, dependendo da sua situação exata.
Como saber se as deficiências conhecidas do MD5 se aplicam a um determinado contexto é uma questão sutil, é recomendável não usar o MD5. O uso de uma função hash resistente a colisões (SHA-256 ou SHA-512) é a resposta segura. Além disso, o uso do MD5 é péssimo para relações públicas (se você usa o MD5, esteja preparado para justificar a si mesmo; enquanto ninguém questionará o uso do SHA-256).
fonte
return 0;
em areturn 1;
). Isso é altamente improvável, mas o risco de uma colisão com o SHA-256 é ainda menor que isso. Matematicamente, você não pode ter certeza de que dois arquivos que têm o mesmo valor de hash são idênticos, mas não pode ter certeza disso, comparando os próprios arquivos, desde que use um computador para a comparação. O que quero dizer é que não faz sentido ir além da segurança de 99.999 .... 9%, e o SHA-256 já fornece mais do que isso.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.
Pessoalmente, gosto de criar md5 de seqüências aleatórias, o que reduz a sobrecarga do hash de arquivos grandes. Quando colisões são encontradas, eu itero e re-hash com o contador de loop anexado.
Você pode ler sobre o princípio do buraco de pombo .
fonte
Eu não recomendaria. Se o aplicativo funcionasse em um sistema multiusuário, poderia haver um usuário que tivesse dois arquivos com o mesmo hash md5 (ele pode ser engenheiro e jogar com esses arquivos ou apenas ficar curioso - eles podem ser baixados facilmente de http: / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , eu mesmo, ao escrever esta resposta, baixei duas amostras). Outra coisa é que alguns aplicativos podem armazenar essas duplicatas por qualquer motivo (não tenho certeza, se existem aplicativos, mas existe a possibilidade).
Se você estiver identificando exclusivamente os arquivos gerados pelo seu programa, eu diria que não há problema em usar o MD5. Caso contrário, eu recomendaria qualquer outra função de hash onde nenhuma colisão ainda seja conhecida.
fonte
Pessoalmente, acho que as pessoas usam somas de verificação brutas (escolha seu método) de outros objetos para agirem como identificadores únicos demais quando realmente querem fazer é ter identificadores únicos. A impressão digital de um objeto para esse uso não era a intenção e provavelmente requer mais reflexão do que o uso de um mecanismo de integridade semelhante ou uuid.
fonte
O MD5 foi quebrado, você pode usar o SHA1 (implementado na maioria dos idiomas)
fonte
Ao fazer o hash de strings curtas (<alguns K?) (Ou arquivos), é possível criar duas chaves de hash md5, uma para a string real e uma segunda para o reverso da string concatenada com uma string assimétrica curta. Exemplo: md5 (reverso (sequência || '1010')). A adição da cadeia extra garante que mesmo os arquivos compostos por uma série de bits idênticos gerem duas chaves diferentes. Por favor, entenda que mesmo sob esse esquema, existe uma chance teórica de as duas chaves de hash serem idênticas para seqüências de caracteres não idênticas, mas a probabilidade parece extremamente pequena - algo na ordem do quadrado da probabilidade de colisão md5 única e economia de tempo pode ser considerável quando o número de arquivos estiver aumentando. Esquemas mais elaborados para criar a segunda string também podem ser considerados,
Para verificar colisões, pode-se executar este teste quanto à exclusividade das chaves de hash md5 para todos os bit_vectors em um banco de dados:
selecione md5 (bit_vector), count (*), bit_and (bit_vector) do db com o
grupo bit_vector por md5 (bit_vector), bit_vector com bit_and (bit_vector) <> bit_vector
fonte
Eu gosto de pensar no MD5 como um indicador de probabilidade ao armazenar uma grande quantidade de dados de arquivos.
Se os hashes forem iguais, então eu sei que tenho que comparar os arquivos byte a byte, mas isso pode acontecer apenas algumas vezes por um motivo falso, caso contrário (os hashes não são iguais), posso ter certeza de que estamos falando de dois arquivos diferentes .
fonte