Открыть сервис

Nonce

Nonce — это криптографический термин, обозначающий произвольное число, которое используется только один раз в рамках определённого протокола или сеанса связи. От английского «number used once» (число, используемое однократно). Основное назначение nonce — предотвращение атак повторного воспроизведения (replay attacks) и обеспечение уникальности криптографических операций, таких как шифрование, подпись или хеширование.

История возникновения

Понятие nonce возникло в криптографии в середине XX века в связи с развитием систем цифровой связи и необходимостью защиты от перехвата и повторной отправки сообщений. Одним из первых протоколов, где nonce применялся систематически, стал протокол аутентификации Kerberos, разработанный в Массачусетском технологическом институте в 1980-х годах. В нём nonce использовался для связывания запроса и ответа, чтобы злоумышленник не мог подменить одно сообщение другим.

В 1990-е годы с распространением интернета и электронной коммерции nonce вошёл в состав протоколов SSL/TLS, IPsec, SSH и многих других. В блокчейне технология nonce получила новое применение в алгоритме доказательства работы (Proof-of-Work), где майнеры подбирают такое число, чтобы хеш блока удовлетворял заданному условию.

Виды nonce

Nonce классифицируют по способу генерации и области применения.

По способу генерации

  • Случайный nonce — генерируется с помощью криптостойкого генератора псевдослучайных чисел. Обеспечивает максимальную непредсказуемость, но требует синхронизации между отправителем и получателем.
  • Последовательный (счётчик) nonce — представляет собой монотонно возрастающее число (например, номер пакета или временную метку). Не требует хранения больших объёмов данных, но уязвим к атакам, если счётчик сбрасывается.
  • Гибридный nonce — комбинация случайной и последовательной частей, например, случайная строка, дополненная временем.

По области применения

  • Nonce в аутентификации — используется для подтверждения подлинности сторон (например, в протоколах challenge-response).
  • Nonce в шифровании — применяется в режимах работы блочных шифров (например, CTR, GCM) для обеспечения уникальности каждого шифротекста.
  • Nonce в хешировании (Proof-of-Work) — подбирается майнерами для получения хеша с заданным количеством ведущих нулей.
  • Nonce в веб-безопасности — используется в политиках безопасности контента (CSP) для разрешения выполнения отдельных скриптов.

Применение nonce в криптографии

В протоколах аутентификации

В протоколах типа «запрос-ответ» (challenge-response) сервер отправляет клиенту случайный nonce, а клиент должен вернуть его зашифрованным или подписанным. Это доказывает, что клиент обладает секретным ключом, и предотвращает повторную отправку старого ответа злоумышленником. Примеры: протокол Kerberos, аутентификация в Wi-Fi (WPA2/WPA3), протоколы OAuth.

В симметричном шифровании

В режимах работы блочных шифров, таких как CTR (Counter) и GCM (Galois/Counter Mode), nonce используется как начальное значение счётчика. При шифровании каждого последующего блока счётчик увеличивается, что гарантирует уникальность шифротекста даже при шифровании одинаковых открытых текстов одним ключом. Если nonce повторяется, шифр становится уязвимым к атакам (например, в GCM это приводит к полной потере конфиденциальности).

В асимметричной криптографии

При создании цифровых подписей nonce может использоваться для предотвращения атак повторного воспроизведения подписанных сообщений. В протоколах обмена ключами (например, Диффи-Хеллмана) nonce помогает избежать атак «человек посередине» (MITM), связывая сеанс с конкретным экземпляром протокола.

Nonce в блокчейне

В технологии блокчейн, в частности в криптовалюте Bitcoin, nonce является ключевым элементом алгоритма доказательства работы (Proof-of-Work). Майнеры многократно изменяют значение nonce в заголовке блока, вычисляют его хеш (SHA-256) и проверяют, меньше ли полученное значение целевого порога. Если нет — nonce увеличивается на 1, и процесс повторяется. Первый майнер, нашедший подходящий nonce, получает право добавить блок в цепочку и вознаграждение.

В Ethereum (до перехода на Proof-of-Stake) nonce также использовался в Proof-of-Work, но с более сложным алгоритмом Ethash. В современных блокчейнах на основе Proof-of-Stake nonce может применяться для других целей, например, для уникальной идентификации транзакций.

Nonce в веб-безопасности

В политике безопасности контента (Content Security Policy, CSP) nonce представляет собой случайную строку, которая добавляется в HTML-атрибут <script nonce="..."> и в HTTP-заголовок Content-Security-Policy. Браузер выполняет только те скрипты, чей nonce совпадает с указанным в заголовке. Это позволяет разработчикам безопасно использовать инлайн-скрипты, не отключая CSP полностью. Nonce в CSP генерируется заново для каждого HTTP-ответа, что делает его бесполезным для злоумышленника, даже если он перехватит старый nonce.

Криптографические требования к nonce

Для обеспечения безопасности nonce должен удовлетворять следующим условиям:

  • Уникальность — nonce никогда не должен повторяться в рамках одного ключа или сеанса. Повторение nonce в режимах GCM или CTR приводит к раскрытию ключа шифрования.
  • Непредсказуемость — для аутентификационных nonce требуется случайность, чтобы злоумышленник не мог угадать будущее значение.
  • Достаточная длина — обычно от 64 до 128 бит, чтобы вероятность случайного совпадения была пренебрежимо мала.
  • Синхронизация — в протоколах с последовательным nonce отправитель и получатель должны поддерживать согласованное состояние счётчика.

Примеры использования nonce

  • Протокол TLS — при установлении защищённого соединения клиент и сервер обмениваются случайными nonce (client_random и server_random), которые используются для генерации сеансовых ключей.
  • Wi-Fi WPA2 — в четырёхстороннем рукопожатии (4-way handshake) используется nonce, отправленный точкой доступа (ANonce) и клиентом (SNonce), для предотвращения атак повторного воспроизведения.
  • Bitcoin — майнеры перебирают nonce от 0 до 2^32-1, чтобы найти хеш блока, меньший целевого значения.
  • CSP nonce — в веб-приложениях для безопасного выполнения инлайн-скриптов, например: <script nonce="aB3dEfGhIjK1LmNoPqRsTuVwXyZ">alert('OK');</script>.

Критика и ограничения

Основная критика nonce связана с риском его повторного использования. В режимах шифрования, таких как GCM, повторение nonce с одним и тем же ключом приводит к катастрофической потере безопасности: злоумышленник может восстановить ключ аутентификации и расшифровать все сообщения. В блокчейне Proof-of-Work nonce является узким местом производительности: майнеры тратят огромные вычислительные ресурсы на его перебор, что критикуется за энергопотребление.

Кроме того, в протоколах аутентификации, если nonce генерируется с использованием слабого генератора случайных чисел, злоумышленник может предсказать его и провести атаку. В распределённых системах синхронизация последовательных nonce между несколькими узлами также представляет сложность.

Источники

  • Menezes, A., van Oorschot, P., Vanstone, S. «Handbook of Applied Cryptography» (1996). Глава 10: «Identification and Entity Authentication».
  • Ferguson, N., Schneier, B., Kohno, T. «Cryptography Engineering» (2010). Глава 6: «Block Cipher Modes of Operation».
  • Nakamoto, S. «Bitcoin: A Peer-to-Peer Electronic Cash System» (2008). Раздел 4: «Proof-of-Work».
  • RFC 5246 «The Transport Layer Security (TLS) Protocol Version 1.2» (2008). Раздел 7.4.1.2.
  • W3C «Content Security Policy Level 2» (2016). Раздел 4.3: «Nonce source expression».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →