Псевдослучайные и истинно случайные числа: в чём разница и как их отличить

· Обновлено: · · Псевдослучайные числа, Истинно случайные числа, RNG, CSPRNG, Безопасность

История изменений (6 обновлений, последнее 30 Aug 2026)

Журнал изменений этой статьи. Там, где версия до правки была заархивирована, она остаётся доступной для чтения по постоянной ссылке с DOI.

Переведены названия источников в списке литературы. Утверждения статьи не менялись.
Русский текст переписан как полноценный технический перевод, а не калька с японского. Утверждения статьи не менялись.
В начало статьи добавлен раздел «Карта знаний этой статьи». Это сводка понятий и связей из основного текста: краткое резюме, схема и ссылка на страницу сведений. Утверждения в тексте не менялись.
Текст обновлён по итогам внешнего ревью (1283 замечания). Содержание отдельных правок см. в записях ниже.
Добавлена таблица соответствия бытовых названий, терминов стандартов и английских расшифровок (с пометкой, что CSPRNG и TRNG — не термины NIST). Добавлены минимальные примеры на C# и Python и контрастный фрагмент, где `random` использовать нельзя. Добавлен сценарий, в котором токен с seed из текущего времени реально угадывают.
В тексте статьи смешение написаний «擬似乱数» и «疑似乱数» приведено к единому «疑似乱数» (названия документов в источниках оставлены как в оригинале).
Первая публикация
Цитирование статьи(DOI (зарегистрированный архив): 10.5281/zenodo.21619846)

Приведённые ниже DOI относятся к ранее зарегистрированным архивным версиям, которые могут отличаться от текущего текста. Для ссылки на текущий текст используйте URL этой страницы.

Го Комура (2026). Псевдослучайные и истинно случайные числа: в чём разница и как их отличить. KomuraSoft LLC. https://comcomponent.com/ru/blog/2026/04/17/000-pseudo-random-vs-true-random-how-to-distinguish/

DOI (зарегистрированный архив)
10.5281/zenodo.21619846
DOI (последняя зарегистрированная версия)
10.5281/zenodo.21619847

Разговор о случайных числах быстро уходит в сторону: совсем разные вещи называют одним словом «случайные». И последовательность, которую считает что-то вроде Math.random(), и последовательность из физического явления — теплового шума или джиттера тактового сигнала — на вид обе достаточно разбросаны.

На практике, если это различие так и оставить размытым, легко ошибиться в решениях вроде таких.

  • В симуляции нужна воспроизводимость, а результат каждый раз другой
  • Токен сброса пароля собирают из легко предсказуемых случайных чисел
  • Прохождение статистического теста принимают за доказательство «это истинные случайные числа»
  • Наоборот, услышав «псевдо», всё сразу считают опасным

В статье разбираем, что такое псевдослучайные числа, что такое истинно случайные и как их различать — в виде, по которому на практике можно принять решение. Смотреть нужно не на вид выхода, а на устройство генератора.

Содержание опирается на материалы NIST, IETF и официальную документацию ОС и языков, доступные по состоянию на апрель 2026 года.

Содержание

  1. Сначала вывод (одной фразой)
  2. Что в этой статье называют псевдослучайными и истинно случайными числами
  3. Сначала — одна схема
    • 3.1. Схема связей
    • 3.2. Самый короткий словарь
  4. Что такое псевдослучайные числа
    • 4.1. Одной фразой
    • 4.2. Обычный PRNG и CSPRNG нужно разводить
  5. Что такое истинно случайные числа
    • 5.1. Одной фразой
    • 5.2. Физические случайные числа тоже не всегда отдают как есть
  6. В чём именно разница
    • 6.1. Источник
    • 6.2. Воспроизводимость
    • 6.3. Предсказуемость
    • 6.4. Скорость и эксплуатация
  7. Как их различить
    • 7.1. По одному выходу в принципе не отличить
    • 7.2. Сначала смотреть устройство генератора
    • 7.3. Затем статистическими тестами искать явные дефекты
    • 7.4. Для задач безопасности смотреть глазами атакующего
  8. Что брать под какую задачу
    • 8.1. Минимальные примеры
  9. Частые заблуждения
  10. Таблица решений, когда неясно
  11. Итог
  12. Справочные материалы

