W przypadku zestawu równych miliardów aktywów szanse przypadkowych kolizji są pomijalnie małe - nie ma się czym martwić. Biorąc pod uwagę paradoks urodzin , biorąc pod uwagę zestaw 2 ^ 64 (lub 18 446 744 073 709 551 616) aktywów, prawdopodobieństwo pojedynczej kolizji MD5 w tym zestawie wynosi 50%. W tej skali prawdopodobnie pokonałbyś Google pod względem pojemności.
Jednak ponieważ funkcja skrótu MD5 została zepsuta (jest podatna na atak kolizyjny ), każdy zdeterminowany atakujący może wyprodukować 2 kolidujące zasoby w ciągu kilku sekund mocy procesora. Jeśli więc chcesz korzystać z MD5, upewnij się, że taka osoba atakująca nie naruszy bezpieczeństwa Twojej aplikacji!
Weź również pod uwagę konsekwencje, jeśli osoba atakująca może sfałszować kolizję z istniejącym zasobem w bazie danych. Chociaż nie ma takich znanych ataków (ataków przedobrazowych ) na MD5 (stan na 2011 r.), Mogłoby to stać się możliwe dzięki rozszerzeniu obecnych badań nad atakami kolizyjnymi.
Jeśli okażą się one problemem, proponuję przyjrzeć się serii funkcji skrótu SHA-2 (SHA-256, SHA-384 i SHA-512). Wadą jest to, że jest nieco wolniejszy i ma dłuższą wydajność mieszania.
MD5 to funkcja skrótu - tak, dwa różne ciągi znaków mogą absolutnie generować kolidujące kody MD5.
W szczególności należy zwrócić uwagę, że kody MD5 mają stałą długość, więc możliwa liczba kodów MD5 jest ograniczona. Liczba łańcuchów (dowolnej długości) jest jednak zdecydowanie nieograniczona, więc logicznie wynika, że muszą wystąpić kolizje.
źródło
Tak to mozliwe. W rzeczywistości jest to problem z urodzinami . Jednak prawdopodobieństwo, że dwa losowo wybrane ciągi mają ten sam skrót MD5, jest bardzo niskie.
Przykłady można znaleźć w tym i tym pytaniu.
źródło
Tak, oczywiście: skróty MD5 mają skończoną długość, ale istnieje nieskończona liczba możliwych ciągów znaków, które można zaszyfrować MD5.
źródło
Tak, jest możliwe, że dwa różne ciągi mogą generować ten sam kod skrótu MD5.
Oto prosty test wykorzystujący bardzo podobną wiadomość binarną w postaci ciągu szesnastkowego:
Generują inną sumę SHA-1, ale tę samą wartość skrótu MD5. Po drugie struny są bardzo podobne, więc trudno znaleźć między nimi różnicę.
Różnicę można znaleźć za pomocą następującego polecenia:
Powyższy przykład kolizji pochodzi z Marc Stevens: Kolizja pojedynczego bloku dla MD5 , 2012; wyjaśnia swoją metodę za pomocą kodu źródłowego ( alternatywny link do artykułu ).
Kolejny test:
Różne sumy SHA-1, ten sam skrót MD5.
Różnica jest w jednym bajcie:
Powyższy przykład jest zaadaptowany z Tao Xie i Dengguo Feng: Construct MD5 Collisions using Just A Single Block Of Message , 2010.
Związane z:
źródło
Tak to mozliwe. Nazywa się to kolizją Hash .
Mimo to algorytmy takie jak MD5 są zaprojektowane tak, aby zminimalizować prawdopodobieństwo kolizji.
Wpis Wikipedii na temat MD5 wyjaśnia pewne luki w MD5, o których powinieneś wiedzieć.
źródło
Żeby być bardziej pouczającym. Z matematycznego punktu widzenia funkcje skrótu nie są iniekcyjne .
Oznacza to, że nie istnieje relacja 1 do 1 (ale jednokierunkowa) między zbiorem początkowym a wynikiem wynikowym.
Bijection na Wikipedii
EDYCJA: aby być kompletnym, istnieją iniekcyjne funkcje skrótu: nazywa się to Perfect haszowaniem .
źródło
Tak to jest! Kolizja będzie możliwa (choć ryzyko jest bardzo małe). Jeśli nie, miałbyś całkiem skuteczną metodę kompresji!
EDYCJA : Jak mówi Konrad Rudolph: Potencjalnie nieograniczony zestaw danych wejściowych przekonwertowanych na skończony zestaw danych wyjściowych (32 znaki szesnastkowe) spowoduje nieskończoną liczbę kolizji.
źródło
Jak powiedzieli inni ludzie, tak, mogą wystąpić kolizje między dwoma różnymi wejściami. Jednak w twoim przypadku użycia nie widzę w tym problemu. Bardzo wątpię, że będziesz miał kolizje - użyłem MD5 do odcisków palców setek tysięcy plików graficznych z wielu formatów obrazu (JPG, bitmapa, PNG, raw) w poprzedniej pracy i nie miałem kolizji .
Jeśli jednak próbujesz odcisnąć jakiś rodzaj danych, być może przydałyby się dwa algorytmy haszujące - prawdopodobieństwo, że jedno wejście skutkuje tym samym wyjściem dwóch różnych algorytmów, jest prawie niemożliwe.
źródło
Zdaję sobie sprawę, że to stare, ale pomyślałem, że wniesie do mnie moje rozwiązanie. Istnieje 2 ^ 128 możliwych kombinacji skrótów. A zatem prawdopodobieństwo wystąpienia paradoksu urodzin wynosi 2 ^ 64. O ile poniższe rozwiązanie nie wyeliminuje możliwości kolizji, to z pewnością znacznie zmniejszy to ryzyko.
To, co zrobiłem, to zestawienie kilku skrótów na podstawie ciągu wejściowego, aby uzyskać znacznie dłuższy ciąg wynikowy, który uważasz za swój hash ...
Więc mój pseudokod do tego to:
Oznacza to praktyczne nieprawdopodobieństwo zderzenia. Ale jeśli chcesz być super paranoikiem i nie możesz tego zrobić, a przestrzeń dyskowa nie jest problemem (ani cykle obliczeniowe) ...
Okej, nie jest to najczystsze rozwiązanie, ale teraz dużo więcej bawisz się tym, jak rzadko zderzasz się z kolizją. Do tego stopnia, że mogę założyć niemożliwość we wszystkich realistycznych znaczeniach tego terminu.
Ze względu na mnie myślę, że możliwość kolizji jest na tyle rzadka, że uznam to za nie „pewne”, ale tak mało prawdopodobne, że będzie to odpowiadało potrzebom.
Teraz liczba możliwych kombinacji znacznie wzrasta. Chociaż mógłbyś spędzić dużo czasu na tym, ile kombinacji to może ci dać, powiem teoretycznie, że daje ci to ZNACZĄCO więcej niż cytowana powyżej liczba
Prawdopodobnie o sto cyfr więcej. Teoretyczne maksimum, jakie mogłoby to dać, byłoby
Możliwa liczba wynikowych ciągów:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336
źródło
Myślę, że musimy ostrożnie wybierać algorytm haszowania zgodnie z naszymi wymaganiami, ponieważ kolizje haszowania nie są tak rzadkie, jak się spodziewałem. Niedawno znalazłem w moim projekcie bardzo prosty przypadek kolizji hash. Używam opakowania Pythona xxhash do mieszania. Link: https://github.com/ewencp/pyhashxx
Spowodowało to bardzo trudny problem z buforowaniem w systemie, a potem w końcu odkryłem, że jest to kolizja hash.
źródło