Понятие безопасной случайности и её источники в разных средах

Безопасная случайность в криптографических системах определяется не как «непредсказуемость в бытовом смысле», а как строго формализованное свойство последовательности значений, которое делает невозможным восстановление предыдущих или будущих значений на основе наблюдаемых данных. В контексте криптографии это свойство обеспечивается криптографически стойкими генераторами псевдослучайных чисел (CSPRNG), которые опираются на энтропию операционной системы и аппаратные источники шума.

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

Качественный CSPRNG должен удовлетворять нескольким фундаментальным требованиям:

  • Непредсказуемость: невозможно вывести следующее значение из предыдущих.
  • Обратная стойкость (backtracking resistance): компрометация текущего состояния не позволяет восстановить прошлые значения.
  • Устойчивость к компрометации состояния (prediction resistance): даже частичная утечка состояния не должна давать возможность предсказывать будущие значения после его обновления.

Эти свойства достигаются не математической «истинной случайностью», а комбинацией энтропийных источников и криптографических преобразований (например, AES-CTR DRBG, ChaCha20-based DRBG).

Источники энтропии в операционных системах

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

  • временные характеристики аппаратных событий (диск, сеть, прерывания CPU),
  • шум периферийных устройств,
  • аппаратные генераторы случайных чисел (HRNG / TRNG),
  • состояние планировщика процессов,
  • термальный и электрический шум (в специализированных устройствах).

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


Источники безопасной случайности в Node.js

В Node.js криптографическая случайность предоставляется через модуль crypto, который является тонкой обёрткой над системными механизмами операционной системы и, в современных версиях, может использовать WebCrypto API.

Основные механизмы:

crypto.randomBytes

Функция crypto.randomBytes(size) возвращает буфер криптографически безопасных байтов. Под капотом используется системный CSPRNG:

  • Linux: /dev/urandom или getrandom()
  • Windows: BCryptGenRandom
  • macOS: arc4random или Security Framework

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

WebCrypto в Node.js

Современные версии Node.js предоставляют стандартный WebCrypto API:

  • crypto.webcrypto.getRandomValues
  • crypto.subtle.generateKey

Этот слой унифицирует поведение Node.js и браузера, что особенно важно для библиотек вроде JOSE, рассчитанных на универсальную среду.


Источники безопасной случайности в браузере

В браузерной среде единственным стандартным источником криптографической случайности является WebCrypto API:

crypto.getRandomValues

Метод crypto.getRandomValues(typedArray) заполняет массив случайными значениями, полученными из CSPRNG браузера. Этот механизм:

  • изолирован от JavaScript-движка,
  • реализован на уровне браузерного процесса,
  • использует энтропию ОС,
  • проходит дополнительные проверки безопасности в sandbox-окружении.

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

  • не является криптографически стойким,
  • может иметь предсказуемые seed-состояния,
  • зависит от реализации движка.

Различия источников случайности между средами

Node.js vs Browser

Характеристика Node.js crypto Browser WebCrypto
Источник ОС + ядро ОС + sandbox API
Доступ синхронный API преимущественно async API
Контроль высокий ограниченный
Изоляция средняя высокая

Edge runtimes и serverless среды

В средах вроде Vercel Edge, Cloudflare Workers или Deno ситуация усложняется:

  • доступ к /dev/urandom отсутствует,
  • используется WebCrypto как единственный стандарт,
  • реализация зависит от runtime.

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


Роль безопасной случайности в JOSE

Библиотека jose (JavaScript Object Signing and Encryption) активно использует криптографическую случайность в нескольких критических местах.

Генерация ключей

При создании симметричных или асимметричных ключей:

  • RSA / ECDSA ключи требуют случайных значений при генерации приватных компонентов,
  • симметричные ключи (например, для AES) требуют криптографически стойких байтов.

Функции генерации ключей используют CSPRNG для:

  • выбора случайных простых чисел (RSA),
  • генерации приватного скаляра (ECDSA, EdDSA),
  • формирования секретных ключей (HMAC, AES).

JWE и необходимость случайности

В формате JSON Web Encryption случайность критична:

1. IV (Initialization Vector)

При использовании AES-GCM или AES-CBC:

  • IV должен быть уникальным и непредсказуемым,
  • повтор IV с тем же ключом приводит к полной компрометации безопасности.

В jose IV генерируется через CSPRNG и имеет фиксированную длину (обычно 96 бит для GCM).

2. CEK (Content Encryption Key)

Content Encryption Key — это временный симметричный ключ, используемый для шифрования конкретного сообщения. Он должен быть:

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

Salt и PBKDF2 / HKDF

При derivation ключей используются:

  • salt — случайная добавка к паролю,
  • nonce — дополнительное случайное значение для контекста.

В JOSE salt предотвращает атаки с использованием радужных таблиц и делает ключевую деривацию уникальной даже при одинаковых входных данных.


JWS и ограниченная роль случайности

В JWS (JSON Web Signature) случайность используется реже:

  • генерация ключей (RSA/ECDSA/EdDSA),
  • иногда nonce в расширенных схемах.

Сама подпись детерминирована: одинаковый вход и ключ дают одинаковый результат.


Ошибки использования случайности в криптографических системах

Использование Math.random

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

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

Любое использование в контексте ключей, токенов или nonce приводит к уязвимости.


Повтор IV в AES-GCM

Критическая ошибка:

  • один и тот же IV с одним ключом в AES-GCM разрушает безопасность шифрования,
  • возможна утечка plaintext и восстановление ключевого материала.

Недостаток энтропии при старте системы

В ранней стадии загрузки системы:

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

Современные ОС решают это через:

  • hardware RNG,
  • reseeding механизмов DRBG.

Клонирование состояния генератора

В случае утечки состояния PRNG:

  • возможно предсказание будущих значений,
  • особенно опасно в кастомных или неправильно реализованных генераторах.

Абстракция случайности в jose

Библиотека jose не работает напрямую с низкоуровневыми источниками энтропии. Вместо этого она:

  • использует WebCrypto API как основной интерфейс,
  • делегирует генерацию ключей и случайных байтов платформе,
  • обеспечивает совместимость между Node.js и браузером.

Это позволяет:

  • исключить ошибки реализации CSPRNG,
  • централизовать безопасность на уровне runtime,
  • унифицировать поведение в разных средах исполнения.

Влияние среды исполнения на безопасность

Разные JavaScript-окружения создают разные гарантии:

  • Node.js предоставляет прямой доступ к системным источникам,
  • браузер ограничивает доступ, но изолирует процесс,
  • edge runtimes стандартизируют WebCrypto,
  • старые среды могут не обеспечивать полноценный CSPRNG.

Следствием является необходимость строго избегать:

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

Криптографическая случайность как фундамент JOSE-экосистемы

Без безопасной случайности невозможны:

  • защищённое шифрование JWE,
  • корректная генерация ключей JWS,
  • безопасная деривация ключей,
  • устойчивость токенов к предсказанию и повторному использованию.

Любая слабость в источнике случайности приводит к системному компромиссу, поскольку криптографические протоколы в JOSE предполагают, что случайность является недоступной для предсказания стороной системы.