На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 16, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle

1. Сначала вывод (одной фразой)

Если сказать довольно грубо, но так, чтобы это было полезно на практике, получится следующее.

  • Псевдослучайные числа — последовательность, которую детерминированно строят из внутреннего состояния и алгоритма
  • Истинно случайные числа — последовательность, у которой источником энтропии служит физическое явление: тепловой шум, джиттер и подобное
  • На практике, однако, безопасный API случайных чисел чаще всего не отдаёт сырые физические значения, а возвращает DRBG / CSPRNG, которому seed задал источник энтропии
  • Поэтому отличить их по признаку «выглядит ли случайным» нельзя. Смотреть нужно на устройство генератора, как подаётся seed, reseed и health test
  • В симуляциях и воспроизводимых испытаниях воспроизводимость псевдослучайных чисел — это преимущество
  • Для ключей, токенов, nonce и других задач безопасности базовое правило — безопасный API, который даёт ОС или язык

Иначе говоря, если сразу держать в голове эти три категории, ошибиться сложнее.

  1. Речь об обычном PRNG?
  2. Речь о криптографическом PRNG / CSPRNG / DRBG?
  3. Речь об NRBG / TRNG с физическим источником энтропии?

2. Что в этой статье называют псевдослучайными и истинно случайными числами

Просто сказать «случайные числа» здесь слишком широко. Сначала зафиксируем значения.

  • Псевдослучайные числа (PRNG): последовательность, которую детерминированная процедура строит из seed и внутреннего состояния. При тех же условиях получается та же последовательность
  • Криптографически стойкие псевдослучайные числа (CSPRNG / DRBG): тоже псевдослучайные, но с упором на трудность предсказания. NIST SP 800-90A как раз определяет этот deterministic random bit generator
  • Истинно случайные числа: в бытовой речи чаще имеют в виду «настоящие» или «физические» случайные числа. У NIST ближе всего NRBG (non-deterministic random bit generator): генератор, который постоянно обращается к источнику энтропии и в исправном состоянии даёт выход с full entropy

Названия по областям расходятся, поэтому соответствие бытового языка и языка стандартов тоже зафиксируем сразу. Дальше в статье идут названия из левой колонки.

Как в этой статье Другие частые названия Соответствующие аббревиатуры Английская расшифровка
Псевдослучайные числа PRNG pseudorandom number generator
Криптографически стойкие псевдослучайные числа криптографические псевдослучайные, случайные числа для криптографии CSPRNG, DRBG cryptographically secure pseudorandom number generator, deterministic random bit generator
Истинно случайные числа настоящие случайные, физические случайные, аппаратные случайные NRBG, TRNG non-deterministic random bit generator, true random number generator
Источник энтропии источник шума entropy source

Два уточнения.

  • NIST SP 800-90A / 90B / 90C пользуются словами DRBG, NRBG и entropy source. CSPRNG и TRNG — не термины этих стандартов, а названия, широко принятые на практике и в литературе
  • В японском встречаются оба написания, 疑似 и 擬似. В исходной статье единообразно используется 疑似乱数. Названия документов в списке источников оставлены как в оригинале

Важно вот что: «псевдослучайные» и «опасные случайные числа» — не синонимы.

Например, быстрый PRNG вроде линейного конгруэнтного метода или простого xorshift и CSPRNG вроде CTR_DRBG или HMAC_DRBG оба детерминированы, но для безопасности это совсем разные вещи.

3. Сначала — одна схема

3.1. Схема связей

Быстрее всего увидеть взаимное положение понятий на одной схеме.

Откуда в приложении берутся случайные числаФизическое явление питает источник энтропии и seed/reseed, затем DRBG/CSPRNG быстро разворачивает значения, которые возвращает API ОС или библиотеки; обычный PRNG идёт отдельно от внутреннего состояния и формулы.Физическое явлениетепловой шум, джиттер и т. п.Источник энтропииseed / reseedDRBG / CSPRNGбыстро разворачивает последовательностьСлучайные числа, которые возвращает ОС / библиотекаВнутреннее состояние + формулаОбычный PRNGПоследовательность, которая выглядит случайной

