Принципы безопасного проектирования, заложенные в библиотеку

Архитектура библиотеки SJCL основана на принципе минимизации поверхности атаки. Реализуется только необходимый набор алгоритмов и примитивов, прошедших криптографическую проверку: AES, SHA-256, HMAC, PBKDF2, ECC. Отсутствуют экспериментальные или устаревшие алгоритмы, что исключает использование небезопасных конструкций на уровне API.

Модель угроз предполагает наличие активного злоумышленника, способного:

  • перехватывать трафик,
  • модифицировать данные,
  • анализировать побочные каналы.

В результате все ключевые операции ориентированы на устойчивость к таким атакам, включая контроль целостности и защиту от повторного использования параметров.


Неизменяемость и чистота данных

SJCL активно использует неизменяемые структуры данных, особенно в представлении битовых массивов (bitArray). Это предотвращает:

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

Каждая операция возвращает новый результат, вместо изменения исходного состояния. Такой подход снижает вероятность логических ошибок и атак, связанных с состоянием памяти.


Явное управление криптографическими параметрами

Библиотека избегает “магических” значений и скрытых параметров. Все критические элементы должны быть заданы явно:

  • соль (salt),
  • число итераций,
  • IV (initialization vector),
  • длина ключа.

Пример:

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

Отсутствие значений по умолчанию в чувствительных местах заставляет разработчика принимать осознанные решения, что соответствует принципу secure-by-design.


Защита от неправильного использования API

SJCL проектировалась с учетом того, что разработчик может не быть экспертом в криптографии. Поэтому:

  • высокоуровневые функции скрывают сложность,
  • небезопасные комбинации параметров затруднены,
  • используется строгая типизация структур (например, bitArray).

Пример: функция sjcl.encrypt автоматически:

  • генерирует IV,
  • применяет аутентифицированное шифрование,
  • сериализует результат.

Это снижает риск ошибок вроде:

  • повторного IV,
  • отсутствия MAC,
  • неправильной кодировки.

Аутентифицированное шифрование по умолчанию

Одним из ключевых принципов является обязательная проверка целостности данных. SJCL использует режимы шифрования, обеспечивающие аутентификацию, такие как CCM.

Это означает:

  • шифрование и MAC выполняются совместно,
  • подделка данных обнаруживается до расшифрования,
  • защита от атак типа padding oracle.

Пример:

sjcl.encrypt(password, data);

Внутри происходит:

  • генерация ключа,
  • шифрование,
  • добавление MAC.

Безопасная работа с энтропией

Генерация случайных чисел реализована через модуль sjcl.random, который:

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

Принципы:

  • нельзя получить криптографически слабый случайный набор,
  • система требует “разогрева” перед использованием,
  • присутствует оценка качества энтропии.

Постоянное время выполнения (constant-time)

Для критичных операций (например, сравнение MAC) применяются алгоритмы, работающие за постоянное время. Это предотвращает атаки по времени выполнения:

sjcl.bitArray.equal(a, b);

Такая реализация исключает:

  • утечки через разницу времени,
  • возможность поэтапного угадывания значений.

Разделение уровней абстракции

SJCL четко разделяет уровни:

  1. Низкоуровневые примитивы (AES, SHA-256)
  2. Средний уровень (HMAC, PBKDF2)
  3. Высокоуровневые API (encrypt, decrypt)

Это позволяет:

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

Безопасная сериализация данных

SJCL использует собственный JSON-формат для хранения зашифрованных данных. Он включает:

  • ciphertext,
  • salt,
  • IV,
  • параметры алгоритма.

Пример:

{
  "iv": "...",
  "v": 1,
  "iter": 1000,
  "ks": 128,
  "ts": 64,
  "mode": "ccm",
  "adata": "",
  "cipher": "aes",
  "salt": "...",
  "ct": "..."
}

Преимущества:

  • самодостаточность данных,
  • переносимость,
  • невозможность “забыть” параметры расшифрования.

Принцип fail-safe

При любой ошибке:

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

Пример:

try {
  sjcl.decrypt(password, data);
} catch (e) {
  // ошибка целостности или ключа
}

Это исключает:

  • использование поврежденных данных,
  • продолжение работы в небезопасном состоянии.

Отсутствие зависимости от среды выполнения

SJCL написана на чистом JavaScript и не зависит от:

  • WebCrypto API,
  • Node.js crypto,
  • внешних библиотек.

Это обеспечивает:

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

Контроль длины ключей и параметров

Все алгоритмы строго проверяют:

  • допустимые длины ключей,
  • корректность параметров,
  • соответствие стандартам.

Попытка использовать:

  • короткий ключ,
  • некорректный IV,
  • неподдерживаемый режим

приводит к ошибке.


Явное кодирование и преобразование данных

SJCL не скрывает преобразования между форматами:

  • строка → битовый массив,
  • битовый массив → Base64,
  • hex и UTF-8.

Пример:

sjcl.codec.utf8String.toBits("text");
sjcl.codec.base64.fromBits(bits);

Это предотвращает:

  • ошибки кодировки,
  • несовместимость данных,
  • неоднозначные интерпретации.

Консервативный выбор алгоритмов

Используются только проверенные временем стандарты:

  • AES (симметричное шифрование),
  • SHA-256 (хэширование),
  • HMAC (аутентификация),
  • PBKDF2 (деривация ключей),
  • ECC (асимметричная криптография).

Отсутствуют:

  • MD5,
  • SHA-1,
  • самодельные алгоритмы.

Защита от повторного использования IV

IV генерируется автоматически и имеет достаточную длину. Повторное использование:

  • не допускается на уровне API,
  • невозможно при стандартном использовании.

Это критично для режимов вроде CCM и GCM, где повтор IV приводит к компрометации данных.


Предсказуемость и прозрачность

Вся библиотека:

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

Это позволяет:

  • проводить аудит,
  • проверять корректность реализации,
  • использовать в критичных системах.

Ограничение области ответственности

SJCL не пытается решать задачи:

  • управления ключами,
  • безопасного хранения,
  • сетевой безопасности.

Она предоставляет только криптографические примитивы. Это снижает сложность и исключает ошибки, связанные с попыткой охватить слишком широкий спектр задач.


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

PBKDF2 реализован с настраиваемым числом итераций:

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

Это позволяет:

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

Принцип “безопасность по умолчанию”

При использовании высокоуровневых функций:

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

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


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

Производительность не ставится выше безопасности. Например:

  • отсутствуют небезопасные кеширования,
  • не используются сокращенные проверки,
  • избегаются агрессивные оптимизации, влияющие на timing.

Локализация криптографической логики

Все операции сосредоточены внутри библиотеки, а не распределены по коду приложения. Это:

  • уменьшает вероятность ошибок,
  • облегчает аудит,
  • упрощает обновление алгоритмов.

Итоговая модель

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

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

Такая архитектура делает библиотеку надежным инструментом для криптографических операций в JavaScript-среде, при условии корректной интеграции в систему.