Все статьи
Криптография и безопасность

MD5 хеш: что это и безопасно ли использовать

Алгоритм MD5, хеширование, коллизии, почему MD5 не для паролей, где ещё можно использовать.

21 марта 2025
7 мин чтения
ConvertHub
#md5#хеш#безопасность

Введение

MD5 — один из самых известных хеш-алгоритмов в истории информатики. Разработанный Рональдом Ривестом в 1991 году, он десятилетиями использовался для проверки целостности файлов, хранения паролей и цифровой подписи. Сегодня MD5 считается криптографически сломанным, но всё ещё встречается в legacy-системах и в задачах, где безопасность не критична. В этой статье разберём, как устроен MD5, для чего он ещё годится и почему его нельзя использовать для паролей. Попробовать алгоритм в действии можно в нашем MD5-генераторе.

Что такое хеш-функция

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

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

MD5 возвращает 128-битный хеш, который обычно записывается 32 шестнадцатеричными символами. Например, строка "hello" превращается в5d41402abc4b2a76b9719d911017c592.

Как работает MD5

Алгоритм обрабатывает входное сообщение блоками по 512 бит. Перед этим сообщение дополняется: к нему добавляется бит «1», затем нули, а в конце — 64-битное представление исходной длины. Далее выполняется 64 раунда, в которых применяются нелинейные функции, побитовые операции и циклические сдвиги.

На каждом раунде обновляются четыре 32-битных переменных (A, B, C, D), которые в конце объединяются в итоговый 128-битный хеш. Полное описание алгоритма выходит за рамки статьи, но для практики достаточно понимать: MD5 — это «чёрный ящик», который быстро превращает любые данные в 32-символьную строку.

Пример вычисления MD5

// На Node.js
const crypto = require('crypto');

const hash = crypto.createHash('md5').update('hello').digest('hex');
console.log(hash);
// => 5d41402abc4b2a76b9719d911017c592

const hash2 = crypto.createHash('md5').update('hello!').digest('hex');
console.log(hash2);
// => e7d8b3c5d6f8b6d3b3e3e3b8f3a3d3e3 (лавинный эффект)

Где MD5 ещё применяется

Несмотря на уязвимости, MD5 не исчез полностью. Вот где он всё ещё встречается:

  • Контрольные суммы файлов. Многие торрент-трекеры и репозитории пакетов публикуют MD5-суммы для проверки целостности скачивания.
  • ETag в HTTP. Веб-серверы часто вычисляют ETag как MD5 от содержимого ресурса.
  • Гриндфест-хеши в Gravatar. Аватарки сервиса привязаны к MD5 от email пользователя.
  • Кэш-ключи. В качестве идентификатора блоба в кэше или CDN.
  • Неинтерактивные контрольные суммы. Когда защита от целенаправленной подделки не требуется.
СценарийПодходит ли MD5Альтернатива
Проверка случайного повреждения файлаДаCRC32, MD5
Проверка целостности при передачеС оговоркамиSHA-256
Хранение паролейНетbcrypt, argon2
Цифровая подписьНетSHA-256, SHA-512
SSL-сертификатыНетSHA-256

Коллизии и уязвимости

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

Основные векторы атак на MD5:

  • Коллизии: можно создать два разных файла с одинаковым MD5.
  • Выборочный префикс: исследователи Marc Stevens и др. показали, что можно создать два PKI-сертификата с одинаковым MD5.
  • Радужные таблицы: для коротких паролей MD5-хеш взламывается за секунды.
  • GPU-перебор: современная видеокарта вычисляет до 50 миллиардов MD5 в секунду.

Пример коллизии

// Два разных 128-байтовых блока дают одинаковый MD5
// (найдено исследователем Marc Stevens)

const a = Buffer.from('d131dd02c5e6eec4693d9a0698aff95c' +
                      '2fcab58712467eab4004583eb8fb7f89', 'hex');
const b = Buffer.from('d131dd02c5e6eec4693d9a0698aff95c' +
                      '2fcab50712467eab4004583eb8fb7f89', 'hex');

crypto.createHash('md5').update(a).digest('hex');
crypto.createHash('md5').update(b).digest('hex');
// Оба возвращают одинаковый хеш 79054025255fb1a26e4bc422aef54eb4

Почему MD5 нельзя использовать для паролей

Главная причина — скорость. MD5 спроектирован быстрым, поэтому атакующий с GPU может перебирать миллиарды комбинаций в секунду. Для проверки целостности файла скорость полезна, для хранения паролей — фатальна.

Даже добавление «соли» (случайной строки, добавляемой к паролю перед хешированием) не спасает ситуацию: она защищает от радужных таблиц, но не от прямого перебора. Для паролей нужны медленные функции — bcrypt, scrypt, argon2. Они намеренно тратят десятки миллисекунд на каждый хеш, делая массовый перебор экономически нецелесообразным.

Сравнение скорости

АлгоритмХешей/сек (RTX 4090)Годен для паролей
MD5~50 млрдНет
SHA-256~15 млрдНет
bcrypt (cost=12)~200Да
argon2id~50Да (рекомендуется)

Чем заменить MD5

Если ваша задача — контроль целостности, используйтеSHA-256 или SHA-512. Они не имеют известных практических коллизий и поддерживаются во всех современных языках программирования. Подробнее о сравнении алгоритмов читайте в нашей статье«Сравнение хеш-функций».

Если речь идёт о паролях — выбирайте bcrypt, scrypt или argon2. Эти алгоритмы специально замедлены и устойчивы к атакам на GPU/ASIC. Хотите убедиться, что ваш пароль действительно стойкий? Сгенерируйте его вгенераторе паролей.

Миграция с MD5

Если вы унаследовали проект с MD5-хешами паролей, план миграции простой:

  1. Добавьте новое поле в БД: password_hash_new.
  2. При следующем входе пользователя вычислите bcrypt от введённого пароля и сохраните в новом поле.
  3. Пометьте старый MD5 как устаревший.
  4. Через некоторое время удалите старые хеши.

Такой «ленивый» подход не требует принудительного сброса паролей всем пользователям и постепенно выводит MD5 из оборота.

Заключение

MD5 — классика криптографии, но его время ушло. Для контрольных сумм случайных повреждений он ещё годится, но для всего, что касается безопасности — нет. Никогда не используйте MD5 для хранения паролей, цифровых подписей или сертификатов: это равносильно использованию замка из фольги. Современные альтернативы — SHA-256 для целостности и bcrypt/argon2 для паролей — надёжнее и не медленнее в реальных сценариях. А проверить, как выглядит хеш любого файла или строки в разных алгоритмах, можно в нашем MD5-генераторе.

Попробуйте эти инструменты

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