Для набора даже миллиардов активов вероятность случайных столкновений ничтожно мала - вам не о чем беспокоиться. Учитывая парадокс дня рождения , учитывая набор из 2 ^ 64 (или 18 446 744 073 709 551 616) активов, вероятность единственной коллизии MD5 в этом наборе составляет 50%. В этом масштабе вы, вероятно, превзойдете Google с точки зрения емкости хранилища.
Однако из-за того, что хеш-функция MD5 была нарушена (она уязвима для атаки на основе коллизий ), любой решительный злоумышленник может создать 2 конфликтующих актива за считанные секунды мощности процессора. Поэтому, если вы хотите использовать MD5, убедитесь, что такой злоумышленник не поставит под угрозу безопасность вашего приложения!
Кроме того, рассмотрите возможные последствия, если злоумышленник может создать конфликт с существующим активом в вашей базе данных. Хотя таких известных атак (атак с использованием прообраза ) на MD5 (по состоянию на 2011 г.) нет, это может стать возможным за счет расширения текущих исследований по атакам на коллизии.
Если это окажется проблемой, я предлагаю взглянуть на серию хэш-функций SHA-2 (SHA-256, SHA-384 и SHA-512). Обратной стороной является то, что он немного медленнее и имеет более длинный хэш-вывод.
MD5 - это хеш-функция, поэтому да, две разные строки могут абсолютно генерировать конфликтующие коды MD5.
В частности, обратите внимание, что коды MD5 имеют фиксированную длину, поэтому возможное количество кодов MD5 ограничено. Однако количество строк (любой длины) определенно не ограничено, поэтому логически следует, что должны быть конфликты.
источник
Да, это возможно. На самом деле это проблема дня рождения . Однако вероятность того, что две случайно выбранные строки будут иметь один и тот же хэш MD5, очень мала.
См. Примеры в этом и этом вопросах.
источник
Да, конечно: хеши MD5 имеют конечную длину, но существует бесконечное количество возможных символьных строк, которые могут быть хешированы MD5.
источник
Да, возможно, что две разные строки могут генерировать один и тот же хеш-код MD5.
Вот простой тест с использованием очень похожего двоичного сообщения в шестнадцатеричной строке:
Они генерируют разные суммы SHA-1, но одно и то же значение хеш-функции MD5. Во-вторых, струны очень похожи, поэтому трудно найти разницу между ними.
Разницу можно найти с помощью следующей команды:
Вышеупомянутый пример столкновения взят из Marc Stevens: Single-block collision для MD5 , 2012 г .; он объясняет свой метод с исходным кодом ( альтернативная ссылка на статью ).
Другой тест:
Разная сумма SHA-1, тот же хеш MD5.
Разница в одном байте:
Приведенный выше пример адаптирован из Tao Xie and Dengguo Feng: Construct MD5 Collisions Using Just A Single Block of Message , 2010.
Связанный:
источник
Да, это возможно. Это называется хеш-коллизией .
При этом такие алгоритмы, как MD5, предназначены для минимизации вероятности столкновения.
Запись в Википедии о MD5 объясняет некоторые уязвимости в MD5, о которых вам следует знать.
источник
Просто чтобы быть более информативным. С математической точки зрения хеш-функции не являются инъективными .
Это означает, что между начальным набором и результирующим набором существует не отношение 1 к 1 (а одностороннее).
Биекция в Википедии
РЕДАКТИРОВАТЬ: чтобы быть полными, существуют инъективные хеш-функции: это называется идеальным хешированием .
источник
Да, это! Столкновение будет иметь возможность (хотя, риск очень мал). Если нет, у вас будет довольно эффективный метод сжатия!
РЕДАКТИРОВАТЬ : Как говорит Конрад Рудольф: потенциально неограниченный набор входных данных, преобразованный в конечный набор выходных данных (32 шестнадцатеричных символа), приведет к бесконечному количеству столкновений.
источник
Как говорили другие люди, да, могут быть конфликты между двумя разными входами. Однако в вашем случае использования я не вижу в этом проблемы. Я очень сомневаюсь, что вы столкнетесь с коллизиями - я использовал MD5 для снятия отпечатков сотен тысяч файлов изображений ряда форматов изображений (JPG, растровые, PNG, необработанные) на предыдущем задании, и у меня не было столкновений .
Однако, если вы пытаетесь отпечатать какие-то данные, возможно, вы могли бы использовать два хэш-алгоритма - вероятность того, что один вход приведет к одинаковому результату двух разных алгоритмов, почти невозможна.
источник
Я понимаю, что это устарело, но думал, что внесу свое решение. Есть 2 ^ 128 возможных комбинаций хешей. Таким образом, вероятность парадокса дня рождения составляет 2 ^ 64. Хотя приведенное ниже решение не исключает возможность столкновений, оно, несомненно, значительно снизит риск.
Я собрал несколько хешей на основе входной строки, чтобы получить гораздо более длинную результирующую строку, которую вы считаете своим хешем ...
Итак, мой псевдокод для этого:
То есть практической невозможности столкновения. Но если вы хотите быть суперпараноиком и не можете этого допустить, а место для хранения не является проблемой (как и вычислительные циклы) ...
Ладно, не самое чистое решение, но теперь у вас гораздо больше возможностей поиграть с тем, как редко вы будете сталкиваться с столкновениями. Я могу предположить невозможность во всех реалистичных смыслах этого слова.
Ради себя, я думаю, что вероятность столкновения достаточно редка, и я буду считать это не «верным», но настолько маловероятным, что это может удовлетворить потребность.
Теперь количество возможных комбинаций значительно увеличивается. Хотя вы можете потратить много времени на то, сколько комбинаций это может дать вам, я скажу, что теоретически это дает вам ЗНАЧИТЕЛЬНО больше, чем указанное выше число
Вероятно, еще на сотню цифр или около того. Теоретический максимум, который это может дать вам, будет
Возможное количество результирующих строк:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336
источник
Я думаю, нам нужно быть осторожными при выборе алгоритма хеширования в соответствии с нашим требованием, поскольку хеш-коллизии не так редки, как я ожидал. Недавно я обнаружил в своем проекте очень простой случай хеш-коллизии. Я использую Python-оболочку xxhash для хеширования. Ссылка: https://github.com/ewencp/pyhashxx
Это вызвало очень сложную проблему с кешированием в системе, после чего я наконец обнаружил, что это конфликт хэша.
источник