Skip to content
Назад в блог

MD5 сломали в 2004 году. Почему им всё ещё пользуются?

6 мин. чтения
MD5 сломали в 2004 году. Почему им всё ещё пользуются?

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

Что именно ломается у хэш-функции

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

Устойчивость к коллизиям означает, что злоумышленник не должен уметь подобрать два разных сообщения с одинаковым хэшем. Именно это свойство потеряли MD5 и SHA-1. Устойчивость к нахождению прообраза отвечает на другой вопрос: можно ли по заданному хэшу найти сообщение, которое его породило. Наконец, подбор пароля обычно атакует не абстрактную хэш-функцию, а конкретную базу быстро вычисляемых, плохо защищённых хэшей. Коллизии не раскрывают пароль автоматически, но высокая скорость MD5 и SHA-1 всё равно делает их неподходящими для хранения паролей.

Это различие важно для практики. Обычная контрольная сумма файла, цифровая подпись и парольная база используют хэши по-разному, поэтому одно слово «сломано» ещё не объясняет, какой именно риск возник в каждом случае.

Коллизия хэш-функции SHA-1 на двух разных документах и хронология эволюции стандартов хэширования

MD5: от осторожной замены MD4 до поддельного центра сертификации

Рональд Райвест разработал MD5 в 1991 году как более осторожное развитие MD4. Опубликованный в апреле 1992 года RFC 1321 прямо объяснял, что MD4 начали применять быстрее, чем успели всесторонне исследовать, поэтому новый алгоритм пожертвовал частью скорости ради большего запаса безопасности. В то время MD5 считался разумным выбором для компактного 128-битного отпечатка и быстро распространился в программах, протоколах и инфраструктуре открытых ключей.

Первые серьёзные предупреждения появились задолго до окончательного практического взлома, но переломным стал 2004 год, когда Ван Сяоюнь, Дэнгуо Фэн, Сюэцзя Лай и Хунбо Ю опубликовали первые пары сообщений с одинаковым MD5. Подробная техника вышла в 2005 году, после чего исследователи начали не просто ускорять поиск коллизий, а учиться придавать сталкивающимся сообщениям полезную структуру. Краткую хронологию этих работ фиксирует RFC 6151, который позднее признал MD5 неприемлемым для задач, требующих устойчивости к коллизиям.

Особенно важным оказался метод выбранного префикса. Он позволял начать с двух заранее подготовленных документов, добавить к каждому вычисленные блоки и получить одинаковый MD5. В 2008 году команда Марка Стивенса применила эту технику против коммерческого центра сертификации и создала поддельный сертификат промежуточного CA. Браузер доверял корневому центру, а значит, доверял и выпущенным через поддельный промежуточный сертификат сайтам. После этой демонстрации коллизия перестала быть лабораторной особенностью и стала прямой угрозой модели доверия веба.

Почему MD5 всё ещё встречается

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

Есть и более узкий сценарий: обнаружение случайного повреждения данных в среде, где злоумышленник не управляет входом. Для такой задачи не требуется криптографическая устойчивость к коллизиям, поэтому старые системы продолжают использовать MD5 как привычную и повсеместно доступную контрольную сумму. Однако граница здесь принципиальна. Как только недоверенная сторона может специально подготовить файл, MD5 нельзя использовать для подписи, проверки подлинности, content-addressed storage или решения, в котором одинаковый хэш означает одинаковое содержимое.

Для паролей ситуация другая. Даже если забыть о коллизиях, MD5 и SHA-1 вычисляются слишком быстро, поэтому атакующий может проверять огромное количество кандидатов в секунду. Пароли нужно хранить с помощью специально медленных функций выработки ключа, например Argon2id, scrypt, bcrypt или PBKDF2, с уникальной солью и подходящими параметрами стоимости.

SHA-1: предупреждение появилось раньше практической коллизии

