Всем привет! В этой статья я расскажу обобщенно про внутреннее устройство SHA-2, SHA-3, а также про другие примитивы, относящиеся к хеш-функциям: XOF, TupleHash, cSHAKE, Argon2.Именно SHA-2 и SHA-3 сейчас являются самыми популярными и широко используемыми примитивами, которые используются для реализации безопасных протоколов и других криптографических примитивов. Читать далее
Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели1.3K
Туториал
Именно SHA-2 и SHA-3 сейчас являются самыми популярными и широко используемыми примитивами, которые используются для реализации безопасных протоколов и других криптографических примитивов.
SHA1 и MD5 считались когда-то давно хорошими, но сейчас исследователями продемонстрирована недостаточная их устойчивость к коллизиям. Тем не менее их иногда используют в системах, где упор делается на устойчивость к атакам нахождения прообразов, а не на устойчивость к коллизиям
Рассмотрим SHA-2Хеш-функция SHA-2 (алгоритм безопасного хеширования – 2) является наиболее широко распространённой. Он был изобретен АНБ и стандартизирован NIST в 2001 году.
Он имеет четыре версии, дающие на выходе 224, 256, 384 или 512 бит (SHA-224, SHA-256 и тд). Также есть ещё две версии, SHA-512/224 и SHA-512/256, которые получают нужный выход путём усечения результата SHA-256.
Для примера можно захешировать одну и ту же фразу разными версиями SHA-2:
echo -n "привет, подписчики" | openssl dgst -sha224Работа SHA-2 основывается на работе функции сжатия (она является односторонней функцией), которая принимает два входных блока некоторого размера и производит один выход размером, равным размеру одного из входных блоков.

Существуют различные способы построения функции сжатия. В SHA-2 используется метод Дэвиса-Майера, который основывается на блочных шифрах (шифрует такой шифр блоками фиксированного размера на входе и выходе).

SHA-2 является структурой Меркла-Дамгарда, то есть это алгоритм, который хеширует сообщение путем итеративного вызова функции сжатия. Как правило, SHA-2 состоит из двух шагов.
Сначала к хешируемым входным данным применяется дополнение (padding).Затем входные данные разрезаются на блоки. Разбивка до-полненных входных данных на блоки одинакового размера позволяет поместить их в первый аргумент функции сжатия. Например, SHA-256 имеет размер блока 512 бит.
Далее к полученным блокам итеративно применяется функция сжатия. При этом выход предыдущей функции задействуется в качестве второго аргумента для следующей. Конечным результатом является дайджест.

Благодаря структуре Меркла-Дамгарда, SHA-2 с входом произвольной длины является безопасным (устойчивость к коллизиям и тд) тогда, когда является безопасной функция сжатия с фиксированной длинной в нём. Однако, SHA-2 из-за той же структуры уязвима к атаке удлинения сообщения. Поэтому хешировать ей определённые секреты не стоит.
Вектор инициализации в SHA-2 является частью концепции nothing-up-my-sleeve (в моих рукавах ничего нет), то есть этот вектор является случайным, но берётся из корней первых простых чисел, чтобы показать, что в нём не заложен бэкдор.
Рассмотрим SHA-3В связи с тем, что SHA-2 уязвима к атаке удлинением сообщения, в 2007 году NIST провёл конкурс на новый стандарт. В 2012 году победителем был объявлен алгоритм Keccak и стал SHA-3, который в 2015 году утвердили стандартом.
SHA-3 удовлетворяет всем трём свойствам безопасности и имеет точно такие же различные версии по длине выхода, как и SHA-2.
Этот криптографический алгоритм построен на основе перестановок. То есть на основе биективного отображения множества на само себя.
SHA-3 имеет конструкцию губки, которая содержит в себе конкретные перестановки под названием keccak-f.
Начальное состояние губки (самые первые входные данные по сути до наших) необходимо произвольно разделить на скорость (rate) и ёмкость (capacity). Чем больше ёмкость, тем надёжнее конструкция губки. А чем больше скорость, тем больше данных мы сможем подавать в конструкцию губки за раз.
Сами данные хешируются очень просто, посмотрите на фото.

Первым делом начальное состояние конструкции губки инициализируется нулями, перед первой перестановкой мы производим операцию XOR между частью rate начального состояния с такого же размера входными данными.
Далее производим перестановку. И так повторяем, пока не закончатся наши данные. Часть rate выхода из одной перестановки XOR с частью входных данных. При необходимости наши входные данные дополняем до нужного размера, кратному скорости.
На этом закончится так называемый этап впитывания, для получения хеша нужного размера переходим к этапу выжимки, в ходе которого мы итеративно применяем перестановку и забираем часть скорости.
Начальное состояние губки имеет размер 1600 бит и в зависимости от разных версий имеет разные размеры скорости и ёмкости.
Что такое XOF-функции?В стандарте SHA-3 был введён универсальный примитив с произвольным размером дайджеста. Этот примитив называется функцией расширенного выхода (XOF).
Рассмотрим две стандартизированные XOF-функции: SHAKE и cSHAKE.
SHAKE по сути тот же SHA-3, но имеет больший размер rate (как следствие работает быстрее) и на этапе выжимания выполняет столько перестановок, сколько нужно. Он принимает входные данные и нужный размер дайджеста.
cSHAKE — это настраиваемая версия SHAKE (customizable SHAKE). Она аналогична SHAKE, но вместе с входными данными принимает строку настройки, которая может быть пустой.
Эта строка позволяет нам менять выход XOF-функции для одних и тех же данных. То есть может использоваться для разделения предметных областей. Эта строка после преобразования просто конкатенируется с нашими входными данными и потом впитывается.
TupleHashTupleHash, как следует из названия, позволяет хешировать кортеж. Основан он на cSHAKE и позволяет обойти следующие проблемы про хешировании списков чего-либо:
echo -n "pxi""geses""100""98" | openssl dgst -sha256Хеш этой строки составленной из кортежа будет равен хешу этого кортежа:
echo -n "pxi""geses""1009""8" | openssl dgst -sha256TupleHash однозначно сериализует данные в удобную для хеширования строку. По сути под капотом он вызовет функцию cSHAKE и передаст ей входные данные с указанием длины в начале каждого отдельного поля кортежа.
Кратко про Argon2 и bcryptПредставим, что вы авторизуете пользователей на сайте и храните только хеши паролей и для каждого пароля добавляете свою соль.
Однако, у злоумышленника оборудование может быть в десятки и сотни раз мощнее вашего, таким образом при наличии доступа к вашей базе данных с хешами он сможет достаточно быстро перебирать много паролей одновременно.
Для решения этой проблемы были разработаны специальные медленные хеш-функции. Среди них чаще всего используют bcrypt, scrypt и старый PBKDF2. Но в 2021 стал стандартизован и продвигается активно Argon2 (RFC 9106).
Argon2 и scrypt защищают от высокого уровня оптимизации со стороны злоумышленников, так как являются схемами зависимыми от памяти. Это значит, что алгоритм может быть оптимизирован только за счёт оптимизации доступа к памяти. Таким образом эти функции выполняются медленно на любом типе устройств.
На этом всё! Буду рад вашим вопросам и комментариям.| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Двойная точность: в основном «найти и заменить», плюс два настоящих сюрприза | 1 | 9.12 | 25-08-2026 |
| 2 | Активность хакерских группировок: блокчейн как C2, business email compomise и антибот-фильтры | 0 | 10.89 | 22-07-2026 |
| 3 | Хаос, шок, приватные ключи от не менее приватного GitLab | 0 | 29.2 | 31-07-2026 |
| 4 | Организовал весь пентест-арсенал в одном месте: всё под рукой, офлайн и на русском | 5 | 7 | 28-06-2026 |
| 5 | [Перевод] Сжатие данных — это предсказание | 0 | 6.67 | 17-08-2026 |
| 6 | Шифр на кубике Рубика. Криптографическая задача №2 | 0 | 5 | 12-07-2026 |
| 7 | Я выкачал 1 000 лучших статей Хабра за год, чтобы понять, почему меня так мало плюсуют | 0 | 11.04 | 20-10-2026 |
| 8 | Ох уж это многопоточное программирование | 0 | 2 | 17-06-2026 |
| 9 | Мои любимые CSS-трюки для фронтендеров, которые не используют Tailwind | 0 | 9.17 | 18-08-2026 |