Ограничения браузерной криптографии

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

  • отсутствие гарантированного доступа к аппаратным генераторам случайных чисел
  • невозможность контролировать планировщик задач и точное время выполнения
  • ограниченный доступ к файловой системе и памяти
  • зависимость от политики безопасности браузера (CSP, CORS, sandboxing)

Библиотека SJCL (Stanford Javascript Crypto Library) разрабатывалась с учётом этих ограничений, однако полностью нивелировать их невозможно.


Ограничения генерации случайных чисел

Криптографическая стойкость напрямую зависит от качества случайных чисел. В браузере источники энтропии ограничены:

Основные проблемы:

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

SJCL использует собственный пул энтропии и комбинирует различные источники:

  • события пользователя (мышь, клавиатура)
  • тайминги выполнения
  • встроенные API (crypto.getRandomValues, если доступен)

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


Производительность криптографических операций

JavaScript — интерпретируемый язык (или JIT-компилируемый), что делает криптографические вычисления значительно медленнее по сравнению с нативными реализациями.

Факторы снижения производительности:

  • отсутствие SIMD-оптимизаций
  • ограниченная работа с памятью
  • влияние сборщика мусора (GC)
  • однопоточность (в большинстве случаев)

Практические последствия:

  • медленная генерация ключей (особенно RSA, ECC)
  • задержки при шифровании больших объёмов данных
  • повышенная нагрузка на CPU устройства

SJCL частично оптимизирована (например, использует битовые массивы вместо строк), но остаётся ограниченной возможностями JavaScript.


Уязвимость к атакам по побочным каналам

Браузерная среда подвержена атакам, которые сложно реализовать в серверной криптографии:

Типы атак:

  • timing attacks (атаки по времени выполнения)
  • cache attacks
  • side-channel через JavaScript API

JavaScript не предоставляет средств для точного контроля времени выполнения, а значит:

  • операции могут выполняться с разной скоростью
  • различия во времени могут раскрывать информацию о ключах

SJCL реализует некоторые защитные меры (например, постоянное время выполнения операций), но:

ограничение: невозможно гарантировать полную защиту из-за особенностей движка JavaScript и браузера.


Ограничения хранения секретных данных

В браузере отсутствует безопасное хранилище уровня операционной системы.

Доступные варианты хранения:

  • localStorage
  • sessionStorage
  • IndexedDB

Все они:

  • доступны JavaScript-коду страницы
  • уязвимы при XSS-атаках
  • не обеспечивают аппаратной защиты

Критическое ограничение: любой выполненный в контексте страницы скрипт может получить доступ к ключам.

SJCL не решает проблему хранения — она лишь предоставляет инструменты для шифрования данных перед сохранением.


Зависимость от безопасности страницы

Безопасность криптографии в браузере напрямую зависит от общей безопасности веб-приложения.

Основные угрозы:

  • XSS (внедрение вредоносного JavaScript)
  • MITM (при отсутствии HTTPS)
  • подмена скриптов (supply chain атаки)

Если злоумышленник получает возможность выполнить код:

  • криптография становится бессмысленной
  • ключи могут быть перехвачены до или после шифрования

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


Ограничения HTTPS и доверенной среды

Даже при использовании HTTPS остаются ограничения:

  • доверие к центрам сертификации (CA)
  • возможность компрометации TLS
  • отсутствие гарантии целостности клиентского кода (если нет Subresource Integrity)

Проблема: SJCL загружается как JavaScript-файл — если он подменён, вся криптография скомпрометирована.


Ограничения API браузера

Не все браузеры одинаково поддерживают криптографические возможности:

Различия:

  • наличие/отсутствие crypto.getRandomValues
  • поддержка Web Crypto API
  • ограничения в старых браузерах

SJCL разработана как кросс-браузерная библиотека, но:

  • в устаревших браузерах используются менее безопасные fallback-механизмы
  • качество криптографии может снижаться

Ограничения работы с ключами

В браузере сложно реализовать полноценное управление ключами:

  • нет защищённого enclave (как в мобильных устройствах)
  • ключи существуют в памяти JavaScript
  • возможна утечка через дамп памяти или инструменты разработчика

Особенность: ключи нельзя “скрыть” от среды выполнения — они всегда доступны интерпретатору.


Ограничения пользовательской среды

Безопасность зависит не только от кода, но и от устройства пользователя:

  • заражённая система (malware)
  • небезопасные расширения браузера
  • устаревший браузер

Даже идеальная реализация SJCL не защищает от:

  • кейлоггеров
  • перехвата DOM
  • внедрения скриптов через расширения

Ограничения криптографических алгоритмов в SJCL

SJCL не реализует полный спектр криптографии:

Поддерживается:

  • AES
  • SHA-256
  • HMAC
  • ECC (ограниченно)

Не поддерживается или ограничено:

  • современные алгоритмы (например, ChaCha20, Ed25519)
  • аппаратное ускорение
  • полноценная работа с сертификатами

Это ограничивает использование библиотеки в современных протоколах.


Ограничения асинхронности и UX

Криптография может блокировать интерфейс:

  • долгие операции выполняются в основном потоке
  • интерфейс “замерзает”
  • ухудшается пользовательский опыт

Возможное решение — Web Workers, но:

  • усложняется архитектура
  • требуется передача данных между потоками

SJCL изначально не ориентирована на многопоточность.


Ограничения доверия к клиенту

Ключевая архитектурная проблема браузерной криптографии:

клиентская сторона не является доверенной

Любые вычисления:

  • могут быть изменены
  • могут быть подделаны
  • не могут быть верифицированы сервером без дополнительных механизмов

Это делает невозможным использование SJCL для:

  • критических операций аутентификации
  • доверенных вычислений
  • защиты от модификации клиентской логики

Ограничения масштабируемости

При увеличении объёма данных:

  • возрастает нагрузка на CPU
  • увеличивается время обработки
  • возможны утечки памяти

JavaScript не подходит для:

  • потокового шифрования больших файлов
  • высоконагруженных криптографических операций

Ограничения интеграции с Web Crypto API

Современные браузеры предоставляют Web Crypto API, который:

  • быстрее
  • безопаснее
  • использует нативные реализации

Однако SJCL:

  • не полностью интегрирована с этим API
  • использует собственные реализации

Это создаёт дилемму:

  • использовать SJCL для совместимости
  • или Web Crypto для безопасности и скорости

Ограничения обновляемости и поддержки

SJCL — относительно старая библиотека:

  • ограниченное развитие
  • отсутствие поддержки новых стандартов
  • потенциальные устаревшие подходы

Использование требует:

  • дополнительного аудита
  • понимания внутренних механизмов
  • осторожности при применении в новых проектах

Ограничения криптографической модели

Браузерная криптография чаще всего используется для:

  • дополнительного уровня защиты
  • шифрования перед отправкой на сервер

Но не для:

  • полной замены серверной криптографии
  • защиты от всех угроз

SJCL работает в рамках этой модели и не предназначена для построения полностью автономной криптографической системы на клиенте.