Передача хеша¶
Передача хеша — это процесс вычисления и отправки криптографического хеша (дайджеста) от одного участника информационного обмена другому для обеспечения целостности данных, аутентификации источника или подтверждения знания секрета без его раскрытия. Хеш представляет собой строку фиксированной длины, полученную в результате применения хеш-функции к исходным данным; любое изменение данных приводит к изменению хеша. Передача хеша широко используется в криптографии, протоколах аутентификации, системах контроля версий, блокчейне и защите паролей.
¶История
Концепция хеширования восходит к 1950-м годам, когда появились первые алгоритмы для организации данных (например, хеш-таблицы). Однако криптографические хеш-функции начали активно развиваться в 1970–1980-х годах с появлением алгоритмов MD2, MD4, MD5 (Ronald Rivest, 1989–1991). Передача хеша как самостоятельный протокольный шаг стала актуальной с развитием сетевых технологий: в 1990-х годах в протоколах аутентификации (например, CHAP — Challenge-Handshake Authentication Protocol) начали использовать передачу хеша пароля вместо самого пароля. В 2000-х годах с распространением блокчейна (биткойн, 2009) передача хеша стала ключевым элементом для подтверждения целостности блоков и работы proof-of-work.
¶Принцип работы
Передача хеша включает два этапа: вычисление хеша на стороне отправителя и его верификацию на стороне получателя. Отправитель применяет хеш-функцию (например, SHA-256) к исходным данным, получает дайджест фиксированной длины (например, 256 бит) и отправляет его получателю. Получатель, имея доступ к исходным данным (или их версии), вычисляет хеш самостоятельно и сравнивает с полученным. Если хеши совпадают — данные не были изменены. Если данные не передаются одновременно, получатель может хранить эталонный хеш для последующей проверки.
¶Ключевые свойства хеш-функций
- Однонаправленность: по хешу невозможно (вычислительно неэффективно) восстановить исходные данные.
- Коллизионная стойкость: практически невозможно найти два разных набора данных с одинаковым хешем.
- Лавинный эффект: изменение одного бита входных данных приводит к кардинальному изменению хеша (в среднем 50% битов).
¶Виды передачи хеша
¶1. Передача хеша для проверки целостности
Наиболее распространённый случай. Хеш вычисляется для файла, сообщения или набора данных и передаётся отдельно. Получатель загружает данные, вычисляет хеш и сравнивает. Примеры: контрольные суммы (MD5, SHA-1, SHA-256) при скачивании файлов из интернета; хеши в протоколах BitTorrent (инфо-хеш торрент-файла); хеши в системах контроля версий (Git — коммиты идентифицируются хешем SHA-1).
¶2. Передача хеша для аутентификации
Используется для подтверждения знания пароля или секретного ключа без его раскрытия. Например, в протоколе HTTP Digest Access Authentication (RFC 7616) клиент вычисляет хеш от пароля и случайного числа (nonce) и отправляет серверу. Сервер, зная пароль и nonce, вычисляет хеш и сравнивает. Аналогично работает аутентификация в CHAP (PPP) и в некоторых реализациях протокола RADIUS.
¶3. Передача хеша в блокчейне
В блокчейне каждый блок содержит хеш предыдущего блока, что создаёт цепочку. Передача хеша между узлами сети позволяет проверять целостность всей цепочки без передачи всех данных. В криптовалютах (биткойн, эфириум) хеш блока является результатом майнинга (proof-of-work) и служит идентификатором блока.
¶4. Передача хеша в цифровых подписях
В схемах цифровой подписи (RSA, DSA, ECDSA) сначала вычисляется хеш сообщения, а затем подписывается именно хеш, а не само сообщение. Это уменьшает размер подписи и повышает эффективность. Передача хеша (в составе подписи) позволяет верифицировать подлинность и целостность.
¶5. Передача хеша в протоколах доказательства с нулевым разглашением
В некоторых протоколах (например, zk-SNARKs) хеш используется для фиксации секрета без его раскрытия. Участник передаёт хеш секрета, а затем доказывает знание секрета, не раскрывая его.
¶Применение
¶Информационная безопасность
- Защита паролей: серверы хранят не пароли, а их хеши (с солью). При аутентификации клиент передаёт хеш пароля (или хеш от пароля с nonce). Это предотвращает компрометацию паролей при утечке базы данных.
- Целостность программного обеспечения: дистрибутивы операционных систем (Linux, FreeBSD) публикуют хеши (SHA-256) для проверки скачанных образов. Пользователь может сверить хеш локально.
- Антивирусные базы: хеши вредоносных файлов передаются для быстрого обнаружения без сканирования содержимого.
¶Сетевые протоколы
- HTTP Digest Authentication: передача хеша пароля и nonce для защиты от перехвата.
- IPsec (IKE): хеши используются для аутентификации ключей и целостности пакетов.
- SSH (Secure Shell): при первом подключении сервер передаёт хеш своего открытого ключа (fingerprint), который пользователь проверяет вручную.
¶Системы контроля версий
- Git: каждый коммит идентифицируется хешем SHA-1 от содержимого дерева, родительского коммита и метаданных. Передача хеша между репозиториями позволяет синхронизировать историю изменений.
¶Блокчейн и криптовалюты
- Биткойн: хеш блока (SHA-256) является результатом майнинга. Передача хеша между узлами сети подтверждает включение блока в цепочку.
- Смарт-контракты: хеши данных (например, IPFS) используются для хранения больших объёмов информации вне блокчейна.
¶Электронная почта
- DKIM (DomainKeys Identified Mail): отправитель вычисляет хеш письма и подписывает его закрытым ключом. Получатель проверяет подпись, сравнивая хеш с вычисленным.
¶Уязвимости и ограничения
¶Коллизии
Если хеш-функция не является коллизионно-стойкой, злоумышленник может подобрать два разных набора данных с одинаковым хешем. Это позволяет подменить данные без изменения хеша. Примеры: коллизии в MD5 (2004, Wang et al.) и SHA-1 (2017, Google). В результате эти алгоритмы считаются небезопасными для криптографических приложений. Рекомендуется использовать SHA-256 или SHA-3.
¶Атаки «человек посередине»
При передаче хеша без шифрования злоумышленник может перехватить хеш и подменить его. Для защиты необходимо шифрование канала (TLS/SSL) или использование цифровых подписей.
¶Атаки на парольные хеши
Если хеш пароля перехвачен, злоумышленник может попытаться восстановить пароль методом перебора (brute-force) или с помощью радужных таблиц. Для защиты применяются соль (случайная строка, добавляемая к паролю перед хешированием) и медленные хеш-функции (bcrypt, scrypt, Argon2).
¶Проблемы с длиной хеша
Короткие хеши (например, MD5 — 128 бит) более подвержены коллизиям и атакам дня рождения. Рекомендуемая длина — не менее 256 бит.
¶Примеры
¶Пример 1: Проверка целостности файла
Пользователь скачивает файл ubuntu-22.04-desktop-amd64.iso с сайта Ubuntu. На сайте опубликован хеш SHA-256: a4b8c9.... После скачивания пользователь вычисляет хеш локально (команда sha256sum ubuntu-22.04-desktop-amd64.iso) и сравнивает с опубликованным. Совпадение подтверждает, что файл не был повреждён или изменён.
¶Пример 2: HTTP Digest Authentication
Клиент запрашивает ресурс. Сервер отвечает с кодом 401 и nonce (случайное число). Клиент вычисляет хеш: MD5(MD5(username:realm:password):nonce:MD5(method:uri)). Отправляет серверу. Сервер, зная пароль, повторяет вычисление и сравнивает. Если хеши совпадают — аутентификация успешна.
¶Пример 3: Git-коммит
При выполнении git commit Git вычисляет хеш SHA-1 от содержимого коммита. Хеш становится идентификатором коммита. При git push хеш передаётся на удалённый репозиторий. Другие разработчики могут проверить целостность истории, сравнивая хеши.
¶Интересные факты
- В 2017 году Google и CWI Amsterdam продемонстрировали коллизию SHA-1 (атака SHAttered), создав два разных PDF-файла с одинаковым хешем. Это привело к ускоренному переходу на SHA-256.
- В протоколе BitTorrent инфо-хеш (20 байт) используется для идентификации торрент-файла. Передача хеша между трекерами и пирами позволяет находить раздающих.
- В криптовалюте биткойн сложность майнинга регулируется так, чтобы среднее время нахождения хеша блока составляло около 10 минут. Передача хеша нового блока всем узлам сети занимает секунды.
¶Источники
- Menezes, A. J., van Oorschot, P. C., Vanstone, S. A. (1996). «Handbook of Applied Cryptography». CRC Press.
- Stallings, W. (2017). «Cryptography and Network Security: Principles and Practice». Pearson.
- RFC 7616 — HTTP Digest Access Authentication.
- RFC 1321 — The MD5 Message-Digest Algorithm.
- Nakamoto, S. (2008). «Bitcoin: A Peer-to-Peer Electronic Cash System».
- Chacon, S., Straub, B. (2014). «Pro Git». Apress.
