Хеширование объяснено: MD5, SHA и когда использовать каждый
Хеш-функции превращают данные в отпечатки пальцев. Вот как они работают и почему MD5 ещё не умер.
Ты скачиваешь файл. Сайт показывает контрольную сумму MD5. Ты должен как-то проверить её. Но зачем? И в чём разница между MD5 и SHA-256?
Хеш-функции везде в программном обеспечении. Понимание их помогает использовать их правильно.
Что делает хеширование
Хеш-функция берёт любой вход и производит выход фиксированного размера. Всегда один и тот же выход для одного и того же входа. Измени один бит входа, и выход полностью изменится.
"hello" → 5d41402abc4b2a76b9719d911017c592 (MD5)
"Hello" → 8b1a9953c4611296a827abf8c47804d7 (MD5)
Одна заглавная буква меняет весь хеш. В этом суть.
Хеш vs шифрование
Хеширование — односторонний процесс. Ты не можешь развернуть хеш, чтобы получить исходные данные.
Шифрование — двусторонний процесс. С правильным ключом ты можешь расшифровать и восстановить оригинал.
Если кто-то говорит, что может "расшифровать" хеш MD5, они либо взламывают его (пробуя входы, пока один не совпадёт), либо они запутались в том, как работает хеширование.
Распространённые алгоритмы
MD5 - 128-битный вывод. Быстрый, но криптографически сломан. Подходит для контрольных сумм, не для безопасности.
SHA-1 - 160-битный. Тоже сломан для криптографического использования. Унаследованные системы всё ещё используют его.
SHA-256 - 256-битный. Текущий стандарт. Используй это, когда безопасность важна.
SHA-512 - 512-битный. Немного более безопасный, иногда быстрее на 64-битных системах.
BLAKE2/BLAKE3 - Современные альтернативы. Быстрее, чем SHA-256, с аналогичной безопасностью.
Когда MD5 в порядке
MD5 получает плохую репутацию, потому что он "сломан". Но сломан для криптографии не означает бесполезен.
Проверка целостности файлов. Проверка, что загрузка не повреждена. Атакующему потребуется создать вредоносный файл с тем же хешем, что требует больше усилий, чем стоит большинство атак для неконтекстов безопасности.
Ключи кэша. Хеширование контента для генерации уникальных идентификаторов. Никаких последствий для безопасности.
Дедупликация. Поиск дублирующихся файлов путём сравнения хешей.
Когда использовать SHA-256 или лучше
Хранение паролей. На самом деле используй bcrypt или Argon2 вместо этого. Они разработаны для паролей.
Цифровые подписи. Целостность документов, где противники могут пытаться подделать.
Всё критичное для безопасности. Когда у атакующего есть стимул найти коллизии.
Проблема коллизий
Коллизия — это когда два разных входа производят один и тот же хеш. Математика дня рождения говорит, что коллизии становятся вероятными раньше, чем ты ожидаешь.
Для MD5 исследователи нашли способы создавать преднамеренные коллизии. Два разных файла, один хеш. Вот почему он "сломан".
Для SHA-256 практических атак коллизий не существует. Пока.
Практические примеры
Проверка загрузок:
sha256sum ubuntu.iso
# Сравни вывод с хешем на странице загрузки
Хранение API-ключей: Храни хеш, а не сам ключ. Когда пользователи отправляют ключ, хешируй его и сравнивай.
Git-коммиты:
Git использует SHA-1 для идентификации коммитов. Вот почему хеши коммитов выглядят как a1b2c3d4e5f6...
Не изобретай собственное
Никогда не изобретай собственную схему хеширования. "MD5 дважды" или "SHA-256 с добавленной солью" хуже, чем использование установленных паттернов.
Для паролей: bcrypt, scrypt или Argon2. Для целостности: SHA-256. Для скорости: BLAKE3.
Эксперты уже выяснили это.
Хеш-функции просты в концепции, но нюансированы в применении. Выбирай правильный алгоритм для задачи и не используй криптографическое хеширование там, где подойдёт простая контрольная сумма.