Достаточно ли MD5 достаточно однозначно идентифицировать файлы?

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

Любые мысли?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Вы можете прочитать принцип пигментации.

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

выберите md5 (бит_вектор), счетчик (*), бит_ид (бит_вектор)   от db с bit_vector
  группа по md5 (бит_вектор), бит_вектор   с bit_and (bit_vector) < > bit_vector

Ответ 8

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