Безопасная случайность в криптографических системах определяется не как «непредсказуемость в бытовом смысле», а как строго формализованное свойство последовательности значений, которое делает невозможным восстановление предыдущих или будущих значений на основе наблюдаемых данных. В контексте криптографии это свойство обеспечивается криптографически стойкими генераторами псевдослучайных чисел (CSPRNG), которые опираются на энтропию операционной системы и аппаратные источники шума.
Ключевой критерий безопасной случайности заключается в том, что даже при полном знании алгоритма генерации и части выходной последовательности атакующий не может вычислить остальные значения за приемлемое время. Это отличает криптографическую случайность от статистической, используемой в моделировании, играх или визуализации.
Качественный CSPRNG должен удовлетворять нескольким фундаментальным требованиям:
Эти свойства достигаются не математической «истинной случайностью», а комбинацией энтропийных источников и криптографических преобразований (например, AES-CTR DRBG, ChaCha20-based DRBG).
Операционная система является базовым поставщиком случайности для прикладных криптографических библиотек. Основные источники включают:
На уровне ядра ОС формируется пул энтропии, который постоянно «перемешивается» криптографическими функциями и используется для обслуживания запросов приложений.
В Node.js криптографическая случайность предоставляется через модуль
crypto, который является тонкой обёрткой над системными
механизмами операционной системы и, в современных версиях, может
использовать WebCrypto API.
Основные механизмы:
Функция crypto.randomBytes(size) возвращает буфер
криптографически безопасных байтов. Под капотом используется системный
CSPRNG:
/dev/urandom или getrandom()BCryptGenRandomarc4random или Security FrameworkЭта функция является основой для большинства низкоуровневых операций: генерации ключей, nonce, salt.
Современные версии Node.js предоставляют стандартный WebCrypto API:
crypto.webcrypto.getRandomValuescrypto.subtle.generateKeyЭтот слой унифицирует поведение Node.js и браузера, что особенно важно для библиотек вроде JOSE, рассчитанных на универсальную среду.
В браузерной среде единственным стандартным источником криптографической случайности является WebCrypto API:
Метод crypto.getRandomValues(typedArray) заполняет
массив случайными значениями, полученными из CSPRNG браузера. Этот
механизм:
Использование Math.random() в браузере не допускается
для криптографических задач, поскольку он:
| Характеристика | Node.js crypto | Browser WebCrypto |
|---|---|---|
| Источник | ОС + ядро | ОС + sandbox API |
| Доступ | синхронный API | преимущественно async API |
| Контроль | высокий | ограниченный |
| Изоляция | средняя | высокая |
В средах вроде Vercel Edge, Cloudflare Workers или Deno ситуация усложняется:
/dev/urandom отсутствует,Это приводит к важному следствию: код криптографических библиотек должен опираться на WebCrypto как на базовый слой абстракции.
Библиотека jose (JavaScript Object Signing and
Encryption) активно использует криптографическую случайность в
нескольких критических местах.
При создании симметричных или асимметричных ключей:
Функции генерации ключей используют CSPRNG для:
В формате JSON Web Encryption случайность критична:
При использовании AES-GCM или AES-CBC:
В jose IV генерируется через CSPRNG и имеет
фиксированную длину (обычно 96 бит для GCM).
Content Encryption Key — это временный симметричный ключ, используемый для шифрования конкретного сообщения. Он должен быть:
При derivation ключей используются:
В JOSE salt предотвращает атаки с использованием радужных таблиц и делает ключевую деривацию уникальной даже при одинаковых входных данных.
В JWS (JSON Web Signature) случайность используется реже:
Сама подпись детерминирована: одинаковый вход и ключ дают одинаковый результат.
Math.random() не является криптографически
безопасным:
Любое использование в контексте ключей, токенов или nonce приводит к уязвимости.
Критическая ошибка:
В ранней стадии загрузки системы:
Современные ОС решают это через:
В случае утечки состояния PRNG:
Библиотека jose не работает напрямую с низкоуровневыми
источниками энтропии. Вместо этого она:
Это позволяет:
Разные JavaScript-окружения создают разные гарантии:
Следствием является необходимость строго избегать:
Без безопасной случайности невозможны:
Любая слабость в источнике случайности приводит к системному компромиссу, поскольку криптографические протоколы в JOSE предполагают, что случайность является недоступной для предсказания стороной системы.