Сколько случайных элементов перед MD5 производит столкновения?

164

У меня есть библиотека изображений на Amazon S3. Для каждого изображения я ввожу исходный URL-адрес на моем сервере и метку времени, чтобы получить уникальное имя файла. Поскольку S3 не может иметь подкаталогов, мне нужно хранить все эти изображения в одной плоской папке.

Нужно ли беспокоиться о коллизиях в полученном хеш-значении MD5?

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

Бен Троп
источник
2
Буквальный ответ: второй файл может иметь тот же MD5, что и первый. Однако шансы крайне малы.
Рик Джеймс

Ответы:

309

Вероятность случайного столкновения всего двух хэшей составляет 1/2 128, что составляет 1 на 340 ундециллионов 282 дециллионов 366 ниллионов 920 октиллионов 938 септиллионов 463 квинтиллионов 373 квадриллионов 604 триллионов 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 - Дэнни Пфлугхофт
19
+1, потому что я всегда хотел знать, как считать 999 триллионов лол (и о, да, ваш ответ был информативным)
Kmeixner
7
К сожалению, вы все еще не правы. Вы предполагаете, что хеш-функция действительно случайна. Это не. Это означает, что вероятность столкновения выше.
Йорген Фог,
22
JørgenFogh: И все законы физики тоже «не верны». Такой уровень педантизма не нужен, потому что он не меняет никакого смысла в ответе.
Корнел
21
Итак, вы говорите, что есть шанс!
Варгонь
27

S3 может иметь подкаталоги. Просто введите «/» в имени ключа, и вы сможете получить доступ к файлам, как если бы они были в отдельных каталогах. Я использую это для хранения пользовательских файлов в отдельных папках на основе их идентификатора пользователя в S3.

Например: «mybucket / users / 1234 / somefile.jpg». Это не совсем то же самое, что каталог в файловой системе, но S3 API имеет некоторые функции, которые позволяют ему работать почти так же. Я могу попросить его перечислить все файлы, которые начинаются с «users / 1234 /», и он покажет мне все файлы в этом «каталоге».

Davr
источник
7
Это должно быть содержание, я думаю, поскольку оно не отвечает на вопрос о вероятности столкновения
Ян Кларк
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).
Робокат
10

Грубое эмпирическое правило для столкновений - это квадратный корень из диапазона значений. Ваш сигнал MD5 предположительно имеет длину 128 бит, поэтому вы, скорее всего, увидите столкновения выше 2 ^ 64 изображений.

Уилл Дин
источник
1
Вы, вероятно, имеете в виду 128 бит, а не 2 ^ 128. :-)
JesperE
5
en.wikipedia.org/wiki/Birthday_Problem Еще немного информации о проблеме.
Георг Шолли
7

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

bdonlan
источник
использование соли поможет решить проблему пользовательской инженерии, не так ли?
Переполнение
Это зависит от того, как соль применяется. Это должен быть префикс данных, предоставленных пользователем, или, что еще лучше, ключ для HMAC. Это все еще вероятно хорошая идея, чтобы практиковать оборону глубоко, хотя.
bdonlan
Обратите внимание, что, хотя длина SHA256 составляет 256 бит, вы можете снизить риск коллизий с длиной хранимого ключа, урезав SHA256 до меньшего количества бит, например, используйте SHA256, но урезайте его до 128 бит (что более безопасно, чем даже при использовании MD5). хотя они имеют одинаковое количество бит).
Робокат
5

Несмотря на то, что из-за коллизий были хорошо известны проблемы с MD5, НЕУДАЧНЫЕ коллизии среди случайных данных встречаются крайне редко . С другой стороны, если вы хэшируете имя файла, это не случайные данные, и я ожидаю быстрых коллизий.

acrosman
источник
Единственная проблема, которую я имею с примером Тейлорса, состоит в том, что если кто-то получит копию вашей базы данных, он, возможно, сможет выяснить номера кредитных карт, используя радужный стол ...
Сэм Саффрон
1
Хотя я бы не стал использовать MD5 для кредитных карт, таблица Rainbow со всеми действующими номерами кредитных карт в диапазоне от 10 000 000 (8 цифр - это самая маленькая длина кредитной карты, которую я видел) до 9 999 999 999 999 999 (наибольшее 16-значное число) по-прежнему остается большой таблица для генерации. Вероятно, есть более простые способы украсть эти цифры.
acrosman
1

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

Карг
источник
37
Конечно, может быть много других плохих вещей, которые могут произойти с вероятностью 1/2 ^ 128. Возможно, вы не захотите выделять это, чтобы беспокоиться.
Уилл Дин
2
Худшее, что может случиться здесь, это то, что вы можете получить фотографию. За сравнительно небольшое количество я бы не беспокоился. Теперь, если ваше программное обеспечение управляет автопилотом, приземляющимся на самолет, это уже другая история.
Джим С
9
Ты не можешь быть серьезным. Вам нужно будет хэшировать 6 миллиардов файлов в секунду, каждую секунду в течение 100 лет, чтобы получить хороший шанс столкновения. Даже если вам очень не повезло, вероятно, потребуется больше, чем вся емкость S3, используемая дольше, чем человеческая жизнь.
Корнел
13
Вероятность отказа вашей базы данных и ее резервных копий в миллиарды раз выше. Столкновения не стоит беспокоить.
Артелий
6
Используйте время предотвращения столкновений, создавая бункер, чтобы поставить свой сервер! Эти противные метеоры могут ударить вас (очень маловероятно, но возможно), так что вам придется поддерживать метеорное убежище с самого начала.
полвоазул
1

Столкновение MD5 крайне маловероятно. Если у вас 9 триллионов MD5, есть только один шанс из 9 триллионов, что произойдет столкновение.

Рик Джеймс
источник
1
Многие другие ответы говорят о вероятности столкновения при добавлении еще одного элемента. Я думаю, что мой Ответ более полезен, потому что он говорит о том, что, вероятно, у всей таблицы есть дубликат.
Рик Джеймс
1
Это не имеет ничего общего с MD5 и не является правильным. Это все равно, что сказать, что если у вас 9 триллионов кошек, есть шанс 1 на 9 триллионов, что у кого-то еще есть идентичная кошка. Ключевая проблема здесь в том, что вы можете получить один и тот же хеш с более чем одним значением.
Joonas Alhonen
@JoonasAlhonen - Да, это правда. И многие бедные люди используют это в качестве предлога для покупки еще одного лотерейного билета, который они не могут себе позволить.
Рик Джеймс
Спасибо, это на самом деле очень полезная статистика. Вероятность столкновения при вставке 9 триллионов предметов. Спасибо.
Том П.