Важно, что выход «безопасного API случайных чисел», который получает приложение, немного отличается и от обычного PRNG справа, и от сырого физического шума слева.

Большинство реализаций берут левый источник энтропии для seed / reseed, а затем возвращают значения, которые DRBG / CSPRNG быстро разворачивает из этого seed. NIST SP 800-90B и 800-90C как раз описывают эту схему entropy source + deterministic generator.

3.2. Самый короткий словарь

Вид Из чего строится Воспроизводится при тех же условиях Что требуется в первую очередь Куда подходит
Обычный PRNG Формула и внутреннее состояние Да Скорость, воспроизводимость Симуляции, игры, тесты
CSPRNG / DRBG Криптографический алгоритм + seed Да Трудность предсказания Ключи, токены, nonce, session ID
Истинно случайные числа / NRBG Физический источник энтропии По сути нет Физическая неопределённость, энтропия Подача seed, сертифицированные устройства, розыгрыши с жёстким аудитом

Если запомнить совсем коротко, то так.

  • Обычный PRNG — «случайность, которую можно воспроизвести»
  • CSPRNG — «случайность, которую можно воспроизвести, но снаружи её трудно предсказать»
  • Истинно случайные числа — «случайность, которая берёт энтропию из физических явлений»

4. Что такое псевдослучайные числа

4.1. Одной фразой

Псевдослучайные числа — это последовательность, которая «выглядит случайной»: её считают, обновляя внутреннее состояние.

Тот же seed, тот же алгоритм, то же число выборок — та же последовательность значений. Это легко принять за недостаток, но в симуляциях, тестах и отладке это как раз большое преимущество.

Именно потому, что последовательность воспроизводится, возможны сценарии вроде «на этом seed проявляется ошибка» или «хочу ещё раз сравнить со вчерашним результатом».

4.2. Обычный PRNG и CSPRNG нужно разводить

Здесь путают чаще всего. «Псевдослучайные = поддельные = нельзя использовать» — неверно.

NIST SP 800-90A определяет deterministic random bit generator на хеш-функциях и блочных шифрах. То есть ядро случайных чисел для криптографии в значительной части само по себе детерминированный генератор.

Разница не в том, «похоже ли на случайность», а в том, насколько трудно предсказать выход атакующему.

  • Обычный PRNG
    • Быстрый
    • Легко воспроизводится
    • Если утекли внутреннее состояние или seed, выход легко предсказать
  • CSPRNG / DRBG
    • Тоже детерминирован
    • Но спроектирован так, чтобы при неизвестном внутреннем состоянии выход было трудно предсказать
    • Для задач безопасности берут его

Поэтому судить о безопасности только по признаку «псевдослучайные или нет» почти всегда ошибочно. Смотреть нужно, какой именно псевдослучайный генератор.

5. Что такое истинно случайные числа

5.1. Одной фразой

Истинно случайные числа извлекают энтропию из физической неопределённости: теплового шума, джиттера генератора, лавинного шума, квантовых явлений и подобного.

В бытовой речи их называют «настоящими» или «физическими» случайными числами. У NIST ближе термин NRBG: генератор, который постоянно обращается к источнику энтропии и, пока работает исправно, даёт выход с full entropy.

5.2. Физические случайные числа тоже не всегда отдают как есть

Это тоже важно. То, что числа «истинно случайные», не значит, что сырые измерения сразу отдают приложению.

У физических источников есть несколько практических трудностей.

  • Есть смещение
  • Влияют температура, питание, отказы, старение
  • Сырая скорость выхода иногда невысока
  • Без проверки работоспособности сломанный источник легко не заметить

Поэтому NIST SP 800-90B делает упор на принципы проектирования источника энтропии, понятие min-entropy, validation test и health testing. А реализация в целом чаще строится по схеме entropy source + DRBG из NIST SP 800-90C.

