27. Генерация случайных чисел. — Видео от Мy Рlaylist
Генерация случайных чисел зависит от задачи: для симуляций и игр обычно достаточно быстрого псевдослучайного генератора, а для паролей, токенов и ключей нужен криптографически стойкий источник. Перед выбором проверьте распределение, воспроизводимость, качество начального состояния, устойчивость к предсказанию и корректность интеграции в приложение.
Ключевые практические выводы по генерации случайных чисел
- PRNG подходит для моделирования, тестов и большинства игровых механик, но его последовательность теоретически может быть воспроизведена.
- CSPRNG применяйте для токенов, сброса пароля, сессионных идентификаторов, ключей и других секретов.
- Не используйте время как единственный источник начального состояния для чувствительных данных.
- Проверяйте не только равномерность, но и независимость значений, период и устойчивость к предсказанию.
- Для воспроизводимых экспериментов сохраняйте seed отдельно от результатов и не используйте его для секретов.
Математические основы: распределения, автокорреляция и энтропия
Случайное число определяется не только отсутствием очевидного шаблона. Важно, какое распределение требуется задаче, насколько независимы соседние значения и сколько непредсказуемости содержит начальное состояние.
Распределение и независимость
Равномерный генератор выдаёт значения с примерно одинаковой вероятностью в заданном диапазоне. Нормальное, экспоненциальное и другие распределения получают преобразованием равномерных значений или специальными алгоритмами.
Автокорреляция показывает, связаны ли значения с предыдущими. Заметная зависимость может исказить симуляцию, процедуру выборки или игровую механику.
Энтропия и seed
Энтропия — практическая мера непредсказуемости исходного состояния. В PRNG seed запускает детерминированную последовательность, а в CSPRNG начальное состояние должно поступать из защищённого системного источника или другого доверенного механизма.
Кому подходит подход
Изучение этих свойств нужно разработчикам симуляций, тестовых инструментов, игр и систем безопасности. Не стоит самостоятельно проектировать криптографический генератор, если задачу решает стандартный API операционной системы или библиотеки.
PRNG и CSPRNG: когда и что использовать на практике
Перед реализацией определите, должна ли последовательность воспроизводиться и может ли злоумышленник получить часть выходных данных. От ответа зависит выбор генератора.
Что понадобится
- стандартная библиотека языка с PRNG или CSPRNG;
- понятный диапазон и требуемое распределение;
- тестовый сценарий, фиксирующий seed только для воспроизводимых проверок;
- раздельное хранение тестовых и секретных данных;
- контроль версий библиотек и документации API.
| Задача | Подход | Основной риск |
|---|---|---|
| Симуляция и статистическое моделирование | Современный PRNG | Ошибки распределения или воспроизводимости |
| Игровые эффекты и случайный порядок | PRNG либо системный генератор, если нет требований к секретности | Повторяемость и предсказуемые паттерны |
| Токены, пароли, ключи и nonce | CSPRNG из стандартной библиотеки | Раскрытие или угадывание состояния |
| Аппаратная случайность | TRNG с проверкой и системной интеграцией | Шум, отказ источника и некорректное смешивание |
Короткие примеры API
import secrets
token = secrets.token_urlsafe()
number = secrets.randbelow(100)
В Python модуль secrets предназначен для секретных значений. Для моделирования используйте отдельный PRNG с явно контролируемым seed.
const value = crypto.randomInt(0, 100);
В Node.js криптографический API следует использовать для секретов; обычный Math.random() не является заменой CSPRNG.
Популярные алгоритмы: LCG, Mersenne Twister, Xorshift, PCG и их характеристики
Ниже приведён безопасный порядок выбора. Названия алгоритмов полезны для понимания свойств, но для нового кода предпочтительнее стандартный хорошо поддерживаемый API, чем самостоятельная реализация.
Риски и ограничения перед началом
- Ни один обычный PRNG не следует использовать для создания секретов.
- LCG прост, но имеет предсказуемую структуру и ограничения качества.
- Mersenne Twister исторически популярен, однако не предназначен для криптографии.
- Xorshift и похожие семейства быстры, но требуют внимательного выбора варианта и тестирования.
- PCG обычно предлагает хороший компромисс для моделирования, но также не заменяет CSPRNG.
-
Определите режим работы.
Если результаты должны повторяться при отладке, выберите PRNG и явно задайте seed. Если значения должны быть непредсказуемыми, используйте CSPRNG и не управляйте seed вручную.
-
Выберите алгоритм по назначению.
- LCG — только для простых учебных примеров и неответственных задач.
- Mersenne Twister — для совместимости с существующим моделированием, если криптографическая стойкость не требуется.
- Xorshift — для компактных быстрых сценариев после проверки конкретной реализации.
- PCG — практичный вариант для симуляций, где важны качество и воспроизводимость.
-
Сделайте диапазон без смещения.
Наивное взятие остатка от случайного числа может неравномерно распределить значения, если размер исходного диапазона не делится на размер целевого. Используйте API, который поддерживает равномерный выбор в диапазоне или применяет rejection sampling.
-
Разделите генераторы по назначению.
Для тестов и симуляций создайте отдельный объект PRNG. Для секретов вызывайте системный CSPRNG, не передавая ему seed из пользовательских данных, времени или идентификатора процесса.
-
Зафиксируйте правила воспроизводимости.
Сохраняйте версию библиотеки, параметры генератора и seed тестового сценария. Не публикуйте такой seed, если последовательность связана с реальными секретами или рабочими данными.
-
Проверьте результат на целевой нагрузке.
Запустите статистические тесты, проверьте границы диапазона и сравните поведение при разных seed. Для безопасности дополнительно анализируйте возможность восстановления состояния.
Аппаратные и системные источники случайности: TRNG, шумы и их интеграция
TRNG получает случайность из физических процессов, например электронного шума. На практике приложение обычно обращается к системному генератору, который собирает энтропию, смешивает источники и предоставляет единый интерфейс.
Проверка результата
- Убедитесь, что используется штатный системный или библиотечный API, а не самодельное чтение датчика.
- Проверьте обработку ошибки недоступности источника случайности.
- Не считайте шум микрофона, камеры, сетевых задержек или времени автоматически безопасным источником.
- Не выводите seed, внутреннее состояние и необработанные случайные данные в журналы.
- Проверьте, что после сбоя приложение не переключается незаметно на предсказуемый резервный режим.
- Для аппаратного источника уточните, выполняются ли встроенные проверки отказов и качества.
- Проверьте переносимость поведения на поддерживаемых операционных системах и архитектурах.
Как тестировать генераторы: наборы тестов, метрики и автоматизация проверки качества
Тестирование не доказывает абсолютную случайность, но помогает обнаружить явные дефекты реализации, плохое seed-ирование и нарушение распределения.
Практический порядок проверки
- Проверьте диапазон: значения не должны выходить за заданные границы.
- Сравните частоты значений с ожидаемым распределением.
- Исследуйте пары и последовательности значений, чтобы обнаружить зависимость.
- Повторите тесты с разными seed и отдельно проверьте воспроизводимость фиксированного seed.
- Запустите специализированные статистические наборы тестов для выбранного класса генератора.
Ошибки, которые встречаются чаще всего
- Использование Math.random() или аналогичного PRNG для токенов и паролей.
- Инициализация генератора текущим временем при каждом запросе.
- Применение остатка от случайного числа без проверки равномерности диапазона.
- Повторное использование одного seed для разных независимых процессов.
- Смешивание секретного и тестового генератора в одном глобальном объекте.
- Проверка только среднего значения без анализа последовательностей и хвостов распределения.
- Самостоятельная реализация криптографического алгоритма без независимого аудита.
Безопасность и эксплуатация: защита от предсказуемости, повторное использование и рекомендации
Главный эксплуатационный риск — не название алгоритма, а неправильная граница применения: быстрый PRNG используют для секрета, seed попадает в журнал, либо отказ системного источника скрывается резервной предсказуемой схемой.
Рекомендации по защите
- Для секретов используйте CSPRNG из стандартной библиотеки платформы.
- Ограничьте доступ к результатам, seed, состоянию генератора и диагностическим журналам.
- Не передавайте случайные значения через URL и логи, если они выполняют роль токена.
- Регулярно обновляйте криптографические библиотеки и проверяйте изменения API.
Когда уместны альтернативы
- Детерминированный PRNG: для воспроизводимой симуляции, регрессионных тестов и отладки.
- Системный CSPRNG: для токенов, идентификаторов восстановления, ключей и nonce.
- TRNG: когда требуется физический источник энтропии и система умеет безопасно его интегрировать.
- Готовый криптографический протокол: когда случайность является частью обмена ключами, подписи или защищённого протокола.
Ответы на типичные сомнения и частые ошибки при генерации случайных чисел
Можно ли использовать время как seed?
Для неответственных воспроизводимых сценариев это допустимо, но для секретов время обычно предсказуемо. Криптографические значения должны получать состояние из защищённого системного источника.
Подходит ли Mersenne Twister для паролей?
Нет. Он предназначен для моделирования и не обеспечивает криптографическую защиту от восстановления состояния.
Почему одинаковый seed даёт одинаковую последовательность?
Так устроен детерминированный PRNG: seed задаёт начальное состояние. Это полезно для отладки, но опасно, если seed доступен злоумышленнику и последовательность используется для секретов.
Достаточно ли проверить равномерность?
Нет. Нужно также учитывать независимость значений, качество seed, диапазон, период и возможность предсказания состояния.
Можно ли самостоятельно смешать шум датчиков и получить безопасный генератор?
Без анализа источника, оценки энтропии и корректного экстрактора — нельзя считать такой результат безопасным. Используйте системный механизм, который уже решает эти задачи.
Что выбрать для игры?
Для обычной игровой случайности подойдёт качественный PRNG. Если случайный результат влияет на экономику, награды или защищённое соревнование, применяйте CSPRNG и отдельно проверяйте серверную логику.
Нужно ли тестировать стандартный CSPRNG?
Проверяйте правильность вызова, диапазон, обработку ошибок и отсутствие утечек. Повторно проектировать и доказывать качество системного криптографического источника на уровне приложения обычно не требуется.