481 / 736RNG

Random Number Generator

Генератор случайных чисел

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

Random Number Generator, или RNG, — это устройство или программа, создающая числовые значения. Кошельку нужен криптографически безопасный генератор: знание прошлых результатов или времени создания не должно позволять атакующему практически предсказать новый секрет. Важны источник энтропии, алгоритм и способ его использования приложением. Энтропия здесь описывает неопределённость результата для атакующего.

Представьте кошелёк, который выводит секрет только из текущего времени. Результат может выглядеть сложным, но знающему время создания придётся проверить гораздо меньше вариантов. RFC 4086 предупреждает именно о таких предсказуемых входных данных. Поэтому генератор для игры или симуляции не обязательно подходит для ключей. Даже хорошее статистическое распределение само по себе не доказывает безопасность. [2]

Обычно вместе работают несколько частей. Источник даёт неопределённость, его выход при необходимости обрабатывается, а криптографический детерминированный генератор создаёт следующие значения из секретного внутреннего состояния. Детерминированный означает, что одно и то же внутреннее состояние и одинаковые входные данные дают одинаковый результат. Поэтому состояние должно оставаться секретным. Приложение запрашивает их через интерфейс системы. Новое физическое измерение для каждого возвращённого бита не требуется. NIST SP 800-90C описывает сочетание генераторов по 90A с источниками по 90B. [1]

В BIP39 основа для восстановления кошелька появляется ещё до первого слова: генератор создаёт от 128 до 256 бит исходной энтропии. Бит — базовая единица информации, ноль или единица; важно, чтобы атакующий не мог предсказать полученную последовательность. К ней добавляют контрольную сумму — короткое значение, помогающее обнаружить часть ошибок записи, — и преобразуют всё в слова восстановления. Их можно дополнить passphrase, дополнительным секретным текстом. Функция PBKDF2 выводит из этих данных 512-битный seed — секретное исходное значение для получения ключей кошелька. Ни более длинный результат, ни контрольная сумма не добавляют недостающей случайности. Поэтому не выбирайте слова восстановления самостоятельно. [6]

Устройство должно обнаруживать неисправности, например когда источник шума начинает повторять одно значение. Поэтому NIST SP 800-90B требует проверок при запуске и во время работы, а также обработки обнаруженных сбоев. Нельзя игнорировать ошибку и продолжать выдавать результат за проверенную случайность. Эти проверки следят за источником, но не гарантируют безопасность всего кошелька. [3]

Детерминированный генератор хранит внутреннее состояние, из которого вычисляет следующие результаты. NIST SP 800-90A описывает создание, генерацию, добавление свежей энтропии (reseed) и завершение работы. Если состояние раскрыто, ещё один вызов не обязательно восстановит безопасность. Нужны подходящий механизм и новая энтропия, неизвестная атакующему. Уже раскрытые ключи от этого не исчезают из его рук. [7]

Вам не нужно самостоятельно программировать RNG. Имеет смысл проверить, документированы ли генерация и обработка ошибок для конкретной версии кошелька. Слова «аппаратный» или «офлайн» сами этого не подтверждают. Проверка должна охватывать источник, алгоритм, инициализацию и интерфейс приложения. Даже правильно созданный секрет потеряет защиту, если позже раскрыть его резервную копию. [1] [2]

По умолчанию getrandom() в Linux ждёт инициализации urandom; с GRND_NONBLOCK вместо ожидания может вернуть EAGAIN. После инициализации запрос к urandom объёмом не более 256 байтов гарантированно возвращает весь объём без прерывания сигналом. На более крупные запросы эта гарантия не распространяется. Программа должна проверять результат вызова и фактическое число полученных байтов. [4]

Web Crypto предлагает getRandomValues() для заполнения поддерживаемого целочисленного массива криптографически сильными значениями. При объёме свыше 65536 байтов возникает QuotaExceededError. Для ключей поддерживаемых алгоритмов спецификация рекомендует generateKey(); это не универсальный генератор биткоин-кошельков. Правильное использование API также не доказывает надёжность страницы: её код может иметь доступ к созданному секрету. [5]

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

DOC · 001NIST SP 800-90C — RBG constructionsСпецификация DOC · 002RFC 4086 — Unpredictability and weak inputsСпецификация DOC · 003NIST SP 800-90B — Source health and failure handlingСпецификация DOC · 004Linux getrandom(2) — Initialization and return behaviorДокументация DOC · 005W3C Web Crypto — getRandomValues and key generationСпецификация DOC · 006BIP39 — Initial entropy and mnemonic-to-seed derivationСпецификация DOC · 007NIST SP 800-90A Rev. 1 — DRBG lifecycle and reseedingСпецификация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией