Хеширование данных: MD5, SHA-256 и другие алгоритмы
Что такое хеширование
Хеширование — это процесс преобразования данных произвольного размера в строку фиксированной длины с помощью математической функции. Результат называется хешем (hash), хеш-суммой или дайджестом. Ключевое свойство хеш-функции — необратимость: по хешу невозможно восстановить исходные данные. Это принципиально отличает хеширование от шифрования, где данные можно расшифровать обратно при наличии ключа.
Хорошая криптографическая хеш-функция обладает тремя свойствами:
- Детерминированность — одни и те же входные данные всегда дают одинаковый хеш.
- Лавинный эффект — малейшее изменение входных данных полностью меняет хеш.
- Устойчивость к коллизиям — практически невозможно найти два разных входа с одинаковым хешем.
Популярные алгоритмы хеширования
MD5 (Message Digest 5)
Создан в 1991 году Рональдом Ривестом. Генерирует 128-битный (32 символа в hex) хеш. MD5 работает очень быстро, но в 2004 году были обнаружены практические коллизии — возможность создать два разных файла с одинаковым хешем. Сегодня MD5 считается криптографически небезопасным и не должен использоваться для защиты данных. Однако он по-прежнему подходит для проверки целостности файлов (контрольные суммы) и других некриптографических задач.
SHA-1 (Secure Hash Algorithm 1)
Разработан NSA в 1995 году. Генерирует 160-битный (40 символов) хеш. В 2017 году команда Google продемонстрировала практическую коллизию SHA-1 (проект SHAttered). С тех пор SHA-1 считается устаревшим. Браузеры перестали принимать SSL-сертификаты с SHA-1, Git постепенно переходит на SHA-256.
SHA-256
Часть семейства SHA-2, разработанного NSA. Генерирует 256-битный (64 символа) хеш. На сегодняшний день SHA-256 считается надёжным и используется повсеместно: SSL/TLS сертификаты, блокчейн Bitcoin, цифровые подписи, хранение паролей. Это рекомендуемый алгоритм для большинства задач.
SHA-512
Генерирует 512-битный (128 символов) хеш. Более безопасен, чем SHA-256, но медленнее на 32-битных системах. На 64-битных системах SHA-512 может работать даже быстрее SHA-256 благодаря особенностям архитектуры. Используется там, где нужен максимальный уровень безопасности.
bcrypt и Argon2 (для паролей)
Обычные хеш-функции (MD5, SHA-256) слишком быстры для хеширования паролей — злоумышленник может перебирать миллиарды хешей в секунду. Специализированные алгоритмы bcrypt и Argon2 намеренно замедлены и требуют значительных ресурсов памяти, что делает перебор непрактичным. Для хеширования паролей всегда используйте bcrypt, scrypt или Argon2.
Хеширование и шифрование: в чём разница
Эти понятия часто путают, но они принципиально различны:
- Хеширование — необратимый процесс. Из хеша невозможно получить исходные данные. Используется для проверки целостности и хранения паролей.
- Шифрование — обратимый процесс. Данные можно зашифровать и расшифровать при наличии ключа. Используется для защиты конфиденциальных данных при передаче и хранении.
Простая аналогия: хеширование — это мясорубка (из фарша нельзя собрать мясо обратно), шифрование — это сейф (положили, закрыли, открыли ключом, достали).
Практическое применение хеширования
- Хранение паролей. Сервисы хранят не пароль, а его хеш. При авторизации хешируют введённый пароль и сравнивают с сохранённым хешем.
- Проверка целостности файлов. При скачивании программ вы можете сравнить хеш-сумму загруженного файла с указанной на сайте, чтобы убедиться, что файл не повреждён и не подменён.
- Цифровые подписи. Подписывается не весь документ, а его хеш — это быстрее и безопаснее.
- Дедупликация данных. Облачные хранилища вычисляют хеши файлов и не хранят дубликаты.
- Блокчейн. Bitcoin и другие криптовалюты используют SHA-256 для создания цепочки блоков и майнинга.
Сгенерировать хеш для любых данных вы можете с помощью нашего генератора хешей. Инструмент поддерживает MD5, SHA-1, SHA-256, SHA-512 и другие алгоритмы.
Соль и перец: защита хешей паролей
Даже если сервис хранит хеши вместо паролей, злоумышленник может использовать заранее вычисленные таблицы (rainbow tables) для их расшифровки. Для защиты применяются:
- Соль (salt) — случайная строка, уникальная для каждого пользователя, добавляемая к паролю перед хешированием. Делает rainbow tables бесполезными.
- Перец (pepper) — секретная строка, общая для всего приложения, хранящаяся отдельно от базы данных. Добавляет дополнительный уровень защиты.
Часто задаваемые вопросы
Какой алгоритм хеширования выбрать?
Для паролей — bcrypt или Argon2. Для проверки целостности файлов — SHA-256. Для некритичных задач (кеширование, контрольные суммы) — MD5 допустим. SHA-1 не рекомендуется нигде из-за известных уязвимостей. Подробнее о генерации паролей читайте в статье о генераторе паролей.
Можно ли расшифровать хеш?
Нет, хеш-функция необратима по определению. Однако можно перебирать варианты (brute force) или использовать словари и rainbow tables для поиска исходных данных. Именно поэтому важны длинные пароли, соль и медленные алгоритмы хеширования.
Что такое коллизия хеш-функции?
Коллизия — это ситуация, когда два разных набора входных данных дают одинаковый хеш. Для MD5 и SHA-1 найдены практические методы создания коллизий. Для SHA-256 коллизии теоретически возможны (входов больше, чем выходов), но найти их на практике вычислительно невозможно.
Чем хеширование отличается от Base64?
Base64 — это кодирование: обратимый процесс преобразования данных в текстовый формат. Хеширование — необратимый процесс получения фиксированного дайджеста. Base64 сохраняет все данные, хеш — нет.