482 / 691CSPRNG

CSPRNG

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

CSPRNG создаёт выход из секретного состояния так, чтобы известные значения не позволяли практически предсказывать другие. Безопасность также зависит от исходной энтропии, восстановления состояния и правильного использования интерфейса.

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

RFC 4086 отличает криптографически сильные последовательности от обычных генераторов для моделирования. Знание части выхода не должно позволять угадать остальное. Одни статистические тесты этого не доказывают; предсказуемый seed может обесценить даже сложно выглядящий выход. [RFC 4086 — Cryptographically strong sequences]

NIST SP 800-90A Rev. 1 определяет Hash_DRBG, HMAC_DRBG и CTR_DRBG. Название CSPRNG не сертифицирует каждую реализацию. Нужно установить механизм, параметры и получение энтропии, а не только название хеш-функции. [NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance]

Backtracking resistance защищает прошлые выходы после раскрытия текущего состояния. Prediction resistance относится к будущим; NIST SP 800-90A связывает её с эффективным добавлением свежей энтропии. Одно свойство не означает автоматически другое или восстановление лишь следующим вызовом. [NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance]

OpenSSL 3.5 указывает для RAND_bytes() и RAND_priv_bytes() 1 при успехе, 0 при другой ошибке и -1 для неподдерживаемого метода. Сбой источника энтропии может остановить генерацию. Приложение должно проверять результат, а не использовать непроверенный буфер. [OpenSSL 3.5 — RAND_bytes return values and errors]

libsodium randombytes_buf_deterministic() выдаёт одинаковую последовательность для одинакового seed, например для тестов. Восстановление снимка виртуальной машины может повторить состояние и выход. Воспроизводимость тестов не гарантирует независимых секретов между копиями. [libsodium — Random data and deterministic testing]

libsodium randombytes_uniform() выбирает равномерно ниже верхней границы без смещения от простого остатка деления. Хорошие входные байты не гарантируют правильного отображения в целевой диапазон. Ключи также должны соответствовать правилам своего алгоритма. [libsodium — Random data and deterministic testing]

RFC 8439 требует не повторять nonce с одним ключом; случайный вид не доказывает уникальности. RFC 6979, напротив, описывает детерминированное создание значения k для подписи. Поэтому CSPRNG не заменяет правила протокола универсальным образом. [RFC 8439 — Nonce uniqueness] [RFC 6979 — Deterministic signing]

Зафиксируйте версию библиотеки, механизм, инициализацию, ошибки и поведение после восстановления или клонирования состояния. OpenSSL и libsodium описывают конкретные функции, не безопасность любого кошелька. Хорошая генерация также не предотвращает последующую утечку резервной копии. [OpenSSL 3.5 — RAND_bytes return values and errors] [libsodium — Random data and deterministic testing]

Для полной картины прочитайте эту статью вместе с 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Спецификация ↗
Сначала источники · Не является инвестиционной рекомендацией