MD5 и SHA-256: какой алгоритм хеширования выбрать?
Хеширование — одна из самых базовых операций в вычислениях, и тем не менее неверный выбор алгоритма может открыть систему для коллизионных атак, повреждения данных или ненужных потерь производительности. Это руководство сравнивает четыре самых распространённых алгоритма хеширования и даёт чёткую рамку для принятия решения.
Что такое хеш-функция?
Криптографическая хеш-функция принимает произвольные входные данные и выдаёт вывод фиксированного размера («digest» или «хеш»). Хорошая хеш-функция обладает тремя свойствами:
- Детерминированность: один и тот же вход всегда даёт один и тот же вывод.
- Однонаправленность: невозможно обратить хеш и восстановить исходный вход.
- Стойкость к коллизиям: вычислительно невозможно найти два разных входа, дающих одинаковый хеш.
Когда свойство №3 нарушается, алгоритм считают «криптографически сломанным» — именно это случилось с MD5 и SHA-1.
Сравнение алгоритмов с первого взгляда
| Свойство | MD5 | SHA-1 | SHA-256 | SHA-512 |
|---|---|---|---|---|
| Размер вывода | 128 бит (32 hex-символа) | 160 бит (40 hex-символов) | 256 бит (64 hex-символа) | 512 бит (128 hex-символов) |
| Размер блока | 512 бит | 512 бит | 512 бит | 1024 бит |
| Год появления | 1991 | 1995 | 2001 | 2001 |
| Автор | Ron Rivest | NSA / NIST | NSA / NIST | NSA / NIST |
| Стойкость к коллизиям | Сломан (2004) | Сломан (2017) | Безопасен | Безопасен |
| Скорость (относительная) | Самый быстрый | Быстрый | Умеренная | Умеренная (быстрее на 64-бит) |
| Статус NIST | Deprecated | Deprecated | Рекомендован | Рекомендован |
MD5: быстрый, но сломанный
MD5 (Message-Digest Algorithm 5) разработан Рональдом Ривестом в 1991 году и стал де-факто стандартом для контрольных сумм в 1990-е и начале 2000-х. Производит 128-битный хеш из 32 шестнадцатеричных символов.
Почему MD5 сломан
В 2004 году Сяоюнь Ван продемонстрировала практические коллизионные атаки против MD5. К 2008 году исследователи создали поддельный SSL-сертификат на основе MD5-коллизии, доказав, что атака не теоретическая. Сегодня MD5-коллизии генерируются за секунды на потребительском железе.
// Получение MD5-хеша (только для не-secure сценариев)
// Web Crypto API не поддерживает MD5 — используйте библиотеку
import { md5 } from 'hash-wasm';
const hash = await md5('Hello, World!');
console.log(hash);
// → 'bea8252ff4e80f41719ea13cdf007273' (32 hex-символа)
Когда MD5 ещё уместен
Несмотря на криптографическую сломанность, MD5 остаётся полезен в задачах вне сферы безопасности:
- Дедупликация файлов: обнаружение дубликатов в системах хранения
- Ключи кеша: генерация коротких детерминированных ключей для поиска в кеше
- Контрольные суммы целостности: быстрая проверка, что данные случайно не повредились (но не намеренно подделаны)
- Совместимость с legacy: взаимодействие со старыми системами, требующими MD5
Ключевое различие: MD5 защищает от случайного повреждения, но не от намеренной манипуляции.
SHA-1: deprecated, но всё ещё встречается
SHA-1 (Secure Hash Algorithm 1) разработан NSA и опубликован NIST в 1995 году. Производит 160-битный хеш из 40 шестнадцатеричных символов.
В 2017 году Google и CWI Amsterdam продемонстрировали первую практическую коллизию SHA-1 (атака «SHAttered»), сгенерировав два разных PDF-файла с одинаковым SHA-1-хешем. К 2016 году крупные браузеры и удостоверяющие центры уже отказывались от SHA-1-сертификатов.
Используйте SHA-1 только для совместимости с системами, где он обязателен (например, Git хранит SHA-1 для commit-хешей, хотя и переходит на SHA-256). Для любой новой разработки выбирайте SHA-256 или сильнее.
SHA-256: текущий стандарт
SHA-256 — часть семейства SHA-2, разработанного NSA и опубликованного NIST в 2001 году. Производит 256-битный хеш из 64 шестнадцатеричных символов и в 2026 году рекомендован практически для любого хеширования.
// Получение SHA-256-хеша через Web Crypto API (нативно в браузере)
async function sha256(text) {
const data = new TextEncoder().encode(text);
const hash = await crypto.subtle.digest('SHA-256', data);
return Array.from(new Uint8Array(hash))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
}
const hash = await sha256('Hello, World!');
console.log(hash);
// → 'dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f'
Почему SHA-256 — выбор по умолчанию
- Нет известных атак: на 2026 год не существует практических коллизионных или прообразных атак
- Нативно в браузере: доступен через Web Crypto API во всех современных браузерах — библиотеки не нужны
- Промышленный стандарт: применяется в TLS-сертификатах, Bitcoin, пакетных менеджерах (npm, pip), Docker image digest и большинстве систем проверки целостности
- Одобрен NIST: рекомендован для всех security-критичных приложений
SHA-512: когда нужно больше
SHA-512 производит 512-битный хеш из 128 шестнадцатеричных символов. Использует размер блока 1024 бит (против 512 у SHA-256), что делает его быстрее на 64-битных процессорах — за один цикл обрабатывается больше данных.
# Python: SHA-512 такой же простой, как SHA-256
import hashlib
hash_256 = hashlib.sha256(b'Hello, World!').hexdigest()
hash_512 = hashlib.sha512(b'Hello, World!').hexdigest()
print(f"SHA-256: {hash_256}") # 64 символа
print(f"SHA-512: {hash_512}") # 128 символов
Применяйте SHA-512, когда:
- Нужен больший security-margin (256-битная стойкость к коллизиям против 128-битной у SHA-256)
- Платформа 64-битная и важна производительность (SHA-512 может быть в 1,5 раза быстрее SHA-256 на x86-64)
- Этого требует протокол или спецификация (некоторые сертификатные схемы, специфические compliance-требования)
Для большинства приложений SHA-256 достаточен. Дополнительная длина SHA-512-хеша удваивает хранение и трафик без практической пользы по безопасности в типичных сценариях.
Рамка решения: какой хеш использовать
Для целостности файлов и контрольных сумм
Используйте SHA-256. Это стандарт для проверки скачиваемых файлов, сравнения содержимого и обнаружения повреждений. Если вы заменяете существующую MD5-систему, SHA-256 — drop-in замена.
# Проверка целостности скачанного файла
sha256sum downloaded-file.tar.gz
# Сравните вывод с опубликованным хешем
Для хранения паролей
Не применяйте напрямую ни MD5, ни SHA-256. Хеш-функции общего назначения слишком быстры для паролей — атакующий может проверять миллиарды вариантов в секунду. Вместо этого используйте специализированный алгоритм для паролей:
| Алгоритм | Статус | Замечания |
|---|---|---|
| Argon2id | Рекомендован | Победитель Password Hashing Competition 2015; memory-hard |
| bcrypt | Хорошо | Широкая поддержка; встроенная соль; настраиваемый work factor |
| scrypt | Хорошо | Memory-hard; используется в некоторых криптовалютах |
| PBKDF2 | Приемлемо | Одобрен NIST, но не memory-hard; используйте ≥600 000 итераций |
| SHA-256 | Недостаточно | Слишком быстрый; нет встроенной соли; уязвим к GPU-атакам |
| MD5 | Опасно | Сломан + слишком быстрый; легко взламывается |
// НЕВЕРНО: не хешируйте пароли через SHA-256
const hash = await sha256(password); // Подбирается миллиардами в секунду
// ВЕРНО: используйте bcrypt (пример Node.js)
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12); // 12 раундов = ~250 мс
const isValid = await bcrypt.compare(input, hash);
Для HMAC и аутентификации сообщений
Используйте SHA-256 с HMAC. HMAC (Hash-based Message Authentication Code) сочетает хеш-функцию с секретным ключом для проверки целостности и подлинности:
// HMAC-SHA256 для проверки подписи webhook
async function verifyWebhook(payload, signature, secret) {
const key = await crypto.subtle.importKey(
'raw', new TextEncoder().encode(secret),
{ name: 'HMAC', hash: 'SHA-256' }, false, ['verify']
);
const sig = Uint8Array.from(atob(signature), c => c.charCodeAt(0));
return crypto.subtle.verify('HMAC', key, sig, new TextEncoder().encode(payload));
}
Для content-addressable хранения
Используйте SHA-256. Git, Docker и IPFS применяют content-addressable storage, где хеш контента служит его адресом. SHA-256 даёт достаточную стойкость к коллизиям, чтобы гарантировать уникальность среди миллиардов объектов.
Бенчмарки производительности
Относительная скорость хеширования на современном x86-64 процессоре (выше = быстрее):
| Алгоритм | Пропускная способность (МБ/с) | Относительная скорость |
|---|---|---|
| MD5 | ~3200 | 1,0× (базовая) |
| SHA-1 | ~2400 | 0,75× |
| SHA-256 | ~1500 | 0,47× |
| SHA-512 | ~2100 | 0,66× |
Замечание: SHA-512 быстрее SHA-256 на 64-битных процессорах из-за более широкого внутреннего состояния. На 32-битных системах ситуация обратная. Для большинства приложений разница в скорости не имеет значения — хеширование 1 МБ занимает менее 1 мс любым из этих алгоритмов.
Типичные ошибки, которых стоит избегать
1. Использование MD5 для безопасности
MD5-коллизии тривиальны для генерации. Никогда не используйте MD5 для цифровых подписей, проверки сертификатов или любого сценария, где атакующий может подобрать вредоносный вход.
2. Хеширование паролей через SHA-256
SHA-256 — не парольный хеш. Он слишком быстрый, без встроенной соли и уязвим к радужным таблицам и GPU-ускоренной brute-force атаке. Используйте Argon2id или bcrypt — подробное сравнение в сравнении bcrypt, Argon2 и scrypt. Математика устойчивости к brute-force разобрана в руководстве по энтропии паролей.
3. Уверенность, что длина хеша равна безопасности
512-битный хеш не «более безопасен» автоматически по сравнению с 256-битным с точки зрения стойкости к коллизиям. Запас прочности SHA-256 (128-битная коллизионная стойкость) уже далеко за пределами возможностей brute-force. Выбирайте по реальным требованиям, а не по длине хеша.
4. Самописные комбинации хешей
Паттерны вроде SHA256(MD5(data)) или MD5(data + salt) не магически чинят сломанный алгоритм. Используйте один хорошо проверенный алгоритм (SHA-256) или правильную конструкцию (HMAC).
Попробуйте сами
Получайте и сравнивайте MD5, SHA-1, SHA-256 и SHA-512 хеши мгновенно с нашим генератором хешей — вставьте текст или загрузите файл и увидьте все четыре digest рядом. На 100% работает в браузере, данные никогда не покидают устройство.
Подборка материалов по веб-безопасности (аутентификация, валидация ввода, security-заголовки) разобрана в руководстве по основам веб-безопасности; обзор базовых инструментов разработчика (кодирование, хеширование и преобразование данных) см. в подборке базовых инструментов разработчика.
Часто задаваемые вопросы
MD5 ещё безопасен для контрольных сумм?
MD5 безопасен для обнаружения случайной порчи файла — если файл повредился при скачивании, MD5-хеш почти наверняка изменится. Однако MD5 не защищает от намеренной подделки: атакующий может подобрать модифицированный файл с тем же MD5-хешем. Для проверки целостности там, где атакующий — часть модели угроз (например, дистрибуция софта), используйте SHA-256.
Насколько SHA-256 медленнее MD5?
SHA-256 примерно в 2 раза медленнее MD5 по сырой пропускной способности. На современном железе MD5 выдаёт около 3200 МБ/с, а SHA-256 — около 1500 МБ/с. На практике эта разница незначима для большинства приложений: вычисление SHA-256 для файла 100 МБ занимает около 70 мс. Разница в скорости важна только для очень высоконагруженных сценариев — анализ сетевых пакетов или дедупликация в хранилище промышленного масштаба.
Использовать SHA-256 или SHA-512?
Используйте SHA-256 для большинства приложений — он даёт 128-битную коллизионную стойкость, что заметно превосходит возможности brute-force. Выбирайте SHA-512, если: (а) платформа 64-битная и нужна максимальная пропускная способность, (б) этого требует спецификация или compliance, (в) нужен больший security-margin для долгосрочной целостности данных. Дополнительная длина SHA-512 удваивает объём хранения и редко необходима.
Можно ли взломать или обратить SHA-256?
SHA-256 нельзя обратить — это однонаправленная функция. На 2026 год не существует практических прообразных или коллизионных атак против SHA-256. Лучшая известная атака требует 2¹²⁸ операций для коллизии, что вычислительно неосуществимо современными или обозримыми технологиями. SHA-256 одобрен NIST и применяется в критической инфраструктуре, включая TLS, Bitcoin и федеральные системы.
Почему некоторые системы всё ещё используют MD5, если он сломан?
Главная причина — совместимость с legacy. Многие существующие системы, протоколы и форматы файлов проектировались вокруг MD5 до обнаружения его слабостей. Миграция требует скоординированных изменений во всех компонентах. Для не-security сценариев — кеширование и дедупликация — преимущество MD5 в скорости и более коротком выводе делает его прагматичным выбором, где коллизионные атаки не часть модели угроз.