482 / 736CSPRNG

CSPRNG

Криптографически безопасный генератор псевдослучайных чисел

Когда кошельку нужен новый секрет, числа, которое лишь выглядит случайным, недостаточно. CSPRNG должен делать следующие значения практически непредсказуемыми даже для атакующего, которому известна часть результатов.

CSPRNG — криптографически безопасный генератор псевдослучайных чисел. Он вычисляет новые значения из секретного внутреннего состояния по определённой процедуре. «Псевдослучайный» не означает некачественный: вычисление можно повторить, но без знания секретного состояния результаты должны быть практически непредсказуемы. Для этого необходима достаточная энтропия — неопределённость входных данных для атакующего — и правильное использование генератора в приложении.

Представьте программу, создающую секретные значения для кошелька. Атакующий узнаёт некоторые прежние результаты. Безопасный генератор не должен позволять этому знанию облегчить угадывание остальных. Это более сложное требование, чем красивое распределение чисел на графике. Поэтому RFC 4086 отличает криптографически сильные последовательности от обычных генераторов для моделирования. Даже хорошего результата статистических тестов мало, если можно угадать seed — исходное значение генератора. [1]

В технической документации встречается и DRBG — детерминированный генератор случайных битов. «Детерминированный» означает, что одинаковые состояние и входные данные дают одинаковый результат; поэтому состояние должно оставаться секретным. NIST SP 800-90A Rev. 1 описывает конкретные механизмы: Hash_DRBG, HMAC_DRBG и CTR_DRBG. Это технические процедуры, а не знак качества любой программы, упоминающей их названия. Проверке подлежат также настройки, происхождение энтропии и фактическая реализация в коде. [2]

Утечка состояния ставит два разных вопроса. Может ли атакующий восстановить прежние секретные результаты? Может ли предсказать следующие? Защита прошлых результатов называется Backtracking resistance, будущих — Prediction resistance. Для второй NIST SP 800-90A требует эффективного добавления свежей энтропии, которая отделит новые результаты от раскрытого состояния. Простое повторение вычисления не обязательно восстановит безопасность. Наличие одной защиты также не доказывает автоматически наличие другой. [2]

Библиотека — готовый программный компонент, которым может пользоваться кошелёк. Но её вызов может завершиться ошибкой. В OpenSSL 3.5 функции RAND_bytes() и RAND_priv_bytes() возвращают 1 при успехе, 0 при иной ошибке и -1, если текущий метод не поддерживается. При сбое источника энтропии генерация может быть отклонена. Программа обязана проверить результат вызова до использования выделенной области памяти — буфера. Иначе она может взять данные, которые вообще не были безопасно созданы. [3]

Повторяемость полезна при тестировании: разработчик хочет сравнить результат с ожидаемым. Поэтому функция randombytes_buf_deterministic() в libsodium создаёт одну и ту же последовательность из одного и того же seed. В обычной работе непреднамеренное повторение становится проблемой. Снимок виртуальной машины сохраняет состояние компьютера вместе с памятью. При его восстановлении могут повториться и состояние генератора, и его результаты. Поэтому копии окружения не обязательно создают независимые секреты. [4]

Генератор может выдать качественные случайные данные, которые приложение затем неправильно обработает. Если привести их к меньшему допустимому диапазону простым остатком от деления, некоторые результаты могут выпадать чаще других. Функция randombytes_uniform() в libsodium устраняет эту проблему равномерным выбором ниже заданной верхней границы. Ключи также должны соответствовать правилам своего алгоритма. Безопасность не заканчивается получением случайных байтов: важно и их дальнейшее использование. [4]

Nonce — значение для отдельного использования в криптографической процедуре, но правила определяет конкретный протокол. RFC 8439 требует не повторять nonce с одним и тем же ключом; случайный вид не гарантирует уникальности. RFC 6979, напротив, описывает детерминированное вычисление значения k для цифровой подписи из секретного ключа и подписываемого сообщения. Это разные конструкции, а не противоречие. Указание «везде добавьте случайность» не заменяет правильную процедуру. [5] [6]

Одна надпись CSPRNG не показывает, правильно ли кошелёк использует всю систему. Техническая проверка рассматривает конкретную версию библиотеки, запуск генератора, обработку ошибок и поведение после восстановления или копирования состояния. Документация OpenSSL и libsodium подтверждает свойства их функций, а не безопасность любого вызывающего их приложения. Для пользователя важно и продолжение: даже идеально созданный секрет перестаёт защищать средства, если впоследствии утечёт резервная копия, позволяющая восстановить доступ. [3] [4]

Для полной картины прочитайте эту статью вместе с Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. На эту статью также ссылаются Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.

DOC · 001RFC 4086 — Cryptographically strong sequencesСпецификация DOC · 002NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistanceСпецификация DOC · 003OpenSSL 3.5 — RAND_bytes return values and errorsДокументация DOC · 004libsodium — Random data and deterministic testingДокументация DOC · 005RFC 8439 — Nonce uniquenessСпецификация DOC · 006RFC 6979 — Deterministic signingСпецификация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией