Криптографическая хэш-функция
Криптографическая хэш-функция — это детерминированная математическая функция, которая преобразует входные данные произвольной длины (сообщение) в выходную строку фиксированной длины (хэш-значение, или дайджест), обладающую рядом специфических свойств, делающих её пригодной для использования в криптографии. В отличие от обычных хэш-функций, применяемых, например, для построения хэш-таблиц, криптографические версии должны быть устойчивы к целенаправленным атакам злоумышленника.
Основные свойства
Криптографическая хэш-функция должна удовлетворять трём фундаментальным требованиям безопасности:
- Стойкость к коллизиям (Collision Resistance): Вычислительно невозможно найти два различных входных сообщения \( x \) и \( y \), для которых \( H(x) = H(y) \). Это свойство гарантирует, что хэш-значение однозначно идентифицирует сообщение.
- Необратимость (Preimage Resistance, или свойство «односторонности»): По заданному хэш-значению \( h \) вычислительно невозможно найти какое-либо сообщение \( x \), такое что \( H(x) = h \). Это означает, что восстановить исходные данные по их дайджесту практически невозможно.
- Стойкость к поиску второго прообраза (Second Preimage Resistance): При заданном сообщении \( x \) вычислительно невозможно найти другое сообщение \( y \neq x \), такое что \( H(y) = H(x) \). Это свойство защищает от подмены одного сообщения другим с тем же хэшем.
Дополнительными важными характеристиками являются:
- Лавинный эффект (Avalanche Effect): Незначительное изменение входных данных (например, изменение одного бита) должно приводить к кардинальному и непредсказуемому изменению выходного хэш-значения (в среднем меняется около половины битов).
- Детерминированность: Одно и то же входное сообщение всегда даёт один и тот же хэш-код.
- Высокая скорость вычислений: Для практического применения функция должна вычисляться достаточно быстро на современных процессорах.
История развития
Первые криптографические хэш-функции появились в 1970-х годах. Одной из ранних разработок стала функция MD2, созданная Рональдом Ривестом в 1989 году. В 1992 году была опубликована функция MD5, которая на протяжении многих лет была стандартом де-факто, однако к 2004 году в ней были найдены серьёзные уязвимости, связанные с коллизиями.
В 1993 году Национальный институт стандартов и технологий США (NIST) опубликовал стандарт SHA-0, который вскоре был заменён на SHA-1 из-за обнаруженной уязвимости. SHA-1 использовался до 2010-х годов, пока не были продемонстрированы практические атаки на его коллизионную стойкость.
В ответ на уязвимости SHA-1 NIST провёл конкурс, результатом которого стало семейство SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512), опубликованное в 2001 году. Эти функции на сегодняшний день считаются безопасными и широко применяются.
В 2007 году NIST объявил новый конкурс на разработку стандарта SHA-3. Победителем в 2012 году стала функция Keccak, основанная на принципиально иной конструкции — губчатой функции (sponge function). SHA-3 был стандартизирован в 2015 году и обеспечивает запас прочности на случай уязвимостей в SHA-2.
Классификация и типы
Криптографические хэш-функции можно классифицировать по нескольким признакам:
По длине выходного значения
- Короткие: 128 бит (MD5 — устарел), 160 бит (SHA-1 — устарел).
- Средние: 224, 256 бит (SHA-224, SHA-256).
- Длинные: 384, 512 бит (SHA-384, SHA-512).
По конструкции
- На основе конструкции Меркла — Дамгора (Merkle–Damgård): Сообщение разбивается на блоки фиксированной длины, которые последовательно обрабатываются через сжимающую функцию. К этому типу относятся MD5, SHA-1, SHA-2.
- Губчатая функция (Sponge Construction): Использует чередование фаз «впитывания» (absorbing) и «выжимания» (squeezing). Keccak (SHA-3) является представителем этого типа.
По назначению
- Универсальные (стандартные): SHA-256, SHA-3.
- Специализированные: для хэширования паролей (bcrypt, scrypt, Argon2), которые намеренно замедлены для защиты от атак перебором.
Применение
Криптографические хэш-функции являются фундаментальным строительным блоком для множества систем информационной безопасности:
- Проверка целостности данных: При скачивании файлов из интернета часто публикуется их хэш-сумма (например, SHA-256). Пользователь может вычислить хэш скачанного файла и сравнить его с эталонным, чтобы убедиться, что файл не был повреждён или модифицирован.
- Хранение паролей: Вместо хранения паролей в открытом виде системы хранят их хэши. При аутентификации хэш введённого пароля сравнивается с хранящимся. Для защиты от атак по словарю применяется «соль» (salt) — случайная строка, добавляемая к паролю перед хэшированием.
- Цифровые подписи: Хэш-функция используется для создания «дайджеста» сообщения, который затем подписывается асимметричным алгоритмом (например, RSA или ECDSA). Это значительно эффективнее, чем подписывать всё сообщение целиком.
- Блокчейн и криптовалюты: В технологии блокчейн (например, в сети Биткойн) хэш-функция SHA-256 используется для связывания блоков в цепочку и для майнинга (Proof-of-Work).
- Контроль версий (Git): Система Git использует хэш-функцию SHA-1 для идентификации каждого коммита, файла и дерева.
- Генерация псевдослучайных чисел: Хэш-функции могут быть использованы как компонент генераторов псевдослучайных чисел.
Атаки и уязвимости
Основные типы атак на криптографические хэш-функции направлены на нарушение их свойств:
- Атака на коллизии: Нахождение двух разных сообщений с одинаковым хэшем. Для MD5 и SHA-1 такие атаки реализованы на практике. В 2017 году Google продемонстрировал коллизию для SHA-1 (атака SHAttered).
- Атака на прообраз: Восстановление исходного сообщения по хэшу. Для современных функций (SHA-2, SHA-3) считается вычислительно невозможной при правильном использовании.
- Атака удлинения сообщения (Length Extension Attack): Уязвимость, характерная для функций на основе конструкции Меркла — Дамгора (MD5, SHA-1, SHA-2). Злоумышленник, зная \( H(M) \) и длину \( M \), может вычислить \( H(M \parallel X) \) для некоторого \( X \), не зная \( M \). SHA-3 и BLAKE2 не подвержены этой атаке.
Стандартизация в России
В Российской Федерации действует национальный стандарт на криптографические хэш-функции — ГОСТ Р 34.11-2012 (также известный как Стрибог). Он был введён в действие в 2013 году и заменил устаревший ГОСТ Р 34.11-94. Функция Стрибог может выдавать хэш-код длиной 256 или 512 бит. Она основана на итеративной конструкции, отличной от Меркла — Дамгора, и является обязательной для использования в государственных информационных системах и при создании электронной подписи по ГОСТ.
Источники
- Шнайер Б. «Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си». — М.: Триумф, 2002.
- Фергюсон Н., Шнайер Б., Кохун Т. «Практическая криптография». — М.: Вильямс, 2005.
- Menezes A., van Oorschot P., Vanstone S. «Handbook of Applied Cryptography». — CRC Press, 1996.
- Национальный институт стандартов и технологий США (NIST). FIPS PUB 180-4: Secure Hash Standard (SHS). — 2015.
- Национальный институт стандартов и технологий США (NIST). FIPS PUB 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions. — 2015.
- Федеральное агентство по техническому регулированию и метрологии. ГОСТ Р 34.11-2012 «Информационная технология. Криптографическая защита информации. Функция хэширования». — 2012.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →