MD5 все еще достаточно хорош, чтобы однозначно идентифицировать файлы?


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

какие мысли?

9 125

9 ответов:

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

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

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

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

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

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

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

вы можете прочитать о принцип pigeonhole.

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

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

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

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

когда хэширование короткое (

для проверки коллизий можно запустить этот тест на уникальность хэш-ключей md5 для всех bit_vectors в БД:

выберите md5 (bit_vector ), count (*), bit_and ( bit_vector) из БД с bit_vector
группа по md5 (bit_vector ), bit_vector имея bit_and ( bit_vector ) bit_vector

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

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