В итоге «истинно случайные числа» — это не таинственное сырьё, а связка физического источника, его оценки, мониторинга и постобработки.

6. В чём именно разница

Различие видов случайных чисел нельзя свести к вопросу «выглядит ли это случайным». Удобно смотреть хотя бы по четырём осям.

6.1. Источник

  • Псевдослучайные числа: алгоритм и внутреннее состояние
  • Истинно случайные числа: физический источник энтропии

Это самое фундаментальное различие.

6.2. Воспроизводимость

  • Псевдослучайные числа: при том же seed воспроизводятся
  • Истинно случайные числа: если снять значения ещё раз в тех же условиях, та же последовательность почти наверняка не повторится

Воспроизводимость в тестах — сила, в розыгрыше может оказаться слабостью.

6.3. Предсказуемость

  • Обычный PRNG: если прочитать seed или внутреннее состояние, дальнейшее в значительной мере известно
  • CSPRNG: при защищённом внутреннем состоянии спроектирован так, чтобы его было трудно предсказывать
  • Истинно случайные числа: если физический источник исправен, предсказать трудно, но отказ датчика и ошибка проектирования — отдельная проблема

Для безопасности эта ось важнее всего. Значение имеет не то, насколько «разбросан» выход на вид, а то, можно ли угадать следующее значение.

6.4. Скорость и эксплуатация

  • Псевдослучайные числа: быстро, стабильно, проще реализовать
  • Истинно случайные числа: нужны сбор энтропии и мониторинг, есть ограничения по скорости и стоимости реализации

Поэтому в рабочей системе реалистичный выбор — не «только истинные» и не «только псевдослучайные», а CSPRNG, которому seed задала физическая энтропия.

7. Как их различить

7.1. По одному выходу в принципе не отличить

Это главный ответ. По конечной выходной последовательности нельзя утверждать: «это истинно случайные числа».

Причина простая: детерминированную программу, которая вернёт в точности ту же конечную последовательность, что вы только что наблюдали, всегда можно написать. В пределе достаточно зашить эту последовательность в массив или ROM и отдавать по порядку.

Поэтому «на вид естественно — значит, настоящее» не работает. NIST SP 800-22 тоже говорит, что статистическое тестирование — только первый шаг и само по себе никак не доказывает пригодность генератора.

С другой стороны, хороший CSPRNG как раз проектируют так, чтобы по одному выходу его было очень трудно отличить от истинной случайности. Здесь «неотличимость» — скорее сама цель проектирования.

7.2. Сначала смотреть устройство генератора

Ответ в 7.1 был «по выходу нельзя». Тогда на что смотреть? Не на выход, а на сам генератор.

Две последовательности могут одинаково выглядеть равномерными: одна посчитана из seed, другая снята с физического явления. Сколько ни смотри на сами числа, это различие наружу не выйдет. Оно видно, только когда проверяешь, как их делают. То есть различение — это не наблюдение, а проверка устройства.

Проверять нужно вот эти пять пунктов.

  • Какой алгоритм генерации
    • Простой PRNG или DRBG / CSPRNG?
  • Откуда берётся seed
    • Фиксированный seed, время, PID?
    • Или источник энтропии ОС?
  • Делается ли reseed
    • Seed задали один раз при запуске и больше не трогают?
    • Или его подают повторно во время работы?
  • Есть ли проверка источника энтропии
    • Оценка min-entropy
    • Health test
    • Обнаружение отказов
  • Какой API используется
    • Своя реализация?
    • Стандартный API ОС / языка?

Все пять до конца разбирать не обязательно. Идите сверху вниз и останавливайтесь, как только ответ ясен. На практике почти всегда хватает двух крайних: «какой алгоритм генерации» и «какой API».

С этой точки зрения значительную часть случаев удаётся различить.

  • «При фиксированном seed каждый раз одна и та же последовательность» → псевдослучайные числа
  • «Есть физический источник энтропии, предполагаются validation / health test» → конструкция с источником истинной случайности
  • «Вызывается secure RNG API ОС» → чаще всего гибрид физическая энтропия + CSPRNG

