Загрузка...
Загрузка...
Что такое хеш-функции, как работают MD5, SHA-1, SHA-256, SHA-512. Примеры использования, сравнение алгоритмов и онлайн-генератор хешей.
Проверка надёжности пароля онлайн. Критерии сложности, время взлома, брутфорс. Как создать надёжный пароль. Бесплатный инструмент проверки.
БезопасностьПолное руководство по настройке Brotli сжатия на веб-серверах: Nginx, Apache, сравнение с Gzip, уровни сжатия и проверка работы.
БезопасностьНастройка безопасных cookies: Secure, HttpOnly, SameSite. Защита от XSS, CSRF, перехвата. Примеры для разных языков и фреймворков.
БезопасностьПолное руководство по CSP: все директивы, nonce, hash, report-uri, strict-dynamic. Пошаговое внедрение, отладка, примеры для популярных фреймворков.
Поделитесь с коллегами или изучите другие материалы блога
Хеширование — преобразование данных произвольной длины в строку фиксированного размера (хеш). Хеш-функции применяются для проверки целостности файлов, хранения паролей, цифровых подписей и блокчейна. В этой статье разберём, как работают MD5, SHA-256 и SHA-512, когда их использовать и почему некоторые алгоритмы больше не подходят для защиты данных.
Для быстрого вычисления хеша используйте онлайн-генератор хешей на reChecker.
Хеш-функция принимает входные данные любой длины и возвращает выход фиксированной длины. Один и тот же вход всегда даёт один и тот же хеш. Изменение хотя бы одного бита во входе приводит к совершенно другому результату — это свойство называют лавинным эффектом.
Хеш необратим: по хешу нельзя восстановить исходные данные. Это отличает хеширование от шифрования, где данные можно расшифровать ключом.
Лавинный эффект — ключевое свойство криптографических хеш-функций. Изменение одного бита во входных данных должно менять примерно половину битов в выходе. Например, хеш строки Hello, World! и Hello, World? (разница в последнем символе) полностью различается. Это затрудняет поиск коллизий и предсказание хеша по похожему входу.
| Свойство | Описание |
|---|---|
| Детерминированность | Одинаковый вход всегда даёт одинаковый хеш |
| Фиксированная длина | Размер выхода не зависит от размера входа |
| Лавинный эффект | Малое изменение входа сильно меняет хеш |
| Устойчивость к коллизиям | Сложно найти два разных входа с одинаковым хешем |
| Односторонность | Невозможно вычислить вход по хешу за разумное время |
MD5 (Message-Digest Algorithm 5) разработан Рональдом Ривестом в 1991 году. Выдаёт хеш длиной 128 бит (32 шестнадцатеричных символа). Алгоритм обрабатывает данные блоками по 512 бит и использует побитовые операции, сложение по модулю и сдвиги.
Криптоанализ показал уязвимости MD5:
MD5 остаётся полезным для некритичных задач:
Для паролей, подписей и защиты данных MD5 использовать нельзя.
MD5 обрабатывает вход блоками по 512 бит (64 байта). Каждый блок проходит через четыре раунда из 16 операций. Используются побитовые функции (AND, OR, XOR, NOT), сложение по модулю 2³² и циклические сдвиги. Итоговый хеш — конкатенация четырёх 32-битных регистров. Простота структуры и малая длина выхода и привели к успешным атакам.
SHA (Secure Hash Algorithm) — семейство криптографических хеш-функций, разработанных NIST.
SHA-1 выдаёт 160 бит (40 символов). С 2017 года считается устаревшим: Google продемонстрировал практическую коллизию. SHA-1 не следует использовать для новых проектов. Браузеры перестают доверять SHA-1 в сертификатах.
SHA-256 — часть SHA-2, выдает 256 бит (64 символа). Широко используется в TLS, сертификатах, цифровых подписях и блокчейне (Bitcoin). Считается криптостойким на обозримое будущее.
SHA-512 — более длинная версия SHA-2, 512 бит (128 символов). На 64-битных системах часто быстрее SHA-256. Используется там, где нужна повышенная стойкость или совместимость со старыми стандартами.
| Параметр | 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 | Практические коллизии продемонстрированы |
Для паролей, подписей, сертификатов и любых криптографических задач выбирайте SHA-256 или SHA-512. MD5 и SHA-1 допустимы только для некритичных проверок целостности.
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 в нём нет — используйте сторонние библиотеки только для некритичных задач.
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 в цифровых подписях или сертификатах позволяет создать два документа с одинаковой подписью. Атакующий может подменить документ, сохранив валидную подпись. Всегда используйте SHA-256 или SHA-512.
Хеширование — базовый инструмент криптографии и веб-разработки. Выбор алгоритма зависит от задачи: для безопасности — только SHA-2; для быстрых проверок и совместимости — MD5 допустим с пониманием ограничений. Используйте онлайн-генератор хешей на reChecker для проверки MD5, SHA-1, SHA-256 и SHA-512 без установки дополнительного ПО.