Архитектура библиотеки 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 четко разделяет уровни:
- Низкоуровневые примитивы (AES, SHA-256)
- Средний уровень (HMAC, PBKDF2)
- Высокоуровневые 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-среде, при условии корректной
интеграции в систему.