7.3. Затем статистическими тестами искать явные дефекты

Статистические тесты не лишние — наоборот, они важны. Но их роль ближе к «найти дефект», чем к «доказать».

Обычно смотрят такие аспекты.

  • Смещение между 0 и 1
  • Смещение серий (run)
  • Периодичность
  • Корреляция
  • Приближённая энтропия
  • Линейная сложность

Часто ссылаются на NIST SP 800-22, а в Японии — на минимальный набор тестов случайности CRYPTREC. Они хорошо отвечают на вопрос, «нет ли в этой последовательности странного смещения или структуры».

Но прохождение этих тестов не означает «истинно случайные числа». Хорошо сделанный CSPRNG их обычно проходит, а физический источник, наоборот, может провалиться из-за смещения датчика или отказа.

Положение тестирования примерно такое.

  • Прошёл: пока явного дефекта не видно
  • Провалился: скорее всего, что-то не так
  • «Значит, доказано, что это настоящее»: этого сказать нельзя

7.4. Для задач безопасности смотреть глазами атакующего

Для токена сброса пароля, session ID, nonce, генерации ключей вопроса «настоящее ли это» недостаточно.

По-настоящему важно, может ли атакующий предсказать следующее значение.

Например:

  • seed задаётся только текущим временем
  • просто подмешиваются PID или порядковый номер
  • своя реализация, качество seed не оценивают
  • API семейства random берут для задач безопасности

Ничего из этого не закрывается тем, что «на вид похоже на случайность».

Разберём, что происходит, на одном примере.

Пусть токен сброса пароля строит PRNG с seed из текущего времени. Атакующий сначала запрашивает сброс для своего аккаунта и получает один токен. Зная токен и момент запроса, он сужает кандидатов seed до нескольких секунд вокруг этого момента. Дальше для каждого кандидата прогоняет тот же алгоритм и перебирает значения, которые генератор выдал бы как токен жертвы.

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

То же относится к session ID, коду приглашения, одноразовому паролю, имени временного файла в открытой папке. Всё, про что нельзя уверенно сказать «если угадают, большого вреда не будет», нужно строить на стороне secure RNG.

IPA тоже советует знать API, связанные с безопасностью, и существующие библиотеки и не писать свою реализацию наобум. В Python явно указано предпочитать модуль secrets, а не random. В Java эту роль играет SecureRandom.

В итоге для безопасности важнее не «псевдослучайные или истинные», а «взяты ли безопасные seed / entropy и безопасный API».

8. Что брать под какую задачу

Задача Что подходит Почему
Симуляция, метод Монте-Карло, игровая логика Обычный PRNG Быстро, воспроизводится через seed
Повтор тестов, повтор ошибки Обычный PRNG Можно повторить те же входные данные
Ключи, токены, nonce, session ID CSPRNG / secure RNG API ОС Нужна трудность предсказания
Подача seed, розыгрыши с жёстким аудитом и подотчётностью Конструкция с физическим источником или проверяемый механизм Важны физическая энтропия и следы аудита
«Безопасная случайность» в обычной разработке приложений Стандартный secure RNG ОС / языка Ошибиться сложнее, чем со своей реализацией

На уровне реализации спокойный выбор такой.

  • Нативный Windows: BCryptGenRandom
  • .NET: System.Security.Cryptography.RandomNumberGenerator
  • Linux: getrandom()
  • Python: secrets
  • Java: SecureRandom

Про BCryptGenRandom в Windows Microsoft Learn описывает, что провайдер по умолчанию соответствует CTR_DRBG из NIST SP800-90. getrandom() в Linux тоже документирован как источник случайных байтов, пригодных для cryptographic purposes. RandomNumberGenerator в .NET, secrets в Python и SecureRandom в Java — API, рассчитанные на криптографическое применение.

8.1. Минимальные примеры

Одного списка мало, чтобы начать писать код, поэтому ниже — два типичных варианта в рабочем виде. Общее у обоих: seed вы не задаёте сами. Его добывает API.

