Насколько вероятны ложноположительные контрольные суммы md5?

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

однако они утверждают, что" часто " они сталкиваются с коррупцией в файлах, где md5 по-прежнему говорит, что файл хорош.

все, что я читал предполагает, что это должно быть очень маловероятно.

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

NB, я еще не знаю, что означает" часто " в этом контексте. Они обрабатывают сотни файлов в день. Я не знаю, является ли это ежедневным, ежемесячным или ежегодным явлением.

5 ответов


MD5-128-битная криптографическая хэш-функция, поэтому различные сообщения должны быть распределены довольно хорошо по 128-битному пространству. Это означало бы, что два файла (за исключением файлов, специально созданных для поражения MD5) должны иметь шанс столкновения 1 в 2^128. Другими словами, если бы пару файлов сравнивали каждую наносекунду, этого бы еще не произошло.


Если файл поврежден, то вероятность того, что поврежденный файл имеет ту же контрольную сумму md5, что и неповрежденный файл, равна 1:2^128. Другими словами, это будет почти так же "часто" как никогда. Астрономически более вероятно, что ваш клиент неверно сообщает, что на самом деле произошло (например, они вычисляют неправильный хэш)


звучит как ошибка в использовании MD5 (возможно, они MD5-ing неправильные файлы), или ошибка в библиотеке, которую они используют. Например, старая программа MD5, которую я использовал однажды, не обрабатывала файлы более 2 ГБ.

этот вопрос предполагает, что в среднем вы получаете столкновение в среднем каждые 100 лет, если вы генерируете 6 миллиардов файлов в секунду, поэтому это маловероятно.


это звучит правдоподобно?

нет, вероятность случайного повреждения, вызывающего ту же контрольную сумму, равна 1 в 2128 или 3.40 × 1038. Это число ставит 1 на миллиард (109) шанс позориться.

будет ли другой алгоритм хэширования обеспечивать лучшие результаты?

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

должен ли я на самом деле смотреть на проблемы процесса, такие как они утверждают, что проверяют контрольную сумму, но на самом деле не делают этого?

вероятно, но рассмотрим все возможные точки проблем:

  1. файл поврежден до поколения MD5
  2. файл поврежден после MD5 проверка.
  3. программа MD5 или поддерживающая платформа имеет ошибку
  4. неправильное использование оператора (непреднамеренное, например, запуск программы MD5 в неправильном файле)
  5. злоупотребление оператором (намеренное, например, пропуск шага проверки)

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


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