Отличие от псевдослучайных генераторов

Псевдослучайные генераторы (PRNG) в JavaScript, прежде всего Math.random(), строятся на детерминированных алгоритмах. Их поведение полностью определяется внутренним состоянием генератора, которое обновляется при каждом вызове функции. Несмотря на внешнюю «случайность» последовательности значений, при наличии начального состояния или возможности его восстановления последовательность может быть воспроизведена.

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


Ограничения псевдослучайных генераторов

PRNG в стандартной библиотеке JavaScript проектировался для задач моделирования, визуализации, тестирования и прочих некритичных сценариев. Основные ограничения:

  • отсутствие гарантированной непредсказуемости
  • возможная повторяемость последовательностей
  • зависимость от алгоритма реализации движка JavaScript
  • отсутствие контроля над источником энтропии

Даже современные реализации Math.random() используют улучшенные алгоритмы (например, xorshift, Mersenne Twister-подобные подходы в исторических реализациях), но они не предназначены для противостояния анализу состояния.


Криптографическая случайность в Web Crypto API

Web Crypto API предоставляет механизм генерации случайных значений через:

crypto.getRandomValues(typedArray)

Этот метод использует криптографически стойкий генератор случайных чисел (CSPRNG), встроенный в операционную систему или криптографический слой браузера. В отличие от PRNG, его выходные данные должны быть:

  • непредсказуемыми
  • статистически равномерными
  • устойчивыми к восстановлению состояния

Источник энтропии и архитектура CSPRNG

CSPRNG опирается на реальные источники энтропии системы:

  • шум аппаратных событий (движение мыши, тайминги прерываний)
  • аппаратные генераторы случайных чисел (TRNG, DRBG в CPU)
  • системные события (диск, сеть, таймеры высокой точности)

Далее энтропия проходит через криптографические преобразования (например, хэш-функции или блочные шифры), что исключает возможность восстановления внутреннего состояния.


Отличие моделей генерации

Характеристика PRNG (Math.random) CSPRNG (crypto.getRandomValues)
Предсказуемость возможна практически исключена
Назначение симуляции, UI криптография, безопасность
Источник алгоритм системная энтропия
Восстановление состояния возможно при анализе неосуществимо в нормальной модели
Стойкость к атаке отсутствует криптографическая

Практическая реализация в Web Crypto API

Генерация случайных байтов выполняется через типизированные массивы:

const array = new Uint8Array(16);
crypto.getRandomValues(array);

Каждый байт массива заполняется случайным значением от 0 до 255.

Особенность заключается в том, что API не возвращает число напрямую, а работает только с буферами фиксированного размера. Это снижает риск ошибок, связанных с преобразованием типов и масштабированием диапазонов значений.


Ошибки использования Math.random в криптографических задачах

Использование Math.random() в контексте безопасности приводит к фундаментальным уязвимостям:

  • генерация токенов с возможностью угадывания
  • предсказуемые session ID
  • слабые nonce в криптографических протоколах
  • возможность восстановления последовательности атакующим

Даже при высокой энтропии входных данных Math.random() не предназначен для защиты от анализа состояния генератора.


Поведение в различных средах выполнения

Web Crypto API унифицирован на уровне спецификации, но реализация зависит от платформы:

  • браузеры используют системные CSPRNG (Windows CNG, Linux /dev/urandom, macOS SecRandom)
  • изоляция контекста предотвращает влияние JavaScript-уровня на источник энтропии
  • Node.js использует аналогичный подход через собственный модуль crypto

При этом Math.random() всегда остаётся частью JavaScript-движка и не имеет доступа к криптографическим источникам системы.


Статистические свойства и проверка качества

CSPRNG в Web Crypto API проходит набор криптографических тестов:

  • тесты равномерности распределения
  • тесты на автокорреляцию
  • спектральные тесты
  • тесты предсказуемости (включая атаки на восстановление состояния)

PRNG может проходить базовые статистические проверки, но проваливать криптографические сценарии анализа.


Производительность и накладные расходы

Генерация через Web Crypto API обычно медленнее, чем Math.random(), поскольку:

  • требует системного вызова
  • использует криптографические преобразования
  • может блокироваться при недостатке энтропии (редко в современных ОС)

Однако эта стоимость оправдана задачами безопасности, где предсказуемость критична.


Контекст применения

Разделение областей применения строго определяется требованиями к устойчивости:

  • Math.random() применяется для визуальных эффектов, симуляций, некритичных расчетов

  • crypto.getRandomValues() применяется для:

    • генерации ключей
    • токенов доступа
    • nonce и IV в шифровании
    • CSRF-защитных значений

Фундаментальная разница моделей

PRNG ориентирован на воспроизводимость и вычислительную эффективность, тогда как CSPRNG ориентирован на непредсказуемость и криптографическую стойкость. Эта разница делает их несовместимыми по области применения, несмотря на внешнее сходство результата — последовательности чисел.