Аудит использования SJCL в проекте

Проверка корректности интеграции SJCL начинается с анализа того, каким образом библиотека включена в проект и какие именно компоненты криптографического стека используются. SJCL (Stanford Javascript Crypto Library) предоставляет набор примитивов: симметричное шифрование, хеш-функции, генерацию случайных чисел, режимы работы блочных шифров и утилиты кодирования. Ошибки на уровне интеграции почти всегда приводят к компрометации всей криптографической модели, независимо от корректности отдельных алгоритмов.

Первый слой аудита связан с тем, как библиотека попадает в приложение. SJCL может использоваться как:

  • статически подключаемый файл (sjcl.js)
  • модуль через bundler (Webpack, Rollup, Vite)
  • кастомная сборка с отключёнными компонентами

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

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

Особое внимание уделяется параметрам сборки, так как отключение части энтропийных источников или PRNG-расширений снижает криптостойкость.

Анализ используемых криптографических режимов

SJCL поддерживает несколько режимов работы AES, включая CBC и CCM. В аудите проверяется:

  • использование аутентифицированного шифрования (предпочтительно CCM)
  • отсутствие самодельных режимов поверх AES
  • корректность генерации IV (nonce)

Классическая ошибка — использование AES-CBC без MAC, что приводит к отсутствию целостности данных.

Критический момент: IV должен быть уникальным для каждого сообщения. Повтор IV в CBC или CCM разрушает безопасность схемы.

Управление ключами и их жизненный цикл

Ключевая зона аудита — обработка криптографических ключей. В SJCL ключи часто передаются как битовые массивы (sjcl.bitArray), и любые преобразования должны быть строго детерминированными.

Проверяются следующие аспекты:

  • отсутствие хранения ключей в localStorage или sessionStorage без шифрования
  • отсутствие логирования ключевых материалов
  • корректная очистка памяти после использования (ограниченно в JS, но можно минимизировать утечки)
  • отсутствие повторного использования ключей в разных контекстах без изоляции

Отдельно анализируется, не происходит ли сериализация ключей в JSON без защиты.

Источники энтропии и генерация случайных чисел

SJCL использует собственный PRNG, основанный на ARC4 и энтропийном пуле. Аудит включает проверку:

  • достаточности источников энтропии
  • вызовов sjcl.random.addEntropy
  • наличия событий мыши/клавиатуры как источников шумов
  • отсутствия блокирующего ожидания генерации случайных чисел без прогрева пула

Типовая уязвимость — запуск генерации ключей до накопления энтропии, что приводит к предсказуемым результатам PRNG.

Критически важно убедиться, что используется:

sjcl.random.isReady()

или аналогичный механизм ожидания готовности генератора.

Использование PRNG и контроль состояния

PRNG в SJCL должен быть проверен на:

  • отсутствие ручного задания seed в production-коде
  • отсутствие повторного инициализирования генератора
  • корректное состояние после сериализации приложения (например, SPA-переходы)

Недопустимо фиксированное seed-значение, даже в тестовых окружениях, если оно может попасть в production-бандл.

Аудит шифрования и хеширования

В рамках SJCL обычно используются:

  • AES (основной шифр)
  • SHA-256 / SHA-512
  • HMAC
  • PBKDF2

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

  • достаточное количество итераций PBKDF2 (часто недооценённый параметр)
  • отсутствие SHA-1 в новых сценариях
  • корректное использование HMAC вместо ручной склейки hash+key
  • отсутствие кастомных реализаций криптопримитивов поверх SJCL

Пример проблемной конструкции:

var hash = sjcl.hash.sha256.hash(password + salt);

Корректная схема должна использовать PBKDF2:

sjcl.misc.pbkdf2(password, salt, iterations, keySize);

Проверка сериализации данных

SJCL активно использует форматирование битовых массивов. Аудит включает:

  • проверку корректности sjcl.codec
  • отсутствие потерь данных при hex/base64 преобразованиях
  • отсутствие неоднозначных кодировок между клиентом и сервером

Ошибки сериализации часто приводят к невозможности повторного расшифрования данных или к уязвимостям при неявных преобразованиях типов.

Анализ обработки ошибок криптографии

Ошибки расшифрования не должны раскрывать различимые причины. Аудит проверяет:

  • отсутствие детализированных сообщений о причине ошибки (padding oracle-like утечки)
  • унифицированную обработку всех криптографических исключений
  • отсутствие различий во времени обработки при ошибках (timing side-channel)

Проверка утечек через логирование и отладку

Часто критические данные попадают в:

  • console.log
  • error tracking системы
  • debug middleware

Аудит выявляет:

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

Даже временные debug-вставки рассматриваются как потенциальный риск, если они могут попасть в production-сборку.

Побочные каналы и особенности JavaScript-среды

JavaScript-среда накладывает ограничения, которые необходимо учитывать при аудите:

  • отсутствие полного контроля над памятью
  • возможность утечек через closure и глобальные объекты
  • влияние оптимизаций JIT на тайминги операций

Особое внимание уделяется:

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

Пример аудиторского анализа использования SJCL

function encryptData(key, data) {
    var iv = sjcl.random.randomWords(4, 0);
    var cipher = new sjcl.cipher.aes(key);

    return sjcl.mode.ccm.encrypt(cipher, data, iv);
}

Анализ выявляет следующие точки проверки:

  • корректность генерации IV (должен быть уникальным и случайным)
  • использование CCM как authenticated encryption
  • отсутствие повторного использования IV для одного ключа
  • проверка размера nonce относительно спецификации режима

Проверка устойчивости к ошибкам конфигурации

Аудит включает моделирование неправильных сценариев:

  • повторное использование ключей
  • отсутствие энтропии
  • повреждение ciphertext
  • частичная потеря данных при передаче

Система должна корректно обрабатывать все случаи без деградации до небезопасного состояния.

Контроль зависимости от версии SJCL

Версия библиотеки должна быть зафиксирована. Проверяются:

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

Даже незначительные изменения в реализации PRNG или mode cipher могут менять уровень безопасности всей системы.