Перейти к содержимому
Toova
Все инструменты

MD5 против SHA-256 — почему стоит прекратить использовать MD5

Toova

MD5 повсюду. Он поставляется в каждом языке программирования, каждой базе данных, SDK каждого облачного провайдера. Разработчики тянутся к нему по привычке — он быстрый, создаёт аккуратную 32-символьную шестнадцатеричную строку, и API укладывается в две строки кода. Проблема: MD5 криптографически скомпрометирован с 2004 года, а атаки с тех пор только становились быстрее и дешевле.

Это не теория. Кибератака 2012 года на иранскую инфраструктуру — вредоносная программа Flame — подделала сертификат подписи кода Microsoft, используя коллизию MD5. Та же техника, которую академические криптографы продемонстрировали в статье, стала оружием в геополитическом шпионаже. MD5 не просто слегка ослаблен — он фундаментально скомпрометирован для любого приложения, где злоумышленник может выбирать входные данные.

SHA-256, входящий в семейство SHA-2, стандартизированный NIST, не имеет известных атак на коллизии и остаётся стандартом криптографической целостности в 2026 году. В этой статье объясняется именно то, в чём состоит разница, когда (редко) MD5 ещё допустим и как безопасно мигрировать. Вы можете мгновенно вычислить оба хеша с помощью инструментов MD5 и SHA-256 от Toova.

Как работают хеш-функции

Криптографическая хеш-функция принимает ввод любой длины и создаёт вывод фиксированной длины (дайджест) со следующими свойствами:

  • Детерминированность: одинаковый ввод всегда даёт одинаковый вывод.
  • Лавинный эффект: изменение одного бита во вводе полностью меняет вывод.
  • Стойкость к восстановлению прообраза: по заданному хешу вычислительно невозможно найти ввод.
  • Стойкость к коллизиям: вычислительно невозможно найти два разных ввода, дающих одинаковый хеш.

Именно лавинный эффект заставляет MD5 и SHA-256 выглядеть похоже на первый взгляд:

MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6

MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b
SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be

В вводе изменён один символ («dog» → «cog»), но вывод полностью другой. Это свойство справедливо для обоих алгоритмов. Разница в том, что происходит, когда злоумышленник пытается намеренно найти коллизию.

MD5 — хронология провалов (1996–2025)

MD5 разработан Роном Ривестом в 1991 году как замена MD4. К 1996 году Ханс Доббертин обнаружил коллизии в функции сжатия MD5 — не в полном алгоритме, но как предупреждающий знак хрупкости конструкции. Сообщество безопасности начало рекомендовать переход на SHA-1. Большинство систем проигнорировали это.

2004 — продемонстрированы полные коллизии

В августе 2004 года Сяоюнь Ван и Хунбо Ю представили практическую атаку на коллизию MD5 на конференции CRYPTO. Им удавалось генерировать два разных 1024-битных сообщения с одинаковым MD5-хешем менее чем за час на кластере. Фундаментальная гарантия MD5 — стойкость к коллизиям — была сломана.

NIST немедленно начал объявлять MD5 устаревшим для федерального использования. Большинство отраслевых рекомендаций последовали. Фактическое применение MD5 в рабочих системах почти не изменилось.

2008 — мошеннические сертификаты CA

Группа исследователей (Сотиров, Стивенс и др.) продемонстрировала, что можно создать мошеннический сертификат удостоверяющего центра, которому доверяли бы все крупные браузеры. Атака использовала тот факт, что несколько удостоверяющих центров по-прежнему подписывали сертификаты с помощью MD5. Исследователи сгенерировали коллизию между законно выглядящим запросом на сертификат и специально созданным CA-сертификатом — затем получили реальный CA для подписи законного, что дало подпись, действительную и для поддельного CA-сертификата.

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

2012 — вредоносная программа Flame

Вредоносная программа Flame, обнаруженная в 2012 году и приписанная государственным структурам, подделала сертификат Windows Update Microsoft с использованием коллизии MD5 с выбранным префиксом. Атака была более сложной, чем демонстрация 2008 года: злоумышленники могли создать вредоносную полезную нагрузку, которая вступала в коллизию с действительным сертификатом Microsoft в условиях, когда инфраструктура подписания Microsoft невольно кооперировалась.

