Представьте, что вы можете взять любые данные — одно слово, роман, видео на 4 ГБ — и свести их к короткой строке символов фиксированной длины, которая уникально идентифицирует эти данные. Измените одну запятую в исходнике — и строка станет совершенно другой. И нет никакого способа обратить процесс, чтобы восстановить исходные данные.
Именно это делает криптографическая хеш-функция. Это один из фундаментальных строительных блоков современной безопасности, который незаметно защищает почти всё, что вы делаете в интернете.
Метафора отпечатка пальца
Хеш работает как цифровой отпечаток пальца. Ваш отпечаток уникально идентифицирует вас, но по нему нельзя восстановить ваше лицо. Аналогично, криптографический хеш уникально идентифицирует фрагмент данных, не раскрывая, что это за данные.
Подайте любой вход в хеш-функцию — и вы получите дайджест (также называемый хеш-значением или контрольной суммой) — строку шестнадцатеричных символов фиксированной длины. SHA-256, один из наиболее распространённых алгоритмов, всегда выдаёт 64-символьный результат независимо от размера входных данных.
| Вход | Дайджест SHA-256 (первые 16 символов) |
|---|---|
Hello |
185f8db32271fe25... |
hello |
2cf24dba5fb0a30e... |
| Полный дамп Википедии | (по-прежнему 64 символа) |
Четыре ключевых свойства
Функция считается криптографической хеш-функцией, только если удовлетворяет следующим свойствам:
- Детерминированность. Один и тот же вход всегда даёт один и тот же результат, на любой машине, в любое время.
- Однонаправленность (устойчивость к нахождению прообраза). Имея хеш, вычислительно невозможно найти исходный вход. Данные нельзя «дехешировать».
- Устойчивость к коллизиям. Практически невозможно найти два разных входа, дающих одинаковый дайджест. Для SHA-256 вероятность случайной коллизии составляет примерно 1 к 2^128 — число, превышающее количество атомов в наблюдаемой Вселенной.
- Лавинный эффект. Изменение одного бита во входных данных переворачивает примерно половину битов выхода. Нет обнаруживаемой закономерности или связи между похожими входами.
Важное различие: хеширование — это не шифрование. Шифрование обратимо с помощью ключа; хеширование намеренно необратимо. Вы шифруете данные для защиты при передаче. Вы хешируете данные для проверки их целостности или хранения доказательства без сохранения оригинала.
Распространённые алгоритмы хеширования
MD5 (1991)
- Выход: 128 бит (32 шестнадцатеричных символа)
- Статус: криптографически скомпрометирован. Исследователи могут генерировать коллизии за секунды на ноутбуке.
- Всё ещё встречается в: контрольных суммах файлов для загрузки (не связанных с безопасностью) и устаревших системах.
SHA-1 (1995)
- Выход: 160 бит (40 шестнадцатеричных символов)
- Статус: устарел для целей безопасности. В 2017 году Google продемонстрировал практическую коллизию (атака «SHAttered»).
- Всё ещё встречается в: старых Git-репозиториях, некоторых устаревших сертификатах.
SHA-256 (2001)
- Выход: 256 бит (64 шестнадцатеричных символа)
- Статус: действующий стандарт. Практических атак не известно.
- Используется в: TLS-сертификатах, Bitcoin, хешировании паролей, цифровых подписях, проверке целостности файлов.
SHA-3 (2015)
- Выход: переменный (обычно 256 бит)
- Статус: новейший стандарт, основанный на совершенно иной внутренней архитектуре (губчатая конструкция Keccak), чем семейство SHA-2.
- Используется в: перспективных системах, Ethereum, ситуациях, требующих разнообразия алгоритмов.
| Алгоритм | Размер выхода | Безопасен? | Скорость |
|---|---|---|---|
| MD5 | 128 бит | Нет | Очень быстрый |
| SHA-1 | 160 бит | Нет | Быстрый |
| SHA-256 | 256 бит | Да | Средний |
| SHA-3-256 | 256 бит | Да | Средний |
Где используется криптографическое хеширование
Хранение паролей
Когда вы создаёте аккаунт, правильно спроектированная система никогда не хранит ваш пароль в открытом виде. Она хранит хеш. Когда вы входите, система хеширует введённые вами данные и сравнивает с сохранённым значением. Даже если база данных будет скомпрометирована, злоумышленники получат хеши, а не пароли.
Современные системы идут дальше, добавляя случайную соль (дополнительные данные, добавляемые перед хешированием) и используя намеренно медленные алгоритмы, такие как bcrypt, scrypt или Argon2, чтобы сделать перебор непрактичным.
Проверка целостности файлов
Разработчики программного обеспечения публикуют контрольные суммы SHA-256 вместе со своими загрузками. После скачивания вы вычисляете хеш файла на своей машине и сравниваете. Совпадение доказывает, что файл не был повреждён или подделан при передаче.
Цифровые подписи
Когда вы подписываете документ цифровой подписью, система сначала хеширует документ, а затем шифрует хеш вашим закрытым ключом. Получатель расшифровывает его вашим открытым ключом и сравнивает со своим собственным хешем документа. Это гораздо эффективнее, чем шифрование всего документа, и доказывает как авторство, так и целостность.
Блокчейн
Каждый блок в блокчейне содержит хеш предыдущего блока, создавая неизменяемую цепочку. Изменение любой прошлой транзакции меняет хеш её блока, что разрывает цепочку с этого момента, делая подделку немедленно заметной.
Почему MD5 и SHA-1 считаются скомпрометированными
Алгоритм хеширования считается «скомпрометированным», когда кто-то может намеренно создать два разных входа, дающих одинаковый хеш (коллизия). Это подрывает все сценарии использования, основанные на уникальности.
- MD5: коллизии могут быть сгенерированы за секунды. Исследователи создали два разных PDF-файла с идентичными хешами MD5.
- SHA-1: атака SHAttered в 2017 году создала два разных PDF с одинаковым хешем SHA-1, что потребовало около 6 500 лет вычислений на одном процессоре (осуществимо с облачными ресурсами).
Практическое правило: никогда не используйте MD5 или SHA-1 для чего-либо, связанного с безопасностью — паролей, сертификатов, цифровых подписей или проверки целостности в условиях, где может действовать злоумышленник. Используйте SHA-256 или SHA-3.
Узнать больше
Хеширование — одна из тех концепций, которая становится интуитивно понятной, стоит с ней поэкспериментировать. Попробуйте хешировать предложение, затем измените один символ и посмотрите на лавинный эффект своими глазами.
- Как генерировать и проверять хеши — пошаговое руководство
- Генератор хешей — вычисляйте SHA-256, MD5, SHA-512 и другие мгновенно в браузере
- Идентификатор хешей — вставьте неизвестный хеш и определите его алгоритм
