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Специфікація
Переглянуто: Спочатку джерела · Не інвестиційна порада