Перейти к содержимому
ecdsa.com

CSPRNG (криптографически стойкий ГСЧ)

Генератор случайных чисел, выход которого нельзя предсказать или отличить от истинной случайности, даже если атакующий видел предыдущие значения; такой генератор необходим для ключей, nonce, солей и токенов.
Другие написанияCSPRNGrandom number generatorDRBGgetRandomValues/dev/urandom

Операционные системы предоставляют такой генератор, получающий начальное значение из аппаратной энтропии: getrandom(2) и /dev/urandom в Linux, getentropy и arc4random в macOS и BSD, BCryptGenRandom в Windows. API языков программирования служат обёртками над ними: crypto.getRandomValues() в браузерах (не более 65 536 байт за вызов), crypto.randomBytes в Node.js, secrets в Python, crypto/rand в Go, SecureRandom в Java. Math.random(), random в Python и подобные генераторы общего назначения предсказуемы и никогда не должны использоваться для генерации секретов.

NIST SP 800-90A Rev. 1 определяет одобренные детерминированные генераторы (Hash_DRBG, HMAC_DRBG и CTR_DRBG), SP 800-90B — источники энтропии, а SP 800-90C — способы их сочетания; модули FIPS 140-3 обязаны их использовать. Исключённый из стандарта Dual_EC_DRBG — хрестоматийный пример генератора, в котором подозревают бэкдор.

Большинство реальных сбоев ГСЧ связано с получением начального значения (seeding), а не с алгоритмами: встраиваемые устройства генерируют ключи до того, как накопится достаточно энтропии, клонированные виртуальные машины продолжают работу с одинаковым состоянием, а дочерние процессы после fork делят один генератор. ECDSA особенно чувствителен к этому, потому что предсказуемый nonce раскрывает ключ; детерминированные nonce или nonce с подмешанной случайностью (hedged) устраняют эту зависимость.

Стандарты и ссылки

Все термины