В C# (.NET 8) берут статические методы System.Security.Cryptography.RandomNumberGenerator.

using System;
using System.Security.Cryptography;

// Целое от 0 включительно до 100 исключительно, без смещения
int n = RandomNumberGenerator.GetInt32(0, 100);

// 32 байта для токена, затем строка, которую можно вставить в URL
byte[] bytes = RandomNumberGenerator.GetBytes(32);
string token = Convert.ToBase64String(bytes)
    .Replace('+', '-')
    .Replace('/', '_')
    .TrimEnd('=');

GetInt32 нужен потому, что если просто взять байты и остаток от деления на диапазон, крайние значения выпадают чаще. Когда нужен диапазон, не берите остаток сами — используйте этот метод.

В Python (3.6 и новее) это модуль secrets.

import secrets

# Безопасный токен, который можно вставить в URL
token = secrets.token_urlsafe(32)

# Целое от 0 включительно до 100 исключительно
n = secrets.randbelow(100)

Для контраста — так для той же задачи писать нельзя.

import random

# NG: random — PRNG для воспроизводимости, не для задач безопасности
token = "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=32))

И random, и secrets возвращают строки, которые на вид достаточно разбросаны. Разница не в выходе, а в том, откуда взяты случайные числа. random — PRNG на Mersenne Twister с упором на воспроизводимость; официальная документация Python тоже указывает для управления секретами использовать secrets.

9. Частые заблуждения

9.1. Если генератор прошёл статистические тесты, значит, это истинно случайные числа

Нет. Из этого следует лишь, что «явного смещения не видно».

9.2. Если это истинно случайные числа, они всегда безопасны

Нет. Отказ физического источника, смещение, ошибка реализации, отсутствие health test — всё это ломает качество.

9.3. Псевдослучайные числа всегда опасны

Нет. CSPRNG / DRBG как раз ядро практических безопасных API случайных чисел.

9.4. Для задач безопасности нужно напрямую использовать только сырые физические случайные числа

Не обязательно. На практике обычное решение — сочетание физического источника энтропии и CSPRNG.

9.5. random или Math.random() и так достаточно разбросаны, значит, их можно брать для token

Это другая задача. Разброс на вид и трудность предсказания для атакующего — разные вещи.

10. Таблица решений, когда неясно

Порядок рассуждений, если неясно, такой.

  1. Нужно ли воспроизводить один и тот же результат?
    • Да → обычный PRNG
    • Нет → дальше
  2. Будет ли проблемой, если атакующий предскажет значение?
    • Да → стандартный secure RNG ОС / языка
    • Нет → выбирать по требованиям к качеству и скорости
  3. Нужны ли подотчётность или аудит самого источника случайности?
    • Да → рассмотреть физический источник или сертифицированный сервис
  4. Хочется реализовать самостоятельно?
    • Желание понятное, но случайные числа легко реализовать неправильно — сначала берите стандартный API

В таком порядке решение находится гораздо быстрее, чем при выборе только между «псевдо» и «настоящее».

11. Итог

Если сказать о разнице псевдослучайных и истинно случайных чисел максимально грубо, но так, чтобы это было полезно на практике, получится следующее.

  • Псевдослучайные числа строят вычислением
  • Истинно случайные числа берут энтропию из физических явлений
  • Но в рабочих безопасных API случайных чисел главную роль играет промежуточный вариант — entropy source + CSPRNG

Иначе говоря, смотреть нужно не на вид, а на устройство.

  • По одному выходу нельзя утверждать, что это истинные случайные числа
  • Статистические тесты помогают находить дефекты, но не служат доказательством
  • В безопасности главное — «можно ли это предсказать»
  • Если нужна воспроизводимость — берите PRNG, если нужна трудность предсказания — стандартный secure RNG ОС / языка

При таком взгляде можно выйти из грубого противопоставления «псевдослучайные числа — это подделка?».

12. Справочные материалы

  1. NIST SP 800-90A Rev. 1: Recommendation for Random Number Generation Using Deterministic Random Bit Generators Базовый документ о deterministic random bit generator.

  2. NIST SP 800-90B: Recommendation for the Entropy Sources Used for Random Bit Generation Систематизирует подход к entropy source, validation и health testing.

  3. NIST SP 800-90C: Recommendation for Random Bit Generator (RBG) Constructions Систематизирует конструкцию entropy source + DRBG.

  4. NIST SP 800-22 Rev. 1a: A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications Объясняет роль статистического тестирования. Важно, что тестирование — первый шаг, а не доказательство.

  5. NIST Glossary: Non-deterministic Random Bit Generator (NRBG) Полезно, чтобы сверить термин NIST, ближайший к true random.

  6. RFC 4086: Randomness Requirements for Security Систематизирует оговорки про случайные числа и entropy source для задач безопасности.

  7. Microsoft Learn: BCryptGenRandom function Описывает secure RNG API Windows и CTR_DRBG провайдера по умолчанию.

  8. Linux man page: getrandom(2) API случайных чисел Linux, пригодный для cryptographic purposes.

  9. Microsoft Learn: класс RandomNumberGenerator Криптографически стойкий RNG API .NET.

  10. Python documentation: secrets — Generate secure random numbers for managing secrets Основы работы со случайными числами для задач безопасности в Python.

  11. Oracle Java Documentation: SecureRandom Сводка secure RNG в Java и подхода к seed / entropy.

  12. IPA: Глава 3, раздел 3. Использование устойчивых к взлому криптографических технологий и псевдослучайных чисел Важность seed, тестирования и оговорки по использованию API (на японском языке).

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Политика аудита безопасности Windows и расследование журнала событий на практике — как стать ИТ-службой, которая умеет читать 4625

Практическое руководство, чтобы ответить на просьбу «посмотрите журналы неудачных входов». Разбирает связь базовой и расширенной политики...

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Технические консультации и ревью дизайна

Тема хорошо ложится на техническую консультацию и ревью архитектуры, если нужно разделить воспроизводимость для симуляций и непредсказуемость для безопасности и начать с выбора API случайных чисел и проектирования seed.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Чем псевдослучайные числа отличаются от истинно случайных?
Псевдослучайные числа (PRNG) — это последовательность, которую алгоритм детерминированно строит из seed и внутреннего состояния: при тех же условиях получается та же последовательность. Истинно случайные числа берут энтропию из физического явления — теплового шума, джиттера генератора и подобного; если снять значения ещё раз в тех же условиях, та же последовательность почти наверняка не повторится. На практике, однако, безопасный API случайных чисел чаще всего не отдаёт сырые физические значения: это гибрид, CSPRNG / DRBG, которому seed задаёт физический источник энтропии.
Можно ли по выходу отличить псевдослучайные числа от истинно случайных?
По конечной выходной последовательности нельзя утверждать, что числа истинно случайные. Детерминированную программу, которая вернёт в точности ту же последовательность, что вы наблюдали, всегда можно написать. При различении важнее не вид выхода, а устройство генератора: какой алгоритм, откуда берётся seed, делается ли reseed, есть ли проверка источника энтропии (оценка min-entropy, health test) и какой API вызывается.
Если генератор проходит статистические тесты, можно ли считать его истинно случайным?
Нет. Статистические тесты ближе к поиску дефектов, чем к доказательству. NIST SP 800-22 прямо говорит: тестирование — только первый шаг и само по себе никак не доказывает пригодность генератора. Хорошо сделанный CSPRNG такие тесты обычно проходит, а физический источник, наоборот, может провалиться из-за смещения датчика или отказа. Прошёл — явного дефекта пока не видно; провалился — скорее всего, что-то не так.
Какой API случайных чисел использовать для задач безопасности?
Для ключей, токенов, nonce и session ID базовое правило — безопасный API, который даёт ОС или язык. Конкретно: нативный Windows — BCryptGenRandom, .NET — System.Security.Cryptography.RandomNumberGenerator, Linux — getrandom(), Python — модуль secrets, Java — SecureRandom. Не стоит писать свою реализацию с seed из текущего времени или PID и не стоит брать API семейства random для задач безопасности.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог