Скільки випадкових елементів перед MD5 виробляє зіткнення?


164

У мене є бібліотека зображень на Amazon S3. Для кожного зображення я md5 вихідну URL-адресу на своєму сервері плюс часову позначку, щоб отримати унікальне ім'я файлу. Оскільки S3 не може мати підкаталоги, мені потрібно зберігати всі ці зображення в одній плокій папці.

Чи потрібно турбуватися про зіткнення хеш-значення MD5, яке отримується?

Бонус: Скільки файлів я міг би мати, перш ніж я почав бачити зіткнення у хеш-значенні, яке виробляє MD5?



2
Буквальна відповідь полягає в тому, що другий файл може мати той же MD5, що і перший. Однак шанси надзвичайно малі.
Рік Джеймс

Відповіді:


307

Ймовірність випадкових зіткнень лише двох хешів становить 1/2 128, що становить 1 на 340 ундекльйонів 282 декліона 366 ноніліон 920 октиліон 938 септиліон 463 секстиліон 463 квінтиліон 374 квадрильйон 607 трлн 431 млрд 768 млн 211 тис. 456.

Однак якщо ви збережете всі хеші, то ймовірність трохи вище завдяки парадоксу дня народження . Щоб мати 50% шансів будь-якого хешу зіткнутися з будь-яким іншим хешем, вам потрібно 2 64 хеші. Це означає, що для зіткнення в середньому вам потрібно буде хешувати 6 мільярдів файлів в секунду протягом 100 років .


20
"ймовірність зіткнення 1/2 ^ 64" - що? Ймовірність зіткнення залежить від кількості вже хешованих елементів, це не фіксоване число. Насправді це рівно точно 1 - sPn/s^n, де sрозмір пошукового простору ( 2^128в даному випадку) і nкількість хешованих елементів. Ви, напевно, думаєте про те 2^64, що це приблизна кількість предметів, які вам знадобиться, щоб хеш MD5 мав 50% шансу зіткнення.
BlueRaja - Danny Pflughoeft

19
+1, тому що я завжди хотів знати, як рахувати минулих 999 трильйонів лол (і так, ваша відповідь була інформативною)
Kmeixner

7
На жаль, ви все ще неправі. Ви припускаєте, що хеш-функція справді випадкова. Це не. Це означає, що ймовірність зіткнення більша.
Jørgen Fogh

22
Йорген Фог: І всі закони фізики теж "не правильні". Такий рівень педантизму є непотрібним, оскільки він не змінює відповіді жодним змістовно.
Корнель

20
Тож ти кажеш, що є шанс!
варгонська

27

S3 може мати підкаталоги. Просто поставте "/" в ім'я ключа, і ви можете отримати доступ до файлів так, ніби вони були в окремих каталогах. Я використовую це для зберігання файлів користувачів в окремих папках на основі їх ідентифікатора користувача в S3.

Наприклад: "mybucket / users / 1234 / somefile.jpg". Це не точно так само, як каталог у файловій системі, але API S3 має деякі функції, які дозволяють йому працювати майже однаково. Я можу попросити його перерахувати всі файли, які починаються з "users / 1234 /", і він покаже мені всі файли у тому "каталозі".


7
Я думаю, це має бути зміст, оскільки воно насправді не відповідає на питання про ймовірність зіткнення
Ian Clark

18

Тож зачекайте, це:

md5(filename) + timestamp

або:

md5(filename + timestamp)

Якщо ви є першими, ви проходите більшу частину шляху до GUID, і я б не переживав про це. Якщо останнє, то перегляньте допис Карга про те, як ви зіткнетеся зіткненнями.


1
Будь ласка, докладно поясніть, як включення часової позначки збільшує ймовірність зіткнення
Бред Томас

14
@BradThomas: Це не так. Ризик зіткнення MD5 однаковий, незалежно від того, чи належить він до імені файлу або комбінації імені файлу + часової позначки. Але в першому випадку вам потрібно буде мати зіткнення MD5 і зіткнення часової мітки.
Вінсент Губерт

2
Це все ж залишає 2 ^ (128 ^ 60) шанс зіткнення з двома користувачами в хвилину. Буквально непридатний.
Беррі М.

2
@BradThomas Щоб бути зрозумілішим: md5(filename) + timestampмасово знижує ризик зіткнення, тому що вам потрібно мати зіткнення md5 точно такої ж мітки часу, щоб мати загальне зіткнення. md5(filename + timestamp)це те саме md5(filename), що припускати, що ім'я файлу починається випадково (оскільки додавання більшої кількості випадкових випадків до чогось випадкового лише змінює індивідуальний результат md5, і проблема з днем ​​народження все ще існує у всіх хедах md5).
robocat

10

Грубим правилом для зіткнень є квадратний корінь діапазону значень. Ваш ідентифікатор MD5, імовірно, довжиною 128 біт, тому ви, ймовірно, побачите зіткнення вище та поза 2 ^ 64 зображення.


