Mam bibliotekę obrazów na Amazon S3. Dla każdego obrazu md5 adres URL źródła na moim serwerze oraz znacznik czasu, aby uzyskać unikalną nazwę pliku. Ponieważ S3 nie może mieć podkatalogów, muszę przechowywać wszystkie te obrazy w jednym płaskim folderze.
Czy muszę się martwić o kolizje w generowanej wartości skrótu MD5?
Bonus: ile plików mogę mieć, zanim zacznę widzieć kolizje w wartości skrótu generowanej przez MD5?
Odpowiedzi:
Prawdopodobieństwo przypadkowego zderzenia tylko dwóch haszów wynosi 1/2 128, czyli 1 na 340 undecillion 282 decillion 366 nonillion 920 oktylion 938 septillion 463 sekstyliony 463 biliardów 374 biliardów 607 bilionów 431 miliardów 768 milionów 211 tysięcy 456.
Jeśli jednak zachowasz wszystkie skróty, prawdopodobieństwo jest nieco większe dzięki paradoksowi urodzinowemu . Aby mieć 50% szans, że jakikolwiek hash koliduje z innym hashem, potrzebujesz 2 64 hashów. Oznacza to, że aby uzyskać kolizję, musisz średnio haszować 6 miliardów plików na sekundę przez 100 lat .
źródło
1 - sPn/s^n
, gdzies
jest rozmiarem przestrzeni wyszukiwania (2^128
w tym przypadku) in
jest liczbą zahaszowanych elementów. Prawdopodobnie myślisz o tym2^64
, że jest to przybliżona liczba elementów, których potrzebujesz do mieszania MD5, aby mieć 50% szans na kolizję.S3 może mieć podkatalogi. Po prostu umieść „/” w nazwie klucza, aby uzyskać dostęp do plików tak, jakby znajdowały się w oddzielnych katalogach. Używam tego do przechowywania plików użytkowników w oddzielnych folderach na podstawie ich identyfikatora użytkownika w S3.
Na przykład: „mybucket / users / 1234 / somefile.jpg”. Nie jest dokładnie tym samym, co katalog w systemie plików, ale interfejs API S3 ma pewne funkcje, które pozwalają mu działać prawie tak samo. Mogę poprosić o wyświetlenie wszystkich plików zaczynających się od „users / 1234 /” i pokaże mi wszystkie pliki w tym „katalogu”.
źródło
Więc czekaj, czy to jest:
lub:
W pierwszym przypadku większość drogi do identyfikatora GUID znajduje się na drodze i nie martwiłbym się o to. Jeśli to drugie, zobacz post Karga o tym, jak w końcu wpadniesz w kolizje.
źródło
md5(filename) + timestamp
znacznie zmniejsza ryzyko kolizji, ponieważ aby mieć kolizję ogólną, musiałbyś mieć kolizję md5 dla dokładnie tego samego sygnatury czasowej.md5(filename + timestamp)
działa tak samo, jakmd5(filename)
zakładając, że nazwa pliku jest losowa na początku (ponieważ dodanie większej liczby losowości do czegoś losowego zmienia tylko indywidualny wynik md5, a problem z datą urodzenia nadal istnieje we wszystkich hashach md5).Ogólną praktyczną zasadą dotyczącą kolizji jest pierwiastek kwadratowy z zakresu wartości. Twój znak MD5 ma prawdopodobnie 128 bitów, więc prawdopodobnie zobaczysz kolizje powyżej i powyżej 2 ^ 64 obrazów.
źródło
Chociaż przypadkowe kolizje MD5 są niezwykle rzadkie, jeśli użytkownicy mogą dostarczyć pliki (które będą przechowywane dosłownie), mogą zaprojektować kolizje. Oznacza to, że mogą celowo utworzyć dwa pliki z tą samą sumą MD5, ale różnymi danymi. Upewnij się, że Twoja aplikacja może obsłużyć ten przypadek w rozsądny sposób, lub może użyj silniejszego skrótu, takiego jak SHA-256.
źródło
Chociaż pojawiły się dobrze nagłośnione problemy z MD5 spowodowane kolizjami, NIEZAMIERZONE kolizje między przypadkowymi danymi są niezwykle rzadkie . Z drugiej strony, jeśli haszujesz nazwę pliku, nie są to dane losowe i szybko spodziewałbym się kolizji.
źródło
Nie ma znaczenia, jakie to jest prawdopodobne; to jest możliwe. Może się to zdarzyć w przypadku pierwszych dwóch rzeczy, które haszujesz (bardzo mało prawdopodobne, ale możliwe), więc będziesz musiał obsługiwać kolizje od początku.
źródło
Kolizja MD5 jest bardzo mało prawdopodobna. Jeśli masz 9 bilionów MD5, jest tylko jedna szansa na 9 bilionów , że dojdzie do kolizji.
źródło