Nonce — аббревиатура от “Number used once” (“число, используемое один раз”). В криптографии и протоколах передачи данных nonce — это случайное или псевдослучайное число, генерируемое для обеспечения уникальности коммуникаций. К основным характеристикам nonce относятся:
• Уникальность: Это число используется только один раз в рамках конкретной зашифрованной сессии и не повторяется.
• Непредсказуемость: В криптографических сценариях nonce должен быть случайным, чтобы злоумышленники не могли предугадать его значение.
В механизме Proof of Work (PoW) в Bitcoin nonce — единственная переменная, которую майнеры могут изменять вручную при вычислении хэша. Майнеры не могут менять данные транзакций, поэтому они многократно пробуют разные значения nonce, пересчитывая хэш каждый раз. Когда майнер находит nonce, при котором хэш блока соответствует требуемой сложности, этот nonce становится доказательством выполненной работы.
Этот процесс похож на покупку лотерейных билетов. Данные блока — это ваше имя, а nonce — случайное число, которое вы выбираете. Вы продолжаете менять число (nonce), пока не выиграете (не достигнете нужной сложности хэша).
В Ethereum nonce выполняет две основные функции, наиболее распространённая — nonce аккаунта:
Главная задача nonce — усиление безопасности и целостности системы:
• Защита от повторных атак (Replay Attack): Это базовая функция nonce. Злоумышленники могут перехватить корректные сообщения и попытаться повторно их отправить для несанкционированного доступа. Nonce гарантирует, что даже если сообщение перехвачено, сервер отклонит запрос, так как номер уже использован.
Это похоже на серийный номер чека. Если кто-то обналичил чек с номером #001, банк аннулирует этот номер. Даже если чек скопируют, обналичить его снова не получится.
• Гарантия актуальности данных: Включение nonce позволяет получателю убедиться, что данные созданы в реальном времени, а не являются повтором старой информации. Это предотвращает подделку личности на основе записей предыдущих сессий.
• Усиление непредсказуемости: Nonce вводит дополнительную переменную в процесс шифрования, что значительно усложняет анализ шаблонов и взлом системы.
В зависимости от способа генерации и требований применения nonce делятся на две основные категории:
• Случайный nonce: Генерируется с помощью криптографически стойкого генератора псевдослучайных чисел (CSPRNG), обладает высокой энтропией и непредсказуемостью. Обычно используется в цифровых подписях и современных схемах шифрования.
• Последовательный nonce: Формируется путём инкрементирования счётчика. Такой подход менее непредсказуем, но гарантирует абсолютную уникальность и подходит для механизмов аутентификации.
Nonce используется в самых разных сценариях — от повседневного веб-сёрфинга до транзакций с цифровыми валютами, а также в различных протоколах безопасности и новых технологиях. Ключевой принцип nonce всегда основан на уникальности и непредсказуемости.
• Управление идентификацией и аутентификация: В HTTP Digest Authentication, Single Sign-On (SSO) и двухфакторной аутентификации (2FA) nonce подтверждает личность пользователя и подлинность запроса.
• Криптографические протоколы и цифровые подписи:
◦ Во время SSL/TLS handshake клиенты и серверы обмениваются nonce для проверки идентичности.
◦ В алгоритмах, таких как AES-GCM, nonce выполняет роль инициализационного вектора (IV), что предотвращает совпадение шифротекста для одинаковых открытых данных.
• Блокчейн и распределённые реестры
Сегодня это наиболее заметная область применения nonce, где решаются вопросы “кто записывает транзакции” и “в каком порядке они происходят”.
Например, при майнинге Proof of Work (PoW): в Bitcoin nonce — это 32-битное поле. Майнеры непрерывно изменяют это число, пока хэш заголовка блока не станет меньше целевого значения сложности.
В управлении аккаунтами Ethereum: каждый аккаунт Ethereum ведёт увеличивающийся nonce. Это не только предотвращает повторные атаки (отправку одной и той же транзакции дважды), но и позволяет пользователям “заменять” или “отменять” зависшие транзакции, отправляя новую с тем же nonce и большей комиссией.
Nonce и значения хэша часто встречаются вместе в блокчейн-контексте, но по сути различаются:
Хэш — это “цифровой отпечаток” данных, который определяется входными данными и имеет фиксированный размер. Nonce — временная переменная, с помощью которой изменяют результат хэширования.
С точки зрения времени, хэш служит постоянным идентификатором набора данных, а nonce обычно удаляется после однократного использования.
Если генерация или управление nonce реализованы некорректно, система подвергается серьёзным рискам. К распространённым атакам относятся:
◦ Атака с повторным использованием nonce: Злоумышленники используют одинаковые nonce для взлома криптографической защиты. Например, в июле 2021 года в протоколе Anyswap Multichain Router V3 были подписаны две транзакции с одинаковым значением (компонент подписи), что позволило злоумышленникам вычислить приватный ключ и привело к потерям почти $8 млн.
◦ Атака на предсказуемость nonce: Если алгоритм генерации nonce предсказуем, злоумышленники могут манипулировать процессами майнинга или аутентификации.
◦ Атака методом перебора: Злоумышленники перебирают возможные значения nonce, чтобы найти хэш, соответствующий условиям. Например, в 2018 году сеть Bitcoin Gold (BTG) подверглась серии атак 51%. Злоумышленники арендовали огромные вычислительные мощности для перебора nonce и в результате похитили 388 200 BTG, причинив убытки примерно на $18 млн.

Источник скриншота: Bitcoin Gold Explorer
Для предотвращения подобных атак разработчикам и проектам следует использовать генераторы с высокой степенью случайности (например, CSPRNG), обеспечивать строгую проверку уникальности и регулярно обновлять криптографические библиотеки.
Nonce как фундаментальный элемент криптографических технологий благодаря свойству “одноразовости” обеспечивает надёжную защиту сложных интернет-коммуникаций и распределённых реестров. Понимание и правильная реализация механизмов nonce необходимы для безопасности, прозрачности и целостности цифрового мира.
Рекомендуем прочитать:





