MD5 хеш: что это и безопасно ли использовать
Алгоритм MD5, хеширование, коллизии, почему 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-хешами паролей, план миграции простой:
- Добавьте новое поле в БД:
password_hash_new. - При следующем входе пользователя вычислите bcrypt от введённого пароля и сохраните в новом поле.
- Пометьте старый MD5 как устаревший.
- Через некоторое время удалите старые хеши.
Такой «ленивый» подход не требует принудительного сброса паролей всем пользователям и постепенно выводит MD5 из оборота.
Заключение
MD5 — классика криптографии, но его время ушло. Для контрольных сумм случайных повреждений он ещё годится, но для всего, что касается безопасности — нет. Никогда не используйте MD5 для хранения паролей, цифровых подписей или сертификатов: это равносильно использованию замка из фольги. Современные альтернативы — SHA-256 для целостности и bcrypt/argon2 для паролей — надёжнее и не медленнее в реальных сценариях. А проверить, как выглядит хеш любого файла или строки в разных алгоритмах, можно в нашем MD5-генераторе.
Попробуйте эти инструменты
Похожие статьи
Как создать надёжный пароль: генератор паролей
Правила создания паролей, длина, символы, энтропия, менеджеры паролей, двухфакторная аутентификация.
SHA-256: безопасное хеширование
Алгоритм SHA-256, применение в блокчейне, SSL, цифровые подписи, сравнение с MD5 и SHA-1.
UUID: генерация уникальных идентификаторов
UUID версии 1-5, GUID, использование в базах данных, распределённых системах, генерация.
Bcrypt: правильное хеширование паролей
Почему bcrypt для паролей, salt, cost factor, сравнение с SHA, лучшие практики безопасности.