NIST стандартизировал SHA-1 в 1995 году как исправленную замену SHA-0. Десять лет спустя новые криптоаналитические результаты заметно сократили ожидаемую сложность поиска коллизии, и в 2006 году NIST уже призывал быстро переходить на SHA-2 в цифровых подписях. На тот момент полной публичной коллизии SHA-1 ещё не существовало, но прежнего запаса безопасности тоже не осталось.

Практическая точка была поставлена в 2017 году, когда Google и CWI Amsterdam представили SHAttered, первую публичную коллизию полного SHA-1. Исследователи создали два разных PDF-файла с одинаковым хэшем, выполнив около девяти квинтиллионов вычислений SHA-1. Работа потребовала ресурсов, эквивалентных примерно 6500 годам одного CPU для первой фазы и 110 годам одного GPU для второй. Атака оставалась дорогой, но уже находилась в пределах возможностей крупной организации и окончательно лишила SHA-1 права считаться надёжной основой цифровых подписей.

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

SHA-2 и SHA-3 не являются двумя поколениями одной замены

Семейство SHA-2 появилось в стандарте NIST в 2002 году и включает SHA-224, SHA-256, SHA-384 и SHA-512. Для новых систем самым распространённым универсальным выбором остаётся SHA-256: известных практических атак на его полную версию нет, он широко поддерживается и подходит для цифровых подписей, отпечатков файлов и других задач, где требуется современная криптографическая хэш-функция.

После атак на MD5 и SHA-1 NIST провёл открытый конкурс нового алгоритма с конструкцией, не повторяющей SHA-2. Победителем в 2012 году стал Keccak, разработанный Гвидо Бертони, Йоаном Даменом, Михаэлем Петерсом и Жилем Ван Аше; в 2015 году он был опубликован как SHA-3 в FIPS 202. При этом NIST отдельно подчёркивает, что SHA-2 остаётся безопасным и пригодным для использования. Более высокий номер не делает SHA-3 обязательной заменой SHA-256, а даёт индустрии альтернативу с другой внутренней математикой.

Разница конструкций проявляется и в способах использования. Наивный код SHA256(secret || message) уязвим для атаки удлинением сообщения, потому что SHA-256 позволяет продолжить вычисление из опубликованного внутреннего состояния. У SHA-3 с губчатой конструкцией этой конкретной проблемы нет, но правильным решением для аутентификации сообщения всё равно служит стандартная ключевая конструкция, а не самодельная склейка секрета и данных.

HMAC: зачем хэшу нужен ключ

Обычный хэш может вычислить любой человек, поэтому совпадение с заранее полученным доверенным значением помогает проверить целостность данных, но ничего не говорит об их отправителе. HMAC добавляет секретный ключ и создаёт код аутентификации сообщения: проверить его может сторона, которая знает тот же ключ. Конструкция была стандартизирована в RFC 2104 в 1997 году Михиром Белларе, Раном Канетти и Хьюго Кравчиком.

HMAC использует два вложенных вычисления, а не простую формулу hash(key + message):

HMAC(K, m) = H( (K' ⊕ opad) || H( (K' ⊕ ipad) || m ) )

Здесь K' обозначает ключ, приведённый к размеру блока, ipad и opad являются фиксированными заполнителями, а || означает конкатенацию. Внутреннее вычисление связывает сообщение с ключом, после чего внешний слой скрывает промежуточное состояние и не позволяет продолжить его обычной атакой удлинения. Для новых систем обычно выбирают HMAC-SHA-256 или HMAC-SHA-512.

Какой алгоритм выбирать сегодня

ЗадачаПодходящий выборЧто важно помнить
Криптографический отпечаток файла или сообщенияSHA-256Универсальный современный вариант с широкой поддержкой
Альтернативная конструкция или совместимость с SHA-3SHA3-256Не является обязательным апгрейдом с SHA-256
Аутентификация webhook или API-запроса общим секретомHMAC-SHA-256Сравнивать коды нужно безопасным способом без утечки времени
Хранение паролейArgon2id, scrypt, bcrypt или PBKDF2Обычные MD5, SHA-1 и SHA-256 для этого слишком быстры
Проверка случайного повреждения в доверенной средеCRC32 или существующая legacy checksumНе использовать как доказательство подлинности
Совместимость со старым форматомMD5 или SHA-1 только по требованию форматаНе переносить старый алгоритм в новый протокол или подпись

