В основе Stanford JavaScript Crypto Library лежит генератор случайных
чисел sjcl.random, реализующий криптографически стойкий
PRNG на базе накопления энтропии из множества источников окружения. Его
поведение строго разделено на этапы: сбор энтропии, оценка её качества и
выдача случайных значений только после достижения порогового уровня
уверенности.
Ключевой принцип заключается в том, что генератор не начинает выдавать криптографические значения до тех пор, пока не будет накоплен достаточный объём энтропии, соответствующий выбранному уровню паранойи (paranoia level).
Внутреннее состояние sjcl.random основано на пуле
энтропии, который пополняется через:
addEntropyКаждый источник имеет вес и качество, которые влияют на итоговую оценку безопасности.
Состояние генератора определяется через:
0 — недостаточно энтропии1 — минимально допустимая готовность2 — полная готовность для криптографических
операцийФорсированная инициализация PRNG в контексте SJCL означает принудительное приведение генератора в состояние готовности в условиях, когда естественные источники энтропии недоступны или недостаточны.
Такие ситуации характерны для:
(paranoia)
Метод возвращает текущий уровень готовности генератора относительно требуемого уровня паранойи.
Пример:
if (!sjcl.random.isReady(2)) {
// энтропии недостаточно
}
sjcl.random.startCollectors();
Этот вызов активирует стандартные сборщики событий, которые начинают накапливать энтропию из окружения браузера.
В headless или серверной среде эффект ограничен, поскольку отсутствуют пользовательские события.
Одним из ключевых механизмов форсирования является прямое внесение энтропии:
sjcl.random.addEntropy([timestamp, processId, counter], 32, "custom");
Параметры:
Этот метод часто используется для первичного “разогрева” генератора.
sjcl.random.getProgress(2);
Возвращает число от 0 до 1, отражающее степень накопленной энтропии относительно выбранного уровня паранойи.
Наиболее распространённый метод первичного насыщения:
sjcl.random.addEntropy(new Date().getTime(), 32, "time");
Этот подход добавляет базовую энтропию, но сам по себе недостаточен для криптографических целей.
sjcl.random.addEntropy([
Date.now(),
Math.random() * 1e9,
performance.now()
], 64, "bootstrap");
Такой подход используется как минимальный буфер, позволяющий вывести генератор из состояния полной блокировки.
В Node.js и аналогичных окружениях отсутствует естественный поток событий, что приводит к следующему поведению:
sjcl.random.isReady() долго остаётся
0Это фундаментальное ограничение архитектуры SJCL, ориентированной на браузер.
В серверных приложениях применяется искусственное насыщение энтропии:
const crypto = require("crypto");
sjcl.random.addEntropy(
crypto.randomBytes(32).toString("hex"),
256,
"node-crypto"
);
Такой подход фактически заменяет отсутствие пользовательских событий системным CSPRNG источником.
Формально SJCL не предусматривает “override” готовности, однако в практических реализациях применяется стратегия ожидания и насыщения:
function ensureReady() {
while (!sjcl.random.isReady(2)) {
sjcl.random.addEntropy(Date.now(), 32, "tick");
}
}
Такой цикл используется только в контролируемых средах, поскольку может приводить к искусственной и некорректной оценке энтропии.
Уровень паранойи определяет минимальный порог энтропии, необходимый для генерации ключей:
Форсированная инициализация часто направлена на достижение уровня
2 в условиях отсутствия естественных источников данных.
До достижения нужного уровня готовности вызов:
sjcl.random.randomWords(n)
может:
Это предотвращает использование слабого состояния PRNG.
Форсированная инициализация разрушает базовую модель доверия SJCL к источникам энтропии:
Особенно критично использование Math.random() как
источника, поскольку он не является криптографически стойким
генератором.
Корректный подход в изолированных средах заключается в комбинировании системных источников:
const crypto = require("crypto");
sjcl.random.addEntropy(crypto.randomBytes(64), 512, "crypto");
sjcl.random.addEntropy(Date.now(), 32, "time");
sjcl.random.startCollectors();
Такой подход позволяет перевести генератор в рабочее состояние без нарушения криптографической модели.
SJCL сохраняет строгое ограничение:
Это делает форсированную инициализацию не просто техническим приёмом, а точкой, определяющей безопасность всей системы.