Хеш-функции: MD5, SHA-1, SHA-256 и SHA-512 — в чём разница
Практическое руководство по криптографическим хеш-функциям: что это, когда применять каждую и почему MD5 и SHA-1 уже небезопасны для критичных задач.
Если вы проверяли скачанный файл по SHA-256-контрольной сумме, хранили пароли в базе данных или задавались вопросом, что такое идентификатор коммита Git — вы уже работали с хеш-функциями. Вот как они устроены и какую выбрать.
Что такое хеш-функция?
Криптографическая хеш-функция принимает любые входные данные — один символ, абзац текста или гигабайтный файл — и возвращает строку фиксированной длины, называемую дайджестом. Два свойства делают хеши полезными:
- Детерминированность: одни и те же данные всегда дают одинаковый хеш.
- Лавинный эффект: изменение даже одного символа полностью меняет результат. Хеш «hello» совсем не похож на хеш «hellp».
Хеши необратимы: по хешу нельзя восстановить исходные данные без перебора. Именно это делает их безопасными для хранения паролей — база хранит хеш, а не открытый текст.
MD5 — быстрый, но ненадёжный
MD5 производит 128-битный (32 шестнадцатеричных символа) хеш. В 1990-х он был стандартом, но сегодня считается криптографически сломанным.
Исследователи продемонстрировали атаки на коллизии — создание двух разных входных данных с одинаковым MD5-хешем. Это делает MD5 непригодным для хранения паролей, цифровых подписей и отпечатков сертификатов.
Для некритических контрольных сумм MD5 по-прежнему подходит. Если нужно просто убедиться, что файл не испортился при скачивании и злоумышленника в цепочке нет — MD5 вполне работоспособен и быстр.
SHA-1 — устарел, но встречается
SHA-1 производит 160-битный (40 символов) хеш. В 2017 году проект Google SHAttered продемонстрировал практические коллизионные атаки на него.
SHA-1 устарел для новых систем. Он всё ещё встречается в устаревших TLS-сертификатах (современные браузеры их отклоняют), в исходном формате объектов Git (Git перешёл на SHA-256 в новых форматах репозиториев) и в старых SSH-отпечатках хостов. В новом коде для задач безопасности его лучше не использовать.
SHA-256 — современный стандарт
SHA-256 входит в семейство SHA-2 и производит 256-битный (64 символа) хеш. Это основа современной криптографии:
- HTTPS-сертификаты: SHA-256 обязателен для всех действующих TLS-сертификатов.
- JWT-подписи: наиболее распространённый алгоритм — HMAC-SHA256.
- Хранение паролей: PBKDF2 внутри использует HMAC-SHA256.
- Блокчейн: Bitcoin применяет SHA-256 для доказательства работы и связи блоков.
- Git: новые репозитории используют SHA-256 для идентификаторов объектов.
Практических атак на SHA-256 не существует. Используйте его по умолчанию.
SHA-512 — больший вывод, чуть быстрее на 64-битных системах
SHA-512 производит 512-битный (128 символов) хеш. Теоретический запас безопасности у него выше, чем у SHA-256, — хотя SHA-256 и так недосягаем для любого перебора. Интереснее другое: SHA-512 работает с 64-битными словами, тогда как SHA-256 — с 32-битными, поэтому на современных 64-битных процессорах SHA-512 может быть быстрее в пересчёте на байт.
Используйте SHA-512, если этого требует интегрируемая система или нужен дополнительный запас надёжности на перспективу. Для большинства задач SHA-256 — более широко поддерживаемый выбор.
Как выбрать алгоритм
| Задача | Рекомендуемый алгоритм |
|---|---|
| Проверка файла (бытовая) | MD5 или SHA-256 |
| Проверка файла (критичная) | SHA-256 |
| Хранение паролей | bcrypt / Argon2 (не голый SHA) |
| HMAC / JWT | SHA-256 |
| TLS / сертификаты | SHA-256 |
| Долгосрочные архивные подписи | SHA-512 |
Про пароли отдельно: голый SHA — даже SHA-512 — для паролей не подходит, потому что хеш вычисляется слишком быстро и перебор становится реальным. Используйте bcrypt, scrypt или Argon2.
Генератор хешей вычисляет все четыре хеша из любого текста в реальном времени прямо в браузере. Вставьте строку, сравните с известным значением или просто посмотрите, что получается с разными входными данными — без регистрации.