1
Ви, мабуть, маєте на увазі 128 біт, а не 2 ^ 128. :-)
JesperE

5
en.wikipedia.org/wiki/Birthday_Problem Ще деякі відомості про проблему.
Георг Шоллі

7

Хоча випадкові зіткнення MD5 надзвичайно рідкісні, якщо ваші користувачі можуть надати файли (які будуть зберігатися дослівно), вони можуть спроектувати зіткнення. Тобто вони можуть свідомо створювати два файли з однаковим MD5sum, але різними даними. Переконайтеся, що ваша програма може обробляти цю справу розумним чином або, можливо, використовувати більш сильний хеш, як SHA-256.


використання солі допоможе вирішити проблему інженерії користувачів, ні?
StackOverflowed

Це залежить від того, як застосовується сіль. Це повинен бути префіксом даних, що надаються користувачем, а ще краще ключем для HMAC. Напевно, все-таки гарна ідея захистити глибоку оборону.
bdonlan

Зауважте, що хоча SHA256 має 256 біт, ви можете знищити ризик зіткнення з довжиною ключа, який ви зберігаєте, прив'язуючи SHA256 до меншої кількості бітів, наприклад, використовуйте SHA256, але обрізайте його до 128 біт (що безпечніше, ніж навіть використання MD5 хоча вони мають однакову кількість біт).
robocat

5

Незважаючи на те, що проблеми з MD5 були широко розрекламовані через зіткнення, UNINTENTIONAL зіткнення серед випадкових даних надзвичайно рідкісні . З іншого боку, якщо ви хешуєте ім'я файлу, це не випадкові дані, і я б очікував зіткнень швидко.


Єдина проблема, яку я маю на прикладі тейлорів, полягає в тому, що якщо хтось отримає копію вашої бази даних, він, ймовірно, міг би визначити номери кредитних карток за допомогою таблиці веселки ...
Сем Шафрон

1
Хоча я не хотів би використовувати MD5 для кредитних карток, таблиця Rainbow усіх дійсних номерів кредитних карт між 1000000 (8 цифр - найменша кредитна картка, яку я бачив) та 9,999,999,999,999,999 (найбільша 16-цифрова цифра) все ще велика таблицю для створення. Напевно, є простіші способи вкрасти ці цифри.
акросман

1

Насправді не важливо, наскільки це можливо; можливо. Це може статися на перших двох ваших хеш-вещах (дуже малоймовірно, але можливо), тому вам потрібно буде підтримувати зіткнення з самого початку.


36
Звичайно, може бути багато інших поганих речей, які можуть статися з вірогідністю 1/2 ^ 128. Можливо, ви не хочете виділяти цю турботу.
Буде Дін

2
Найгірше, що може статися тут, це ви можете отримати фотографію. За відносно невелику кількість я б не хвилювався. Тепер, якщо ваше програмне забезпечення контролює автопілот, що висаджує літак, це вже інша історія.
Джим C

9
Ви не можете бути серйозними. Вам потрібно буде хешувати 6 мільярдів файлів в секунду, щосекунди протягом 100 років, щоб отримати хороший шанс зіткнення. Навіть якщо вам дуже не пощастило, це, ймовірно, займе більше, ніж уся потужність S3, що використовується довше, ніж життя людини.
Корнель

12
У мільярди разів більша ймовірність, що ваша база даних та її резервні копії будуть виходити з ладу. Про зіткнення не варто турбуватися.
Артелій

5
Використовуйте час запобігання зіткненням, будуючи бункер, щоб поставити ваш сервер! Ці досадні метеори можуть вдарити вас (дуже малоймовірно, але можливо), тому вам потрібно буде підтримувати метеорний притулок від жебрацтва.
Полвоазул

1

Зіткнення MD5 вкрай малоймовірне. Якщо у вас 9 трлн MD5, у 9 трлн є лише один шанс, що відбудеться зіткнення.


1
Багато інших відповідей говорять про ймовірність зіткнення при додаванні ще одного елемента. Я думаю, що моя відповідь є більш корисною, оскільки вона розповідає про те, що, мабуть, у всій таблиці є дубль.
Рік Джеймс

1
Це не має нічого спільного з MD5 і невірно. Це як би сказати, що якщо у вас є 9 трлн котів, є ймовірність 1 на 9 трильйонів, що хтось ще має ідентичну кішку. Ключова проблема тут полягає в тому, що ви можете отримати той же хеш з більш ніж одним значенням.
Joonas Alhonen

@JoonasAlhonen - Так, це правда. І багато бідних людей використовують це як привід придбати ще один лотерейний квиток, який вони не можуть собі дозволити.
Рік Джеймс

Дякую, це насправді дуже корисна статистика. Шанси виникнення зіткнення при введенні 9 трильйонів предметів. Дякую.
Том П.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.