Para um conjunto de até bilhões de ativos, as chances de colisões aleatórias são desprezíveis - nada com que você deva se preocupar. Considerando o paradoxo do aniversário , dado um conjunto de 2 ^ 64 (ou 18.446.744.073.709.551.616) ativos, a probabilidade de uma única colisão MD5 dentro desse conjunto é de 50%. Nessa escala, você provavelmente venceria o Google em termos de capacidade de armazenamento.
No entanto, como a função hash MD5 foi quebrada (é vulnerável a um ataque de colisão ), qualquer invasor determinado pode produzir 2 ativos em colisão em questão de segundos de potência da CPU. Portanto, se você quiser usar o MD5, certifique-se de que esse invasor não comprometa a segurança do seu aplicativo!
Além disso, considere as ramificações se um invasor puder forjar uma colisão com um ativo existente em seu banco de dados. Embora não existam tais ataques conhecidos (ataques de pré-imagem ) contra MD5 (a partir de 2011), isso pode se tornar possível estendendo a pesquisa atual sobre ataques de colisão.
Se isso for um problema, sugiro olhar para a série SHA-2 de funções hash (SHA-256, SHA-384 e SHA-512). A desvantagem é que ele é um pouco mais lento e tem uma saída de hash mais longa.
MD5 é um função hash - então, sim, duas strings diferentes podem gerar códigos MD5 em conflito.
Em particular, observe que os códigos MD5 têm um comprimento fixo, portanto, o número possível de códigos MD5 é limitado. O número de strings (de qualquer comprimento), no entanto, é definitivamente ilimitado, portanto, logicamente, deve haver colisões.
fonte
Sim, é possível. Este é na verdade um problema de aniversário . No entanto, a probabilidade de duas strings escolhidas aleatoriamente terem o mesmo hash MD5 é muito baixa.
Veja esta e estas questões para exemplos.
fonte
Sim, claro: os hashes MD5 têm um comprimento finito, mas há um número infinito de cadeias de caracteres possíveis que podem ter o hash MD5.
fonte
Sim, é possível que duas strings diferentes possam gerar o mesmo código hash MD5.
Aqui está um teste simples usando uma mensagem binária muito semelhante em string hexadecimal:
Eles geram soma SHA-1 diferente, mas o mesmo valor de hash MD5. Em segundo lugar, as cordas são muito semelhantes, por isso é difícil encontrar a diferença entre elas.
A diferença pode ser encontrada pelo seguinte comando:
O exemplo de colisão acima foi tirado de Marc Stevens: Colisão de bloco único para MD5 , 2012; ele explica seu método, com o código-fonte ( link alternativo para o artigo ).
Outro teste:
Soma diferente de SHA-1, o mesmo hash MD5.
A diferença está em um byte:
O exemplo acima foi adaptado de Tao Xie e Dengguo Feng: Construct MD5 Collisions Using Just A Single Block Of Message , 2010.
Relacionado:
fonte
Sim, é possível. É chamado de colisão de Hash .
Dito isso, algoritmos como o MD5 são projetados para minimizar a probabilidade de uma colisão.
A entrada da Wikipedia no MD5 explica algumas vulnerabilidades no MD5, das quais você deve estar ciente.
fonte
Só para ser mais informativo. Do ponto de vista matemático, as funções Hash não são injetivas .
Isso significa que não há uma relação de 1 para 1 (mas de uma maneira) entre o conjunto inicial e o resultante.
Bijeção na wikipedia
EDITAR: para ser completo, existem funções de hash injetivo: é chamado de hash perfeito .
fonte
Sim, ele é! A colisão será uma possibilidade (embora o risco seja muito pequeno). Do contrário, você teria um método de compressão bastante eficaz!
EDIT : Como Konrad Rudolph diz: Um conjunto potencialmente ilimitada de entrada convertido para um conjunto finito de saída (32 caracteres hexadecimais) vontade resulta num sem número de colisões.
fonte
Como outras pessoas disseram, sim, pode haver colisões entre duas entradas diferentes. No entanto, em seu caso de uso, não vejo isso sendo um problema. Eu duvido muito que você vá se deparar com colisões - Eu usei MD5 para tirar impressões digitais de centenas de milhares de arquivos de imagem de vários formatos (JPG, bitmap, PNG, raw) em um trabalho anterior e não tive uma colisão .
No entanto, se você estiver tentando obter uma impressão digital de algum tipo de dado, talvez possa usar dois algoritmos de hash - a probabilidade de uma entrada resultar na mesma saída de dois algoritmos diferentes é quase impossível.
fonte
Sei que isso é antigo, mas pensei em contribuir com minha solução. Existem 2 ^ 128 combinações de hash possíveis. E, portanto, uma probabilidade de 2 ^ 64 de um paradoxo de aniversário. Embora a solução abaixo não elimine a possibilidade de colisões, ela certamente reduzirá o risco em uma quantidade muito significativa.
O que fiz foi juntar alguns hashes com base na string de entrada para obter uma string resultante muito mais longa que você considera seu hash ...
Portanto, meu pseudocódigo para isso é:
Isso é a improbabilidade prática de uma colisão. Mas se você quer ser superparanóico e não pode deixar que isso aconteça, e espaço de armazenamento não é um problema (nem os ciclos de computação) ...
Ok, não é a solução mais limpa, mas agora você pode brincar muito mais com a infrequência de colidir. Até o ponto, posso assumir a impossibilidade em todos os sentidos realistas do termo.
Para o meu bem, acho que a possibilidade de uma colisão é rara o suficiente para que eu não considere isso "infalível", mas é tão improvável de acontecer que se adapta à necessidade.
Agora, as combinações possíveis aumentam significativamente. Embora você possa gastar muito tempo pensando em quantas combinações isso pode lhe render, eu direi que, em teoria, você ganha SIGNIFICAMENTE mais do que o número citado acima de
Provavelmente por mais cem dígitos ou mais. O máximo teórico que isso poderia dar a você seria
Número possível de strings resultantes:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336
fonte
Acho que precisamos ter cuidado ao escolher o algoritmo de hash de acordo com nossos requisitos, já que as colisões de hash não são tão raras quanto eu esperava. Recentemente, encontrei um caso muito simples de colisão de hash em meu projeto. Estou usando o wrapper Python de xxhash para hash. Link: https://github.com/ewencp/pyhashxx
Isso causou um problema de cache muito complicado no sistema, então finalmente descobri que é uma colisão de hash.
fonte