Что умеет наш хэш-генератор

Hash Generator вычисляет хэши прямо в браузере и не отправляет введённый текст или выбранный файл на сервер. MD5 и SHA-1 оставлены для проверки старых данных и совместимости, а для новых задач доступны современные варианты:

  • SHA-256, SHA-384 и SHA-512 из семейства SHA-2;
  • SHA3-256 и SHA3-512 с губчатой конструкцией Keccak;
  • HMAC для аутентификации сообщения секретным ключом;
  • CRC32 для некриптографической проверки случайных ошибок;
  • хэширование файлов и сравнение результата с известным значением;
  • MD5 и SHA-1 для легаси-сценариев, где их требует существующий формат.

Чтобы увидеть различия, введите «Привет, мир», сравните 32 шестнадцатеричных символа MD5 с 64 символами SHA-256, а затем включите HMAC и добавьте ключ. Последний результат нельзя воспроизвести, зная только сообщение, поскольку для вычисления теперь требуется тот же секретный ключ.

Похожие инструменты

Частые вопросы

Кто и когда сломал MD5?

В 2004 году Ван Сяоюнь и её соавторы опубликовали первые пары сообщений с одинаковым MD5, а в 2005 году подробно описали метод атаки. Позже Марк Стивенс развил технику выбранного префикса и создал HashClash, с помощью которого коллизии MD5 получили практические применения.

Почему MD5 и SHA-1 всё ещё используются?

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

Чем SHA-3 отличается от SHA-2?

Семейства используют разные внутренние конструкции. SHA-256 и SHA-512 построены на итеративной схеме семейства SHA-2, а SHA-3 основан на губчатой конструкции Keccak. SHA-3 дополняет SHA-2 и обеспечивает альтернативный дизайн; переходить с безопасного SHA-256 на SHA-3 только из-за его номера не требуется.

Что такое HMAC и зачем он нужен?

HMAC сочетает хэш-функцию с секретным ключом и позволяет обнаружить изменение сообщения, а также проверить, что код аутентификации создала сторона, знающая этот ключ. Конструкция стандартизирована в RFC 2104 и защищает от ошибок наивной схемы hash(key + message).

Почему хэш — это не шифрование?

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

Автор

Fullstack Engineer

В коммерческой разработке с 2011 года — больше 15 лет. Автор двух SaaS-продуктов: TeleGo.io и LingvoHabit.com. Статьи здесь выросли из реальной клиентской и продуктовой работы.

Подробнее об автореНаписать в Telegram

Похожие статьи

SYSTEMD
SYSTEMD · '26

systemd Builder: как Linux перешёл от init-скриптов к unit-файлам

Почему Linux-дистрибутивы перешли от SysV-скриптов к systemd: зависимости сервисов, активация по сокету, cgroups и спор о границах проекта.

#systemd #Lennart Poettering #SysV init #Linux systemd #unit файлы #systemd controversy
6 мин. чтения
COMMAND EXPLAINER
COMMAND EXPLAINER · '26

Command Explainer: как читать man-страницы и понимать Unix

Первая man-страница написана в 1971 году для UNIX. Документация остаётся главным источником знаний. Объясняем сложные команды простым языком — от tar до awk.

#Command Explainer #man pages #Unix philosophy #CLI документация #Linux команды #awk sed tar
3 мин. чтения
ВЗЛОМ САЙТА
ВЗЛОМ САЙТА · '26

Неавторизованная реклама на сайте: как найти взлом и веб-шеллы (разбор реального кейса)

Владелец сайта заметил чужую рекламу Google, которую сам не подключал. Пошаговое расследование: от grep по базе до обнаружения PNG-полиглотов с PHP-шеллом и техники CosmicSting в Magento.

#Взлом сайта #Malvertising #Веб-шеллы #Безопасность #Magento #CosmicSting #Incident Response
5 мин. чтения