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.