В результате Flame мог распространяться через Windows Update, как будто являясь законным обновлением Microsoft, с действительной подписью Microsoft. Сотни тысяч машин Windows в Иране, Ливане, Сирии и Судане были заражены. Это была реальная эксплуатация атак на коллизии MD5 в государственном масштабе. Полную историю смотрите в статье Википедии о Flame.

2019–2025 — HashClash и мгновенные коллизии

Проект HashClash (Марк Стивенс, CWI Amsterdam) продолжал доводить генерацию коллизий MD5 до практических пределов. К 2019 году коллизии MD5 с выбранным префиксом — когда злоумышленник может выбирать произвольные префиксы для обоих сталкивающихся сообщений — можно было генерировать за дни на обычном оборудовании. К 2022 году оптимизированные реализации сократили это до часов. В 2024 году статья HashClash продемонстрировала коллизии менее чем за минуту на одном современном GPU.

Тенденция очевидна: атаки на коллизии MD5 не становятся сложнее по мере улучшения оборудования — они становятся проще. То, что в 2004 году требовало кластера, в 2026 году делает ноутбук.

SHA-256 — почему он держится

SHA-256 входит в семейство SHA-2, разработанное АНБ и стандартизированное NIST в 2001 году. Он создаёт 256-битный (32-байтный) дайджест. По состоянию на 2026 год практических атак на коллизии SHA-256 не известно. Лучшие опубликованные атаки снижают теоретический коэффициент работы по нахождению коллизий примерно до 2^187 операций — что по-прежнему далеко за пределами любых вычислительных ресурсов, которые существуют или обозримы.

Запас безопасности SHA-256 намеренно консервативен. Даже если оборудование улучшится в миллиард раз (примерно 30 удвоений по закону Мура), взлом SHA-256 остаётся вычислительно нецелесообразным. Эффективный коэффициент работы MD5 для коллизий — 2^18 до 2^23 — был в пределах досягаемости скромного оборудования ещё в 2004 году.

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

Когда MD5 всё ещё допустим (редко)

«Скомпрометирован» не означает «бесполезен для любых целей». MD5 остаётся приемлемым в контекстах, где:

  • Злоумышленника нет: обнаружение случайного повреждения файлов в доверенной внутренней системе — не проверка загрузок из интернета, а проверка успешного завершения копирования файла.
  • Скорость важнее безопасности: вычисление ключей кеша или идентификаторов шардов, где коллизия просто означает промах кеша, а не брешь безопасности. Модель злоумышленника отсутствует.
  • Вы сопрягаетесь с существующей внешней системой: некоторые устаревшие API по-прежнему отправляют MD5 ETag или контрольные суммы. Вы можете принимать и вычислять MD5 для совместимости, пока не используете его для принятия решений о безопасности.
  • Разбиение таблицы хешей: распределение данных по корзинам по MD5 ключа. Коллизии здесь вызывают дисбаланс, а не сбои безопасности.

Общее правило: MD5 приемлем, когда приложение не зависит от стойкости к коллизиям и нет злоумышленника, который может создавать входные данные. Как только одно из условий нарушается — злоумышленник присутствует или коллизия = сбой безопасности — переходите на SHA-256.

Распространённые мифы о MD5

«MD5 нормален, если добавить соль»

Солирование меняет ввод так, что два пользователя с одинаковым паролем получают разные хеши — это предотвращает атаки с радужными таблицами. Но оно не исправляет проблему коллизий. Злоумышленник с солёным MD5-хешем по-прежнему может эффективно перебирать его, потому что MD5 быстрый: современные GPU вычисляют около 10–30 миллиардов хешей MD5 в секунду. Соль добавляет работу, пропорциональную пространству поиска, но не сложности алгоритма.

Для хеширования паролей ни MD5, ни SHA-256 не подходят вне зависимости от солирования. Используйте bcrypt, scrypt или Argon2.

«MD5 нормален, потому что мы используем его только внутренне»

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

«SHA-256 избыточен — MD5 быстрее»

На современном оборудовании с инструкциями ускорения SHA, SHA-256 примерно в 2–5 раз медленнее MD5. Для большинства приложений — проверка целостности файлов, подписи API, ключи кеша — разница составляет микросекунды на операцию, незаметные на практике. Аргумент производительности в пользу MD5 над SHA-256 справедлив только в крайне высокопроизводительных сценариях, где важны даже микросекунды, и даже тогда обычно есть лучшие решения, чем использование скомпрометированного алгоритма.

Руководство по миграции — с MD5 на SHA-256

Хеширование паролей

// НЕВЕРНО: MD5 для хеширования паролей
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Время взлома на современном GPU: секунды или минуты
// НЕВЕРНО: SHA-256 для хеширования паролей (всё ещё слишком быстрый)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');

// ВЕРНО: используйте bcrypt, scrypt или Argon2 для паролей
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);

Миграция хранящихся хешей паролей требует постепенного подхода. При каждом успешном входе: проверьте пароль по существующему MD5-хешу, затем немедленно пересчитайте с помощью bcrypt и замените хранящееся значение. Пометьте каждый аккаунт как мигрированный. После разумного периода (обычно 90 дней) принудительно сбросьте пароль для оставшихся аккаунтов, по-прежнему использующих MD5-хеши.

Целостность файлов / контрольные суммы

# Linux: проверка скачанного файла
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256

# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256

Переход с MD5 на SHA-256 для проверки целостности файлов обычно является простой заменой в коде. Два подводных камня: (1) существующие контрольные суммы, хранящиеся в базах данных или файлах, необходимо пересчитать и обновить — нет никакого ярлыка; (2) внешние API или системы хранения, предоставляющие MD5 ETag (например, некоторые конфигурации S3), требуют координации для переключения.

HMAC для аутентификации API

// HMAC-SHA-256 для аутентификации сообщений
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
  .update(message)
  .digest('hex');

Если вы используете HMAC-MD5 для подписи API-запросов, переходите на HMAC-SHA-256. Конструкция HMAC добавляет секретный ключ, что ограничивает некоторые атаки MD5, но HMAC-MD5 имеет уязвимости расширения длины, а лежащий в основе примитив по-прежнему скомпрометирован. Современные стандарты (JWT, AWS SigV4, OAuth 2.0) все указывают HMAC-SHA-256. Генератор HMAC Toova поддерживает HMAC-SHA-256 и HMAC-SHA-512 для тестирования.

Цифровые подписи и сертификаты

Любой сертификат, подписанный с помощью MD5, следует немедленно перевыпустить — большинство удостоверяющих центров прекратили выдавать сертификаты с подписью MD5 после 2008 года, и все крупные браузеры и операционные системы их отклоняют. Для внутренней PKI проверьте конфигурацию CA и убедитесь, что SHA-256 является минимально допустимым алгоритмом подписи. RSA-SHA256 или ECDSA-SHA256 — действующие стандарты.

MD5 против SHA-256 — краткий справочник

Свойство MD5 SHA-256
Длина вывода 128 бит (32 шест. символа) 256 бит (64 шест. символа)
Стойкость к коллизиям Скомпрометирована (практические атаки) Безопасна (нет известных атак)
Хеширование паролей Никогда Нет (используйте bcrypt/Argon2)
Цифровые подписи Никогда Да
Целостность файлов (безопасность) Никогда Да
Контрольные суммы без требований безопасности Допустимо (нет злоумышленника) Всегда нормально
Ключи кеша Допустимо Всегда нормально
Подпись TLS-сертификата Отклоняется браузерами Стандарт
Соответствие FIPS 140-3 Нет (устарел) Да

Заключение

MD5 криптографически скомпрометирован с 2004 года. Коллизии с выбранным префиксом — техника, лежащая в основе вредоносной программы Flame — теперь вычислительно дёшевы. Любое приложение, опирающееся на MD5 для обеспечения безопасности (подписи, проверка целостности, аутентификация), уязвимо для атак, выполнение которых занимает минуты вычислений.

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

Путь миграции прост: проверки целостности файлов — это замена в коде. Подписи API требуют координации для версионирования. Хеши паролей нуждаются в стратегии постепенного перехеширования при входе. Для любого нового кода SHA-256 должен быть выбором по умолчанию. Вычисляйте и сравнивайте хеши непосредственно с MD5 и SHA-256 от Toova — или генерируйте коды аутентификации HMAC-SHA-256 с помощью генератора HMAC.