В основе криптографической стойкости большинства операций в Stanford Javascript Crypto Library (SJCL) лежит генератор псевдослучайных чисел, построенный вокруг Fortuna-архитектуры. Его безопасность критически зависит от качества начальной и поступающей в процессе работы энтропии. Любое ослабление этого компонента автоматически превращает сильные алгоритмы шифрования в уязвимую систему.
SJCL не полагается на аппаратные источники случайности напрямую. Вместо этого библиотека собирает энтропию из поведения среды исполнения Jav * aScript: движения мыши, нажатия клавиш, изменения времени событий, параметры системы и другие косвенные сигналы. Эти данные агрегируются в пул энтропии и используются для инициализации PRNG.
Наиболее критический класс уязвимостей связан с моментом старта приложения, когда пул энтропии ещё не накопил достаточного объёма данных.
Если генератор инициализируется до того, как собран минимально необходимый уровень случайности, состояние PRNG становится предсказуемым. Это особенно актуально для следующих сценариев:
В таких условиях Fortuna может быть инициализирована с частично детерминированным состоянием. Это приводит к тому, что выходные значения генератора становятся воспроизводимыми при повторении условий запуска.
Браузерная среда является особенно уязвимой для проблемы холодного старта энтропии. SJCL зависит от событий DOM, но современные веб-приложения могут:
В таких условиях пул энтропии пополняется медленно или вообще остаётся пустым на момент генерации ключей.
Ещё один опасный сценарий связан с повторным использованием состояния генератора.
Если приложение:
то возникает риск повторяемости последовательностей случайных чисел.
Даже небольшая утечка состояния Fortuna позволяет атакующему восстанавливать дальнейшие значения потока. В криптографическом контексте это эквивалентно частичному раскрытию ключевого материала.
Особенно уязвимыми являются среды без интерактивности:
В таких условиях отсутствуют естественные источники пользовательской активности, и SJCL вынужден полагаться на системное время и ограниченные внутренние источники шума.
Это приводит к следующей проблеме: пространство возможных seed-состояний резко сужается, делая перебор ключей практической угрозой при целенаправленной атаке.
Некоторые реализации приложений ошибочно используют события, которые считаются «случайными», но на практике легко предсказуемы:
Если такие данные составляют значительную часть entropy pool, атакующий может реконструировать исходное состояние генератора.
Особенно опасно использование времени как основного источника энтропии. Даже при высокой точности таймстампа пространство поиска остаётся ограниченным и перебираемым.
Fortuna в SJCL использует пул накопления, который должен агрегировать данные до достижения порога безопасности. Однако ошибки интеграции часто приводят к следующим проблемам:
В результате система может перейти в режим «degraded entropy», где PRNG продолжает работу, но без криптографической гарантии стойкости.
Современные браузеры и контейнеризированные среды могут существенно снижать качество энтропии:
SJCL в таких условиях теряет ключевой источник вариативности — человеческое взаимодействие.
Если PRNG инициализируется одинаковым seed в разных запусках, возникают повторяющиеся последовательности:
Это разрушает даже сильные алгоритмы вроде AES, поскольку их стойкость напрямую зависит от уникальности параметров генерации.
На практике уязвимости чаще всего возникают не в самой SJCL, а в её использовании:
mousemove, keydown,
touchstart;Каждая из этих ошибок снижает энтропийный запас системы до уровня, при котором криптография становится формальной, а не фактической защитой.
При недостаточной случайности возможны следующие классы атак:
Особенно опасно сочетание слабой энтропии с клиентской генерацией ключей, где атакующий может наблюдать несколько последовательных значений генератора.
Архитектура SJCL делает её чувствительной не к криптографическим алгоритмам, а к качеству внешней среды. Любое снижение разнообразия входных данных приводит к деградации всей системы безопасности.
Основной источник проблем — несоответствие между теоретической моделью энтропии и реальной веб-средой, где взаимодействие пользователя может отсутствовать или быть минимальным.