MD5 все еще достаточно хорош для уникальной идентификации файлов? - PullRequest
132 голосов
/ 27 октября 2010

Является ли MD5-хэширование файла все еще считающимся достаточно хорошим методом, чтобы однозначно идентифицировать его, учитывая все проблемы алгоритма MD5, проблемы безопасности и т. Д.? Безопасность не является моей главной задачей здесь, но уникальная идентификация каждого файла.

Есть мысли?

Ответы [ 9 ]

86 голосов
/ 27 октября 2010

Да. MD5 был полностью взломан с точки зрения безопасности, но вероятность случайного столкновения все еще исчезающе мала. Просто убедитесь, что файлы не создаются кем-то, кому вы не доверяете и у кого могут быть злые намерения.

31 голосов
/ 27 октября 2010

Для практических целей созданный хэш может быть подходящим образом случайным, но теоретически всегда существует вероятность столкновения из-за принципа Pigeonhole .Наличие разных хешей, безусловно, означает, что файлы разные, но получение одного и того же хеша не обязательно означает, что файлы идентичны.

Использование для этой цели хеш-функции - независимо от того, является ли безопасность проблемой- поэтому всегда должен быть только первым шагом проверки, особенно если известно, что алгоритм хеширования легко создает коллизии.Чтобы достоверно определить, отличаются ли два файла с одним и тем же хешем, вам нужно сравнить эти файлы побайтно.

19 голосов
/ 27 октября 2010

MD5 будет достаточно, если у вас нет противника.Однако кто-то может (намеренно) создать два отдельных файла, которые хэшируются с одинаковым значением (это называется конфликтом), и это может или не может быть проблемой, в зависимости от вашей конкретной ситуации.Слабые стороны MD5 относятся к конкретному контексту, это тонкий вопрос, поэтому рекомендуется не использовать MD5.Использование стойкой к коллизиям хеш-функции (SHA-256 или SHA-512) является безопасным ответом.Кроме того, использование MD5 - это плохие связи с общественностью (если вы используете MD5, будьте готовы оправдать себя, в то время как никто не будет оспаривать использование SHA-256).

9 голосов
/ 07 июля 2011

MD5 может производить столкновения. Теоретически, хотя это и маловероятно, миллион файлов подряд может создать один и тот же хэш. Не проверяйте свою удачу и проверяйте наличие коллизий md5 перед сохранением значения.

Лично мне нравится создавать md5 случайных строк, что снижает издержки хэширования больших файлов. Когда коллизии обнаружены, я повторяю и хэширую с добавленным счетчиком цикла.

Вы можете читать по принципу голубиного отверстия .

6 голосов
/ 10 февраля 2013

Я бы не рекомендовал это.Если приложение будет работать в многопользовательской системе, может быть пользователь, у которого будет два файла с одинаковым хешем md5 (он может быть инженером и играть с такими файлами, или просто быть любопытным - их легко загрузить из http://www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html, я сам во время написания этого ответа скачал два образца).Другое дело, что некоторые приложения могут хранить такие дубликаты по любой причине (я не уверен, есть ли такие приложения, но возможность существует).

Если вы уникально идентифицируете файлы, сгенерированные вашей программой, я бы сказал, что можно использовать MD5.В противном случае, я бы порекомендовал любую другую хеш-функцию, где коллизии еще не известны.

2 голосов
/ 27 октября 2010

Лично я думаю, что люди используют необработанные контрольные суммы (выбирают ваш метод) других объектов, чтобы выступать в качестве уникальных идентификаторов слишком часто, когда они действительно хотят это иметь уникальные идентификаторы.Снятие отпечатков пальцев с объекта для этого использования не было намерением и, вероятно, потребует больше размышлений, чем использование uuid или аналогичного механизма целостности.

0 голосов
/ 25 февраля 2018

Мне нравится думать о MD5 как о индикаторе вероятности при хранении большого количества файловых данных.

Если хэши равны, я знаю, что должен сравнивать файлы побайтно, но это можетслучается только несколько раз по ложной причине, иначе (хэши не равны) Я могу быть уверен, что мы говорим о двух разных файлах.

0 голосов
/ 27 февраля 2016

При хешировании коротких (<несколько K?) Строк (или файлов) можно создать два ключа хеширования md5, один для текущей строки и второй для обратной строки, объединенной с короткой асимметричной строкой. Пример: md5 (reverse (строка || '1010')). Добавление дополнительной строки гарантирует, что даже файлы, состоящие из последовательности идентичных битов, генерируют два разных ключа. Пожалуйста, поймите, что даже при этой схеме есть теоретический шанс того, что два хеш-ключа будут идентичны для неидентичных строк, но вероятность кажется чрезвычайно малой - что-то в порядке квадрата вероятности столкновения одного md5 и экономии времени может быть значительным, когда количество файлов растет. Можно также рассмотреть более сложные схемы для создания второй строки, но я не уверен, что это значительно улучшит шансы. </p>

Чтобы проверить наличие коллизий, можно запустить этот тест на уникальность хеш-ключей md5 для всех битовых векторов в db:

выберите md5 (bit_vector), count (*), bit_and (bit_vector) из БД с bit_vector
сгруппировать по md5 (bit_vector), bit_vector имеющий bit_and (bit_vector) <> bit_vector

0 голосов
/ 27 октября 2010

MD5 не работает, вместо этого вы можете использовать SHA1 (реализовано на большинстве языков)

...