MD5, SHA-1, SHA-256, SHA-512: в чём разница и что выбрать
Чем отличаются MD5, SHA-1, SHA-256 и SHA-512: длина хеша, стойкость, применение и как проверить контрольную сумму файла в Windows, Linux и macOS.
Коротко: MD5 и SHA-1 сломаны и годятся только для бытовых контрольных сумм. Для всего остального берите SHA-256. SHA-512 — тот же уровень надёжности с более длинным выводом, он нужен, только если этого требует внешняя система.
| Алгоритм | Длина хеша | Символов в hex | Статус в 2026 | Где встречается |
|---|---|---|---|---|
| MD5 | 128 бит | 32 | Сломан (коллизии с 2004 г.) | Контрольные суммы файлов, ETag, ключи кеша |
| SHA-1 | 160 бит | 40 | Сломан (SHAttered, 2017 г.) | Старые TLS-сертификаты, объекты Git, отпечатки SSH |
| SHA-256 | 256 бит | 64 | Надёжен, стандарт по умолчанию | HTTPS-сертификаты, JWT, Bitcoin, подписи пакетов |
| SHA-512 | 512 бит | 128 | Надёжен | Архивные подписи, /etc/shadow в Linux, 64-битные системы |
Что выбрать под конкретную задачу
- Проверить, что скачанный файл не побился — подойдёт любой, включая MD5: вы защищаетесь от помех в канале, а не от злоумышленника.
- Проверить подлинность дистрибутива с сайта — только SHA-256. Здесь противник есть, и он может подменить файл под тот же MD5.
- Хранить пароли — ни один из четырёх. Нужны bcrypt, scrypt или Argon2, см. раздел про пароли ниже.
- Подписать JWT, посчитать HMAC — SHA-256.
- Сравнить два текста на идентичность, построить ключ кеша — MD5 быстрее, и его достаточно.
- Подпись, которая должна пережить двадцать лет — SHA-512.
Генератор хешей считает все четыре сразу, прямо в браузере — можно вставить строку и посмотреть, чем отличается вывод.
Что такое хеш-функция
Хеш-функция принимает данные любого объёма — один символ, абзац или файл на гигабайт — и возвращает строку фиксированной длины, которую называют дайджестом или хеш-суммой. Полезной её делают три свойства:
- Детерминированность. Одни и те же данные всегда дают один и тот же хеш, на любой машине и в любом языке программирования.
- Лавинный эффект. Изменение одного бита полностью меняет результат — «похожих» хешей у похожих данных не бывает.
- Необратимость. По хешу нельзя восстановить исходные данные иначе как перебором.
Лавинный эффект проще один раз увидеть. Вот hello и hellp — разница в одну букву:
| Вход | SHA-256 |
|---|---|
hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
hellp | fdd7585e08c4e2afd71dcabdb4636c89d557a3f42db9e2040c8bbd1708aa4ce7 |
Ни одного общего символа в начале. Именно поэтому хеш работает как индикатор изменений: нельзя «немного» изменить файл так, чтобы хеш изменился «немного».
Полезно запомнить и опорные значения — хеш пустой строки. Если инструмент выдаёт их, значит на вход ничего не пришло:
| Алгоритм | Хеш пустой строки |
|---|---|
| MD5 | d41d8cd98f00b204e9800998ecf8427e |
| SHA-1 | da39a3ee5e6b4b0d3255bfef95601890afd80709 |
| SHA-256 | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
Хеширование — это не шифрование
Самая частая путаница. Шифрование обратимо: есть ключ — есть исходный текст. Хеширование необратимо в принципе, ключа нет, и «расшифровать» хеш нельзя.
Сайты, которые обещают «расшифровать MD5», на самом деле ищут значение в базе заранее посчитанных хешей популярных строк — это называется радужной таблицей. password там найдётся мгновенно, случайная строка на двадцать символов — никогда. Если вам нужна именно обратимость, нужен шифр, а не хеш: для этого есть шифрование текста.
Отдельно про кириллицу: она хешируется как байты UTF-8, а не как буквы. Поэтому Привет даёт MD5 8a669e9418750c81ab90ae159a8ec410, и любой корректный инструмент выдаст ровно это значение. Если ваш результат отличается, скорее всего строка была в другой кодировке — например в Windows-1251 — или в конце затесался перевод строки.
MD5 — быстрый, но сломанный
MD5 выдаёт 128 бит, то есть 32 шестнадцатеричных символа. В 1990-х это был стандарт де-факто, сегодня он криптографически сломан.
Коллизия — это два разных входа с одинаковым хешем. Для MD5 их научились строить целенаправленно ещё в 2004 году, а сейчас это делается на ноутбуке за секунды; известны пары PDF-файлов с разным содержимым и одинаковым MD5. Отсюда прямой вывод: MD5 нельзя использовать там, где хеш подтверждает подлинность — цифровые подписи, отпечатки сертификатов, хранение паролей.
Где MD5 остаётся уместным: обнаружить случайное повреждение при копировании, построить ключ кеша, быстро сравнить большие файлы на идентичность. Во всех этих задачах противника нет, а MD5 заметно быстрее SHA-2.
SHA-1 — устарел, но всё ещё повсюду
SHA-1 выдаёт 160 бит, 40 символов. В феврале 2017 года Google и CWI опубликовали проект SHAttered — первую практическую коллизию SHA-1: два PDF с разным изображением и одинаковым хешем. В 2020 году появилась атака с выбранным префиксом, которая стоит уже несколько десятков тысяч долларов машинного времени, то есть доступна не только государствам.
Браузеры отвергают TLS-сертификаты на SHA-1 с 2017 года. Но алгоритм никуда не делся: на нём построены идентификаторы объектов Git (переход на SHA-256 идёт медленно и в большинстве репозиториев не завершён), отпечатки хостов в старых конфигурациях SSH, множество внутренних систем. Читать такие хеши приходится, создавать новые — не стоит.
SHA-256 — то, что нужно по умолчанию
SHA-256 входит в семейство SHA-2, опубликованное NIST в 2001 году. Выдаёт 256 бит, 64 символа.
Устроен он так: сообщение дополняется до длины, кратной 512 битам — добавляется бит 1, затем нули, а в последние 64 бита записывается исходная длина, — после чего блоки по 512 бит последовательно прогоняются через функцию сжатия: 64 раунда над восемью 32-битными регистрами. Это конструкция Меркла — Дамгора: каждый блок смешивается с результатом предыдущего, поэтому изменение в начале файла влияет на весь хеш.
Где он применяется:
- TLS и HTTPS — SHA-256 обязателен для всех действующих сертификатов.
- JWT — самый распространённый алгоритм подписи, HS256, это HMAC поверх SHA-256; посмотреть содержимое токена можно в декодере JWT.
- Bitcoin — доказательство работы и связывание блоков.
- Пакетные менеджеры — apt, npm и pip проверяют целостность пакетов по SHA-256.
- PBKDF2 — внутри использует HMAC-SHA256.
Практических атак на SHA-256 не существует и в обозримом будущем не предвидится. Если сомневаетесь — берите его.
SHA-512 — длиннее вывод, иногда быстрее
SHA-512 выдаёт 512 бит, 128 символов. Устроен так же, но оперирует 64-битными словами вместо 32-битных и делает 80 раундов вместо 64. Отсюда неочевидное следствие: на 64-битном процессоре SHA-512 обычно быстрее SHA-256 в пересчёте на байт, хотя выдаёт вдвое более длинный хеш.
Запас прочности у него выше, но это разница между «невозможно» и «невозможно»: перебор SHA-256 уже недостижим для любого мыслимого оборудования. Поэтому SHA-512 выбирают по другим причинам — так требует спецификация внешней системы, нужен более длинный вывод для последующего разбиения на ключи, или это хеширование паролей в /etc/shadow Linux (префикс $6$).
Таблица выбора
| Задача | Алгоритм |
|---|---|
| Проверка файла, бытовая | MD5 или SHA-256 |
| Проверка файла, критичная | SHA-256 |
| Хранение паролей | bcrypt / scrypt / Argon2 |
| HMAC, подпись JWT | SHA-256 |
| TLS, сертификаты | SHA-256 |
| Долгосрочные архивные подписи | SHA-512 |
| Ключ кеша, дедупликация | MD5 |
Почему пароли нельзя хешировать через SHA
Голый SHA — даже SHA-512 — для паролей не подходит, и причина не в слабости алгоритма, а ровно в обратном: он слишком быстрый. Видеокарта перебирает миллиарды SHA-256 в секунду, поэтому весь словарь популярных паролей проверяется за минуты.
Нужны две вещи, которых у голого SHA нет:
- Соль — случайная строка, своя для каждого пользователя, которая добавляется к паролю перед хешированием. Она обесценивает радужные таблицы: одинаковые пароли двух пользователей дают разные хеши.
- Замедление. bcrypt, scrypt и Argon2 намеренно требуют тысяч итераций, а scrypt и Argon2 — ещё и заметного объёма памяти, что бьёт по перебору на видеокартах. Стоимость проверки одного пароля настраивается и повышается по мере роста мощности железа.
Если библиотеки с Argon2 под рукой нет, минимально допустимый вариант — PBKDF2-HMAC-SHA256 с большим числом итераций. Оценить, что вообще стоит защищать, помогает проверка надёжности пароля, а сгенерировать нормальный — генератор паролей.
Как проверить контрольную сумму файла
Дистрибутивы обычно публикуют SHA-256 рядом со ссылкой на скачивание. Посчитать хеш локально можно без сторонних утилит, средствами системы.
Windows, PowerShell:
Get-FileHash .\ubuntu.iso -Algorithm SHA256
Windows, командная строка:
certutil -hashfile ubuntu.iso SHA256
Linux:
sha256sum ubuntu.iso
macOS:
shasum -a 256 ubuntu.iso
Осталось сравнить вывод с опубликованным значением. Регистр букв не важен: A3F и a3f — одно и то же. Сравнивать глазами весь хеш не нужно, достаточно первых и последних шести символов: подделать их одновременно ничуть не проще, чем весь хеш.
Важная оговорка: контрольная сумма подтверждает целостность, но не подлинность. Если и файл, и хеш взяты с одного взломанного зеркала, злоумышленник подменил оба. Настоящую подлинность даёт только GPG-подпись, а хеш защищает от обрыва загрузки и битого диска.
Частые вопросы
Можно ли расшифровать MD5? Нет. MD5 необратим: 128 бит вывода просто не содержат достаточно информации, чтобы восстановить произвольный вход. Сервисы «расшифровки» ищут совпадение в базе заранее посчитанных хешей, и работает это только для коротких и популярных строк.
Чем MD5 отличается от SHA-256? Длиной вывода — 128 бит против 256 — и стойкостью. Для MD5 умеют строить коллизии за секунды, для SHA-256 не умеют. MD5 при этом заметно быстрее.
Какой длины хеш SHA-256? 256 бит, то есть 32 байта, то есть 64 символа в шестнадцатеричной записи. Длина не зависит от размера входных данных: и один символ, и файл на 10 ГБ дают ровно 64 символа.
Что такое коллизия хеша? Два разных входа с одинаковым хешем. Математически коллизии существуют всегда — входов бесконечно много, а выходов конечное число. Вопрос в том, можно ли построить их целенаправленно: для MD5 и SHA-1 можно, для SHA-256 нет.
Почему один и тот же текст даёт разные хеши в разных инструментах? Почти всегда дело в самих данных, а не в алгоритме. Типичные причины: незамеченный перевод строки или пробел в конце, разная кодировка (UTF-8 против Windows-1251), BOM в начале файла. Хеширование детерминировано — при одинаковых байтах результат совпадёт всегда.
Что безопаснее, SHA-256 или SHA-512? Обе безопасны, и на практике разницы нет. У SHA-512 больший теоретический запас, у SHA-256 более широкая поддержка. Если внешняя система не требует конкретного варианта, берите SHA-256.
Подходит ли SHA-256 для паролей? Сам по себе нет: он слишком быстрый и потому уязвим к перебору. Для паролей нужны bcrypt, scrypt или Argon2 либо, как минимум, PBKDF2-HMAC-SHA256 с большим числом итераций и солью.
Генератор хешей считает MD5, SHA-1, SHA-256 и SHA-512 из любого текста в реальном времени, прямо в браузере — данные никуда не отправляются. Рядом могут пригодиться Base64-кодировщик, генератор UUID и конвертер систем счисления.