Хеширование — преобразование данных произвольной длины в строку фиксированного размера (хеш). Хеш-функции применяются для проверки целостности файлов, хранения паролей, цифровых подписей и блокчейна. В этой статье разберём, как работают MD5, SHA-256 и SHA-512, когда их использовать и почему некоторые алгоритмы больше не подходят для защиты данных.
Для быстрого вычисления хеша используйте онлайн-генератор хешей на reChecker.
Что такое хеш и хеш-функция
Хеш-функция принимает входные данные любой длины и возвращает выход фиксированной длины. Один и тот же вход всегда даёт один и тот же хеш. Изменение хотя бы одного бита во входе приводит к совершенно другому результату — это свойство называют лавинным эффектом.
Хеш необратим: по хешу нельзя восстановить исходные данные. Это отличает хеширование от шифрования, где данные можно расшифровать ключом.
Лавинный эффект
Лавинный эффект — ключевое свойство криптографических хеш-функций. Изменение одного бита во входных данных должно менять примерно половину битов в выходе. Например, хеш строки Hello, World! и Hello, World? (разница в последнем символе) полностью различается. Это затрудняет поиск коллизий и предсказание хеша по похожему входу.
Основные свойства хороших хеш-функций
| Свойство | Описание |
|---|---|
| Детерминированность | Одинаковый вход всегда даёт одинаковый хеш |
| Фиксированная длина | Размер выхода не зависит от размера входа |
| Лавинный эффект | Малое изменение входа сильно меняет хеш |
| Устойчивость к коллизиям | Сложно найти два разных входа с одинаковым хешем |
| Односторонность | Невозможно вычислить вход по хешу за разумное время |
MD5: история и применение
MD5 (Message-Digest Algorithm 5) разработан Рональдом Ривестом в 1991 году. Выдаёт хеш длиной 128 бит (32 шестнадцатеричных символа). Алгоритм обрабатывает данные блоками по 512 бит и использует побитовые операции, сложение по модулю и сдвиги.
Почему MD5 больше не безопасен
Криптоанализ показал уязвимости MD5:
- Коллизии — можно за разумное время найти два разных входа с одинаковым хешем
- Предвычисленные атаки — радужные таблицы позволяют быстро подбирать пароли по хешу
- Отсутствие криптостойкости — NIST и другие организации не рекомендуют MD5 для безопасности
Где MD5 ещё уместен
MD5 остаётся полезным для некритичных задач:
- Проверка целостности файлов при скачивании (в паре с SHA-256)
- Кэш-ключи и ETag в HTTP
- Быстрые проверки дубликатов в неконфиденциальных данных
- Идентификаторы (например, Git-коммиты) — там коллизии не дают прямого доступа
Для паролей, подписей и защиты данных MD5 использовать нельзя.
Внутреннее устройство MD5
MD5 обрабатывает вход блоками по 512 бит (64 байта). Каждый блок проходит через четыре раунда из 16 операций. Используются побитовые функции (AND, OR, XOR, NOT), сложение по модулю 2³² и циклические сдвиги. Итоговый хеш — конкатенация четырёх 32-битных регистров. Простота структуры и малая длина выхода и привели к успешным атакам.
Семейство SHA
SHA (Secure Hash Algorithm) — семейство криптографических хеш-функций, разработанных NIST.
SHA-1: устаревший стандарт
SHA-1 выдаёт 160 бит (40 символов). С 2017 года считается устаревшим: Google продемонстрировал практическую коллизию. SHA-1 не следует использовать для новых проектов. Браузеры перестают доверять SHA-1 в сертификатах.
SHA-256
SHA-256 — часть SHA-2, выдает 256 бит (64 символа). Широко используется в TLS, сертификатах, цифровых подписях и блокчейне (Bitcoin). Считается криптостойким на обозримое будущее.
SHA-512
SHA-512 — более длинная версия SHA-2, 512 бит (128 символов). На 64-битных системах часто быстрее SHA-256. Используется там, где нужна повышенная стойкость или совместимость со старыми стандартами.
Различия SHA-256 и SHA-512
| Параметр | SHA-256 | SHA-512 |
|---|---|---|
| Длина выхода | 256 бит | 512 бит |
| Размер блока | 512 бит | 1024 бит |
| Скорость на 64-бит | Медленнее | Быстрее |
| Применение | TLS, подписи, блокчейн | Длинные хеши, совместимость |
Выбор между SHA-256 и SHA-512 чаще всего определяется совместимостью. SHA-256 короче и везде поддерживается. SHA-512 даёт больший запас стойкости и на современных серверах может работать быстрее. Для большинства задач оба варианта достаточны.
Сценарии использования
Хранение паролей
Пароли никогда не хранят в открытом виде. Их хешируют с солью (уникальной случайной строкой на пользователя):
хеш = hash(соль + пароль)
Соль предотвращает использование радужных таблиц: даже при одинаковых паролях у разных пользователей будут разные хеши. Рекомендуемые алгоритмы: bcrypt, scrypt, Argon2 — они намеренно медленные и устойчивы к перебору. Обычный SHA-256 без итераций — слабый вариант для паролей: атакующий может перебирать миллионы хешей в секунду на GPU. Специализированные функции (bcrypt, Argon2) замедляют перебор в тысячи раз.
Проверка целостности файлов
При скачивании дистрибутива проверяют хеш:
sha256sum linux.iso
# Сравнить с хешем на сайте разработчика
Совпадение хешей гарантирует, что файл не изменён при передаче. Многие сайты публикуют хеши рядом со ссылкой на скачивание. Если хеш не совпадает, файл мог быть повреждён при передаче или подменён. Всегда проверяйте хеши критичных файлов: установщиков, образов ОС, криптографических ключей.
Цифровые подписи
Подпись создаётся хешированием документа и шифрованием хеша приватным ключом. Получатель проверяет подпись с помощью публичного ключа. SHA-256 и SHA-512 — стандартный выбор для подписей.
Блокчейн
В Bitcoin и многих криптовалютах хеши связывают блоки в цепочку. Каждый блок содержит хеш предыдущего блока. Изменение любого блока меняет его хеш и ломает всю последующую цепочку — это обеспечивает неизменяемость истории. Bitcoin использует двойной SHA-256 (SHA-256 от результата SHA-256) для дополнительной стойкости. Майнинг — это поиск входа, хеш которого удовлетворяет условию сложности (начинается с определённого числа нулевых бит).
Контрольные суммы
MD5 и SHA используются как контрольные суммы при резервном копировании, синхронизации и дедупликации.
Почему нельзя использовать MD5 и SHA-1 для безопасности
| Алгоритм | Проблема |
|---|---|
| MD5 | Коллизии за минуты на обычном ПК |
| SHA-1 | Практические коллизии продемонстрированы |
Для паролей, подписей, сертификатов и любых криптографических задач выбирайте SHA-256 или SHA-512. MD5 и SHA-1 допустимы только для некритичных проверок целостности.
Практические примеры
JavaScript: Web Crypto API
async function sha256(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
sha256('Hello, World!').then(console.log);
// dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
Web Crypto API поддерживает SHA-1, SHA-256, SHA-384, SHA-512. MD5 в нём нет — используйте сторонние библиотеки только для некритичных задач.
Python: hashlib
import hashlib
# SHA-256
data = b'Hello, World!'
print(hashlib.sha256(data).hexdigest())
# SHA-512
print(hashlib.sha512(data).hexdigest())
# MD5 (только для некритичных задач)
print(hashlib.md5(data).hexdigest())
Командная строка
# SHA-256 файла
sha256sum document.pdf
# SHA-256 строки
echo -n "Hello, World!" | sha256sum
# SHA-512
echo -n "Hello, World!" | sha512sum
На macOS команда sha256sum может отсутствовать — используйте shasum -a 256:
echo -n "Hello, World!" | shasum -a 256
Флаг -n у echo важен: без него добавляется перевод строки, и хеш будет другим.
Формат вывода
Хеши обычно представляют в шестнадцатеричной форме (hex): каждый байт — два символа 0–9, a–f. SHA-256 даёт 32 байта — 64 hex-символа. Base64 тоже используется (например, в некоторых API), но hex распространён для проверки целостности и отладки.
Сравнение алгоритмов
| Алгоритм | Длина выхода | Скорость | Безопасность | Рекомендация |
|---|---|---|---|---|
| MD5 | 128 бит | Очень быстро | Сломан | Только контрольные суммы |
| SHA-1 | 160 бит | Быстро | Устарел | Не использовать |
| SHA-256 | 256 бит | Средне | Надёжен | Рекомендуется |
| SHA-512 | 512 бит | Быстро на 64-бит | Надёжен | Рекомендуется |
Скорость зависит от реализации и платформы. SHA-512 на 64-битных процессорах часто обгоняет SHA-256 благодаря оптимизации под длинные слова.
Типичные ошибки
Хеширование без соли
Хеширование паролей одним SHA-256 без соли позволяет атакующему использовать радужные таблицы. Один хеш может соответствовать тысячам паролей из словарей. Всегда добавляйте уникальную соль на каждого пользователя.
Сравнение хешей за постоянное время
При проверке пароля или подписи сравнивайте хеши через функцию постоянного времени (constant-time comparison). Обычное побайтовое сравнение с ранним выходом уязвимо к атакам по времени: атакующий может подбирать символы, измеряя время ответа.
MD5 для подписей и сертификатов
Использование MD5 в цифровых подписях или сертификатах позволяет создать два документа с одинаковой подписью. Атакующий может подменить документ, сохранив валидную подпись. Всегда используйте SHA-256 или SHA-512.
Рекомендации
- Безопасность — используйте SHA-256 или SHA-512. MD5 и SHA-1 только для некритичных задач.
- Пароли — применяйте bcrypt, scrypt или Argon2 с солью, а не голый SHA.
- Файлы — проверяйте целостность через SHA-256; MD5 можно добавить для совместимости.
- Инструменты — для быстрой проверки хешей используйте генератор хешей на reChecker: MD5, SHA-1, SHA-256, SHA-512 в одном интерфейсе.
Хеширование — базовый инструмент криптографии и веб-разработки. Выбор алгоритма зависит от задачи: для безопасности — только SHA-2; для быстрых проверок и совместимости — MD5 допустим с пониманием ограничений. Используйте онлайн-генератор хешей на reChecker для проверки MD5, SHA-1, SHA-256 и SHA-512 без установки дополнительного ПО.