MD5
MD5 — хеш-функция, сворачивающая данные любого объёма в 128 бит, то есть 32 шестнадцатеричных символа. Опубликована в 1991 году в RFC 1321; с 2004 года считается взломанной по коллизиям и пригодна только для контроля случайных искажений.
Что такое MD5 и как он устроен
MD5 (Message Digest 5) разработан Рональдом Ривестом в 1991 году как усиленная замена MD4 и описан в RFC 1321. Функция принимает данные любой длины и выдаёт 128 бит — 16 байт, которые записывают 32 шестнадцатеричными символами. Дайджест пустой строки известен наизусть многим администраторам: d41d8cd98f00b204e9800998ecf8427e, а для строки abc результат равен 900150983cd24fb0d6963f7d28e17f72.
Конструкция — классическая схема Меркла и Дамгора. Сообщение дополняется: приписывается один бит со значением 1, затем нули, затем 64-битная запись исходной длины в битах, так чтобы итог стал кратен 512 битам. Дополнение добавляется всегда, минимум 65 служебных бит, даже если длина изначально кратна блоку. Длина пишется от младшего байта к старшему, и вся внутренняя арифметика MD5 тоже работает с 32-битными словами в этом порядке — этим он отличается от SHA-2.
Внутреннее состояние — четыре 32-битных регистра с фиксированными начальными значениями 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476. Каждый 512-битный блок обрабатывается за 64 операции, разбитые на четыре раунда по 16. В раундах применяются четыре разные нелинейные функции от трёх регистров, циклические сдвиги на фиксированные величины и сложение по модулю 2 в степени 32. Шестьдесят четыре константы получены как целые части модуля синуса номера шага, умноженного на 2 в степени 32, — приём «чисел из ниоткуда», подтверждающий отсутствие спрятанной закладки. После 64 операций результат складывается с состоянием на входе блока, и обработка идёт дальше.
Терминологическая точность: MD5 — это хеш-функция, то есть алгоритм. Значение, которое она выдаёт для конкретного файла, правильно называть хеш-суммой файла, а не «его MD5».
Почему MD5 больше не считается безопасным
128-битный выход изначально давал запас в 2 в степени 64 операций до коллизии по парадоксу дней рождения — уже небольшой по нынешним меркам. Но обрушили MD5 не переборы, а структурные атаки.
В 2004 году группа Ван Сяоюнь показала способ строить пары сообщений с одинаковым дайджестом за считанные часы. К 2006 году время сократили до минут, сегодня коллизия MD5 считается на обычном ноутбуке за секунды и умещается в лабораторную работу студента.
Опаснее оказались коллизии с выбранным префиксом: атакующий берёт два произвольных, заранее заданных начала и достраивает к ним блоки так, чтобы итоговые дайджесты совпали. Эта техника, доведённая до практики в 2007–2009 годах, ломает подписи: подписывается один документ, а подпись оказывается действительной и для другого. В 2008 году исследователи изготовили работающий поддельный сертификат удостоверяющего центра. В 2012 году тем же приёмом воспользовалась вредоносная программа Flame, подделав подпись обновления Microsoft и распространяясь через штатный механизм обновлений.
Устойчивость к прообразу формально ещё держится: лучшая опубликованная атака требует порядка 2 в степени 123 операций, что практически недостижимо. По данному дайджесту восстановить исходное сообщение по-прежнему нельзя. Для криптографического применения этого мало: почти все реальные схемы — подписи, сертификаты, доказательства неизменности документа — требуют именно стойкости к коллизиям.
Отдельный сюжет — пароли. MD5 очень быстр, видеокарта считает десятки миллиардов дайджестов в секунду, поэтому база паролей, захешированная MD5 без соли, вскрывается словарём почти целиком. Хранить пароли так нельзя ни в каком виде: нужны Argon2id, bcrypt или scrypt.
Где MD5 всё ещё уместен
Там, где противника нет, а есть только случайность и невнимательность, MD5 работает нормально и остаётся востребованным по инерции и ради совместимости.
Проверка успешности копирования и переноса больших массивов внутри доверенной сети: диск испортил байт или сеть оборвала передачу — расхождение вылезет.
Дедупликация и ключи кэша: одинаковые файлы получают одинаковый идентификатор, а вероятность случайной коллизии на реальных объёмах пренебрежимо мала. Заголовок ETag в веб-серверах исторически строится именно на MD5.
Совместимость со старыми форматами и протоколами, где алгоритм зашит в спецификацию и заменить его нельзя без разрыва обратной совместимости.
Применять MD5 нельзя в электронной подписи и сертификатах, при проверке файлов из недоверенного источника, в схемах лицензирования и защиты от подделки, для хранения паролей и токенов. Российские регламенты юридически значимой подписи требуют ГОСТ Р 34.11-2012, и MD5 там не фигурирует.
MD5, SHA-256 и CRC: как выбирать
Три инструмента решают три разные задачи, и подмена одного другим — распространённая ошибка проектирования.
CRC-32 занимает 4 байта, считается почти бесплатно на аппаратной инструкции и предназначен исключительно для обнаружения помех в канале или на носителе. Подогнать данные под нужный остаток тривиально, поэтому от подмены он не защищает вовсе. CRC применяют в кадрах Ethernet, в архивах ZIP и в платёжных QR-кодах по спецификации EMVCo.
MD5 занимает 16 байт и стоит посередине: перемешивает данные качественно, но допускает подготовленные коллизии.
SHA-256 занимает 32 байта и рассчитан на противника. На процессорах с аппаратными инструкциями SHA-NI он к тому же обгоняет MD5 по скорости, так что довод «MD5 быстрее» на современном железе уже не работает.
Практическое правило: если результат проверки должен кого-то в чём-то убедить — что файл подлинный, что документ не менялся, что обновление выпущено вендором, — нужен SHA-256 или ГОСТ. Если проверка нужна только вам и только против случайного сбоя, хватит MD5, а на коротких сообщениях и CRC.
Частые вопросы
Можно ли расшифровать MD5?
Нет, расшифровывать нечего: MD5 не шифрование, ключа не существует, а информация при свёртке теряется безвозвратно. Сайты, обещающие расшифровку, ищут строку в готовых таблицах популярных паролей и словарных слов. Для короткого или словарного входа поиск сработает, для произвольного файла — никогда.
Могут ли два разных файла иметь одинаковый MD5?
Да, и не только теоретически. Для MD5 опубликованы готовые пары файлов с совпадающим дайджестом, а изготовить новую пару можно за секунды. Именно поэтому MD5 нельзя применять там, где кто-то заинтересован в подмене. Случайная же коллизия на обычных данных по-прежнему крайне маловероятна.
Почему MD5 всё ещё встречается на сайтах с дистрибутивами?
По инерции и ради старых инструментов: команда md5sum есть в любой системе, и многие сборочные конвейеры публикуют этот дайджест десятилетиями. Если рядом лежит SHA-256, проверяйте его. Если только MD5, он подтвердит, что файл скачался целиком, но не подтвердит, что его не подменили на зеркале.
Чем MD5 отличается от MD4 и MD6?
MD4 (1990) быстрее и слабее, коллизии для него находят мгновенно, применяется он теперь только в старых протоколах. MD5 добавил четвёртый раунд, отдельную константу на каждый шаг и изменил порядок обработки слов. MD6 предлагался в 2008 году на конкурс SHA-3, был отозван из финала и распространения не получил.
Сколько символов в MD5 и почему именно столько?
Тридцать два шестнадцатеричных символа. Выход функции — 128 бит, то есть 16 байт; каждый шестнадцатеричный символ кодирует ровно 4 бита, отсюда 128 делить на 4 равно 32. Длина не зависит от размера входа: и пустой файл, и образ на терабайт описываются строкой из 32 символов. По длине строки удобно опознавать алгоритм: 32 символа — MD5, 40 — SHA-1, 64 — SHA-256.