SHA-256: алгоритм хеширования¶
SHA-256 (Secure Hash Algorithm 256) — это криптографическая хеш-функция, которая преобразует произвольный набор данных в битовую строку фиксированной длины — 256 бит (32 байта). Алгоритм относится к семейству SHA-2, разработанному Агентством национальной безопасности США (NSA) и опубликованному Национальным институтом стандартов и технологий (NIST) в 2001 году. Основное назначение SHA-256 — обеспечение целостности данных и создание цифровых отпечатков (дайджестов) сообщений.
¶История и стандартизация
Разработка SHA-256 стала ответом на обнаруженные уязвимости в предыдущем стандарте SHA-1, теоретическая стойкость которого к коллизиям (ситуациям, когда разным входным данным соответствует один и тот же хеш) была снижена. В 2001 году NIST опубликовал стандарт FIPS PUB 180-2, включивший SHA-256 и родственные функции SHA-384 и SHA-512. В 2002 году алгоритм был принят в качестве федерального стандарта США. Позднее, в 2004 году, вышла версия FIPS PUB 180-3, а в 2015 году — FIPS PUB 180-4, в которую добавили SHA-512/224 и SHA-512/256.
SHA-256 также закреплён в международных стандартах ISO/IEC 10118-3 и ISO/IEC 14888-3. Алгоритм является частью более широкого семейства SHA-2, которое включает варианты с длиной дайджеста 224, 256, 384 и 512 бит. В отличие от более нового стандарта SHA-3 (Keccak), SHA-256 построен на структуре Меркла — Дамгора, что делает его уязвимым к теоретическим атакам удлинения сообщения, однако на практике эта уязвимость не имеет критического значения для большинства применений.
¶Принцип работы
SHA-256 обрабатывает входное сообщение блоками по 512 бит (64 байта). Процесс состоит из трёх основных этапов:
- Дополнение сообщения: к данным добавляется бит «1», затем нули до тех пор, пока длина сообщения не станет сравнимой с 448 по модулю 512. В последние 64 бита записывается исходная длина сообщения в битах (до 2^64 − 1).
- Инициализация: используются восемь 32-битных начальных значений (константы), представляющих собой первые 32 бита дробных частей квадратных корней первых восьми простых чисел.
- Обработка блоков: каждый 512-битный блок проходит через 64 раунда преобразований. Используются операции побитового сдвига, XOR, сложения по модулю 2^32 и 64 предопределённые константы (первые 32 бита дробных частей кубических корней первых 64 простых чисел). Состояние алгоритма хранится в восьми 32-битных регистрах, которые обновляются на каждом раунде.
Результатом работы является конкатенация восьми регистров состояния, образующая 256-битный дайджест. Выходное значение обычно представляется в виде 64-значного шестнадцатеричного числа.
¶Криптографические свойства
SHA-256 обладает тремя ключевыми свойствами, необходимыми для криптографической хеш-функции:
- Однонаправленность: по известному хешу практически невозможно восстановить исходное сообщение. Единственный метод — полный перебор или подбор по словарю.
- Устойчивость к коллизиям: найти два различных сообщения с одинаковым хешем вычислительно неосуществимо. Сложность атаки составляет порядка 2^128 операций (из-за парадокса дней рождения).
- Лавинный эффект: незначительное изменение входных данных (даже один бит) приводит к кардинальному изменению выходного хеша, при этом корреляция между изменениями отсутствует.
По состоянию на 2025 год не существует практических атак, позволяющих найти коллизии для полного SHA-256. Теоретические исследования касаются в основном ослабленных вариантов алгоритма с уменьшенным числом раундов. Стойкость SHA-256 считается достаточной для использования в квантовую эпоху: атака Гровера теоретически снижает сложность поиска прообраза до 2^128 операций, что всё ещё остаётся практически недостижимым.
¶Применение
¶Криптовалюты
SHA-256 является основой механизма Proof-of-Work в биткоине и многих других криптовалютах. Майнеры подбирают значение nonce таким образом, чтобы хеш заголовка блока начинался с определённого количества нулевых битов. Вычислительная сложность этого процесса регулируется сетью для поддержания целевого времени создания блока. Специализированное оборудование (ASIC-майнеры) выполняет триллионы операций SHA-256 в секунду.
¶Цифровые подписи и сертификаты
Алгоритм используется в схемах электронной подписи (например, ECDSA) для создания дайджеста подписываемого документа. Сертификаты X.509 и протокол TLS 1.2 и выше применяют SHA-256 для проверки целостности передаваемых данных и подлинности серверов.
¶Хранение паролей
SHA-256 применяется для хеширования паролей, однако в чистом виде он не рекомендуется для этой цели из-за высокой скорости вычислений, позволяющей быстро перебирать пароли. На практике используют адаптивные функции (bcrypt, scrypt, Argon2) или применяют многократное хеширование (PBKDF2) с добавлением соли.
¶Проверка целостности файлов
SHA-256 используется для контроля целостности дистрибутивов программного обеспечения, прошивок и документов. Издатели публикуют контрольные суммы, позволяющие пользователям убедиться, что загруженный файл не был повреждён или модифицирован. Операционные системы Linux применяют SHA-256 для проверки целостности пакетов в репозиториях.
¶Git и системы контроля версий
Распределённая система контроля версий Git использует SHA-1, однако в 2017 году проект перешёл на SHA-256 для новых репозиториев в связи с обнаружением практической атаки на SHA-1 (атака SHAttered). Хеши SHA-256 идентифицируют коммиты и объекты в репозитории, обеспечивая их целостность и неизменность истории.
¶Сравнение с другими хеш-функциями
SHA-256 имеет скорость вычисления ниже, чем у SHA-1 или MD5, но обеспечивает значительно более высокий уровень безопасности. По сравнению с SHA-512, SHA-256 работает быстрее на 32-битных процессорах, но медленнее на 64-битных. Новый стандарт SHA-3 (Keccak) построен на принципиально иной конструкции (sponge function) и не подвержен атакам удлинения сообщения, однако SHA-256 остаётся более распространённым из-за широкой аппаратной поддержки и длительной истории использования.
¶Интересные факты
- Первый блок биткоина (генезис-блок) содержит хеш SHA-256, который начинается с большого числа нулевых битов, что потребовало значительных вычислений даже для первого блока.
- В 2013 году группа исследователей продемонстрировала теоретическую атаку на 43 из 64 раундов SHA-256, однако она не представляет практической угрозы.
- Алгоритм SHA-256 используется в протоколе блокчейна для создания адресов кошельков (двойное хеширование SHA-256 в паре с RIPEMD-160).
- NIST рекомендует SHA-256 для использования до 2030 года и далее для большинства приложений, не требующих защиты от квантовых атак.