В современных браузерах криптографическая стойкость генерации случайных чисел зависит от того, насколько разнообразные и непредсказуемые данные удаётся собрать до момента инициализации генератора. SJCL (Stanford Javascript Crypto Library) строит свою систему поверх комбинации системных и пользовательских источников энтропии, формируя пул случайности, который затем используется для инициализации CSPRNG.
Аппаратный уровень в браузере представлен прежде всего интерфейсом:
window.crypto.getRandomValues()
Этот источник считается базовым и наиболее надёжным. Он опирается на системный генератор операционной системы, который обычно использует аппаратные шумы (timing jitter, thermal noise, hardware RNG инструкции процессора). SJCL при наличии этого API может значительно сократить необходимость в дополнительной энтропии, однако полностью не полагается на него во всех конфигурациях и режимах совместимости.
Особенность браузерной среды заключается в том, что доступ к низкоуровневым аппаратным источникам невозможен напрямую. Поэтому библиотека работает через абстракции, комбинируя системные вызовы и событийную активность пользователя.
Основной пласт дополнительной энтропии в SJCL формируется из пользовательских событий. В браузере эти данные обладают высокой степенью непредсказуемости, особенно при первых взаимодействиях с страницей.
Ключевые источники:
Каждое событие преобразуется в числовое представление, включающее координаты, временные метки и состояние устройства ввода. SJCL агрегирует эти данные через механизм:
sjcl.random.addEntropy(data, bits, source)
где:
data — числовое значение или массив параметров
событияbits — оценка энтропии в битахsource — идентификатор источника (например, mouse,
keyboard)Модель оценки энтропии консервативна: даже большое количество событий не приводит к линейному росту доверия, так как события пользователя могут быть частично предсказуемыми (например, равномерное движение мыши или автоматизированные скрипты).
Отдельный класс источников связан с измерением микроскопических отклонений во времени выполнения JavaScript-кода. Браузер не предоставляет гарантированно точного таймера, а такие функции как:
Date.now()performance.now()имеют вариативную точность в зависимости от устройства, нагрузки и политики защиты от side-channel атак.
SJCL использует различия между ожидаемым и фактическим временем выполнения операций, включая:
Эти значения смешиваются в пул энтропии как низкоуровневый шум. Несмотря на низкую индивидуальную ценность одного измерения, в совокупности они формируют устойчивый дополнительный источник случайности.
Центральный компонент системы — объект sjcl.random,
который управляет состоянием пула и состоянием генератора.
Типичная схема инициализации:
sjcl.random.startCollectors();
После вызова библиотека активирует стандартные сборщики:
Каждый сборщик подписывается на события DOM через
addEventListener и начинает накапливать данные в пуле.
Состояние пула энтропии оценивается в битах. Пока не достигнут порог доверия, генерация криптографических ключей блокируется или переводится в режим ожидания.
Наиболее критичный момент — состояние «холодного старта», когда пользователь ещё не взаимодействовал со страницей. В этот период доступная энтропия минимальна.
SJCL решает эту проблему через комбинацию:
window.crypto.getRandomValues() (если доступен)При этом библиотека может находиться в состоянии недостаточной энтропии, возвращая предупреждение через:
sjcl.random.isReady()
или используя уровни готовности:
Внутренне SJCL рассматривает пул как аккумулятор битовой неопределённости. Каждое добавление данных проходит через оценку, основанную на предположении о возможной предсказуемости источника.
Например:
Пул затем используется для генерации ключевого материала через AES-базированный PRNG в режиме счётчика. Состояние генератора периодически перемешивается (rekeying), чтобы исключить деградацию энтропии со временем.
Браузерная среда накладывает фундаментальные ограничения:
Из-за этого SJCL рассматривает любую событийную энтропию как вспомогательную, а не первичную. Основная криптографическая устойчивость должна обеспечиваться системным генератором ОС, когда он доступен.
При формировании итогового пула энтропии SJCL применяет иерархию доверия:
window.crypto.getRandomValues() — максимальный
приоритетТакой подход минимизирует риск того, что предсказуемые пользовательские паттерны смогут повлиять на состояние генератора.
В реальной работе библиотека постоянно обновляет пул:
document.addEventListener("mousemove", function (e) {
sjcl.random.addEntropy([e.clientX, e.clientY], 2, "mouse");
});
Подобные обработчики создают непрерывный поток слабой, но полезной энтропии. В сочетании с таймингом и системными источниками это формирует устойчивую базу для криптографических операций: генерации ключей, nonce и случайных токенов.
Если пул не достигает требуемого уровня, SJCL может:
Это критически важно для предотвращения ситуаций, когда слабая случайность приводит к повторяемым ключам или предсказуемым IV в шифровании.