SHA-256
SHA-256 — криптографическая хеш-функция семейства SHA-2, которая сворачивает данные любого объёма ровно в 256 бит (64 шестнадцатеричных символа). Изменение одного входного бита полностью меняет результат, а восстановить исходные данные по хешу невозможно.
Что делает SHA-256
SHA-256 принимает на вход байты любой длины — пустую строку, платёжную ссылку, ISO-образ на четыре гигабайта — и возвращает ровно 256 бит. Записывают их обычно 64 шестнадцатеричными символами. Результат детерминирован: одни и те же байты на любом компьютере мира дадут один и тот же хеш. Например, хеш пустой строки известен наизусть многим администраторам: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.
Показательна пара близких входов. Строка qrcode даёт 6cbf40494f64db7248d7d4d7737f772d6f80941cb93389b49d4321487328acb8, а qrcode.website — 849ab2e419bf03c228afba2ec8c73508406c5aa6913a93eb1e7282eca93ca204. Входы совпадают на первых шести символах, выходы не имеют ничего общего. Это лавинный эффект: переворот одного бита во входных данных меняет в среднем половину из 256 бит результата.
Функция односторонняя. Посчитать хеш от файла — микросекунды, восстановить файл по хешу — задача перебора порядка 2256 вариантов, что недостижимо ни для какого мыслимого железа. Именно поэтому SHA-256 применяют там, где нужно доказать неизменность данных, не раскрывая сами данные.
Внутренняя механика: блоки, раунды, «числа из ниоткуда»
SHA-256 построена по схеме Меркла — Дамгора. Сообщение сначала дополняется: приписывается один бит 1, затем нули, затем 64-битная запись исходной длины в битах — так, чтобы итоговая длина стала кратной 512 битам. Дополнение добавляется всегда, даже если длина уже кратна блоку: минимум 65 служебных бит. Поэтому строка на 1 байт и строка на 55 байт обрабатываются одинаково быстро — обе укладываются в один блок.
Каждый 512-битный блок разворачивается в расписание из 64 слов по 32 бита. Первые 16 слов — сам блок, остальные 48 получаются перемешиванием предыдущих через побитовые вращения, сдвиги и XOR. Внутреннее состояние — восемь 32-битных регистров. Их начальные значения взяты как дробные части квадратных корней первых восьми простых чисел (2, 3, 5, 7, 11, 13, 17, 19), а 64 раундовые константы — как дробные части кубических корней первых 64 простых чисел. Такие «числа из ниоткуда» выбраны намеренно: их происхождение объяснимо и проверяемо, значит, в константы нельзя было спрятать закладку.
Раунд состоит из сложений по модулю 232, циклических сдвигов и двух нелинейных функций — Ch (выбор) и Maj (мажоритарная). После 64 раундов результат складывается с состоянием на входе блока, и обработка переходит к следующему блоку. Никаких таблиц подстановки, только арифметика 32-битных слов, поэтому SHA-256 отлично ложится и на 32-битные микроконтроллеры, и на аппаратные инструкции SHA-NI в современных процессорах.
Про стойкость: поиск прообраза требует порядка 2256 операций, поиск коллизии по парадоксу дней рождения — порядка 2128. Для более старой SHA-1 (160 бит) практическая коллизия была публично продемонстрирована в 2017 году, и SHA-1 из подписей вывели. Для SHA-256 сравнимых результатов нет: лучшие известные атаки работают лишь на урезанное число раундов.
Где SHA-256 встречается рядом с кодами, файлами и платежами
Проверка дистрибутивов и прошивок. Рядом с образом публикуют файл SHA256SUMS, а на своей машине считают хеш командой: sha256sum image.iso в Linux, Get-FileHash image.iso -Algorithm SHA256 в PowerShell, certutil -hashfile image.iso SHA256 в старом cmd. Совпало 64 символа — файл скачался целиком и не подменён. Это ровно тот сценарий, который подробно разбирает термин хеш-сумма файла.
Подпись запросов к API. Схема HMAC-SHA256 берёт секретный ключ и тело запроса и выдаёт подпись, которую сервер пересчитывает у себя. Так подписываются вебхуки платёжных провайдеров и запросы к сервисам генерации кодов: подделать подпись без ключа нельзя, а перехватить и повторить чужой запрос мешает метка времени.
Идемпотентность и дедупликация. Хеш тела запроса удобно использовать как ключ идемпотентности: повторная отправка того же платежа даёт тот же ключ, и сервер не создаёт второй списания. Хранилища файлов по тому же принципу не кладут два одинаковых объекта дважды.
Блокчейн. В Bitcoin SHA-256 применяется дважды подряд: и для идентификаторов транзакций, и в доказательстве работы. Отсюда народная слава алгоритма, хотя к самой криптовалюте функция отношения не имеет — она была стандартизована задолго до неё.
Важное разграничение для тех, кто работает с кодами. Криптографический хвост кода маркировки «Честного ЗНАКа» считается по российским стандартам ГОСТ Р 34.10/34.11, а не по SHA-256 — детали в термине код проверки (крипто-хвост). А четыре символа в конце платёжного QR по спецификации EMVCo — это вовсе не хеш, а контрольная сумма CRC-16, дешёвый детектор случайных искажений. Путать эти три сущности — типичная ошибка при разборе payload.
Чего SHA-256 не делает
Это не шифрование. Хеш необратим и не имеет ключа расшифровки — «расшифровать SHA-256» невозможно в принципе, а сервисы, обещающие это, просто ищут строку по заранее посчитанным радужным таблицам.
Это не защита от подмены сама по себе. Если злоумышленник контролирует и файл, и страницу с опубликованным хешем, он подменит оба. Хеш работает только тогда, когда получен по доверенному каналу или скреплён электронной подписью — здесь в дело вступает УКЭП и инфраструктура сертификатов.
Это не способ хранить пароли. Видеокарта считает миллиарды SHA-256 в секунду, поэтому короткий пароль подбирается по хешу за минуты. Для паролей нужны специально замедленные функции с солью: bcrypt, scrypt, Argon2, PBKDF2 с большим числом итераций.
Это и не замена CRC. Там, где надо ловить случайные искажения при передаче нескольких десятков байт, 32 байта хеша избыточны и медленны: 4 символа CRC решают задачу дешевле. Обратно — CRC не защищает от намеренной подмены, потому что подогнать данные под нужную контрольную сумму элементарно.
Частые вопросы
Может ли у двух разных файлов совпасть SHA-256?
Теоретически да: входов бесконечно много, а выходов 2 в степени 256, так что коллизии существуют. Практически найти их никто не умеет: по парадоксу дней рождения потребуется порядка 2 в степени 128 вычислений. Для сравнения, это несопоставимо больше числа операций, которые человечество выполнило за всю историю вычислительной техники. Поэтому совпадение хешей считают доказательством совпадения файлов.
Чем SHA-256 отличается от SHA-1 и SHA-3?
SHA-1 выдаёт 160 бит и признана небезопасной: в 2017 году была опубликована практическая коллизия. SHA-256 — часть семейства SHA-2 с той же схемой Меркла — Дамгора, но большей длиной и другим расписанием раундов. SHA-3 (Keccak) стандартизована в 2015 году и построена на принципиально другой конструкции «губки»; она не замена SHA-2, а страховка на случай, если в схеме SHA-2 найдут слабость.
Почему хеш всегда 64 символа, даже у гигабайтного файла?
Длина выхода фиксирована конструкцией: внутреннее состояние занимает восемь 32-битных слов, то есть 256 бит, и после обработки последнего блока оно и становится результатом. Размер входа влияет только на время счёта, а не на длину хеша. 256 бит в шестнадцатеричной записи — это 64 символа, потому что каждый символ кодирует ровно 4 бита.
Можно ли положить SHA-256 внутрь QR-кода?
Да, 64 шестнадцатеричных символа отлично помещаются: в алфавитно-цифровом режиме это около 44 байт данных, версия 3 при среднем уровне коррекции справляется. На практике так печатают отпечаток документа или прошивки на паспорте изделия. Собрать такой код можно в генераторе QR-кодов, выбрав текстовый тип содержимого.
Что такое «соль» и зачем она нужна?
Соль — случайная строка, которая приписывается к данным перед хешированием и хранится рядом с результатом. Она не делает функцию стойче, но лишает атакующего заранее посчитанных таблиц: для каждой соли таблицу пришлось бы строить заново. Для паролей соль обязательна и уникальна для каждой записи, а сама функция должна быть намеренно медленной.