Настройка параметров через объект конфигурации

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

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


Базовая структура конфигурации

При работе с функциями:

sjcl.encrypt(password, data, options)
sjcl.decrypt(password, data, options)

третий аргумент — это объект конфигурации, который может содержать набор параметров:

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

Каждое поле влияет на отдельный аспект криптографического процесса.


Параметр iter: количество итераций PBKDF2

iter определяет число итераций функции формирования ключа (PBKDF2), которая используется для получения ключа из пароля.

{
  iter: 10000
}

Важные особенности:

  • Чем выше значение, тем медленнее подбор пароля
  • Увеличивает устойчивость к brute-force атакам
  • Требует баланса между безопасностью и производительностью

Типичные значения:

  • 1000–5000: минимальный уровень (устаревающий)
  • 10000–100000: безопасный диапазон для большинства приложений

ks: размер ключа (key size)

ks задаёт длину ключа в битах.

{
  ks: 256
}

Возможные значения:

  • 128 — стандарт AES-128
  • 192 — AES-192
  • 256 — AES-256 (наиболее безопасный вариант)

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


ts: размер аутентификационного тега

ts (tag size) определяет длину тега аутентификации в битах.

{
  ts: 64
}

Роль параметра:

Тег используется для проверки целостности данных при расшифровке.

Типичные значения:

  • 64 — минимально допустимое
  • 96 — баланс безопасности
  • 128 — максимальная стойкость

Чем больше значение, тем сложнее подделать зашифрованные данные.


mode: режим шифрования

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

{
  mode: "ccm"
}

Основные режимы:

CCM (Counter with CBC-MAC)

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

OCB2

  • Быстрый режим с аутентификацией
  • Исторически использовался в SJCL
  • Считается устаревшим в некоторых сценариях из-за патентных ограничений

adata: дополнительные аутентифицированные данные

adata (additional data) — это данные, которые не шифруются, но участвуют в проверке целостности.

{
  adata: "header-info"
}

Примеры использования:

  • метаданные сообщения
  • идентификаторы протоколов
  • версии формата

Любое изменение adata приведёт к ошибке расшифровки.


cipher: выбор алгоритма

По умолчанию используется AES:

{
  cipher: "aes"
}

В SJCL AES является основным поддерживаемым симметричным алгоритмом. В большинстве случаев этот параметр не изменяется.


v: версия формата

{
  v: 1
}

v обозначает версию формата сериализации зашифрованных данных.

Роль параметра:

  • Обеспечивает совместимость между версиями SJCL
  • Позволяет корректно интерпретировать структуру JSON-шифротекста

Пример полной конфигурации шифрования

const encrypted = sjcl.encrypt("password123", "секретные данные", {
  iter: 20000,
  ks: 256,
  ts: 128,
  mode: "ccm",
  adata: "metadata",
  cipher: "aes",
  v: 1
});

Конфигурация при расшифровке

При дешифровании объект конфигурации обычно не передаётся полностью вручную, так как параметры уже содержатся внутри зашифрованного JSON.

const decrypted = sjcl.decrypt("password123", encrypted);

Однако можно переопределять поведение, если требуется строгий контроль:

const decrypted = sjcl.decrypt("password123", encrypted, {
  adata: "metadata"
});

Если adata не совпадает, расшифровка завершится ошибкой.


Внутренний формат конфигурации SJCL

После шифрования данные сохраняются в JSON-структуре:

{
  "iv": "base64...",
  "v": 1,
  "iter": 20000,
  "ks": 256,
  "ts": 128,
  "mode": "ccm",
  "adata": "metadata",
  "cipher": "aes",
  "salt": "base64...",
  "ct": "base64..."
}

Каждое поле соответствует параметру конфигурации и является частью криптографического контекста.


Конфигурация PBKDF2 через sjcl.misc

В низкоуровневом API SJCL можно отдельно управлять параметрами генерации ключа:

const key = sjcl.misc.pbkdf2("password", "salt", 10000, 256);

Здесь:

  • 10000 — количество итераций
  • 256 — размер ключа

Этот механизм напрямую связан с параметром iter в высокоуровневом API.


Взаимосвязь параметров конфигурации

Некоторые параметры работают совместно:

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

Неправильные комбинации (например, низкий iter и высокий уровень безопасности) приводят к компромиссам в стойкости системы.


Практика настройки конфигурации

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

  • использовать aes-256 (ks: 256)
  • устанавливать iter не ниже 10000
  • использовать ccm как основной режим
  • задавать ts 96 или 128
  • использовать adata для защиты структуры данных

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


Ошибки при работе с конфигурацией

На практике часто встречаются типичные ошибки:

  • Несовпадение adata при шифровании и дешифровании
  • Использование слишком малого iter, снижающего стойкость
  • Попытка изменить v вручную без понимания формата
  • Игнорирование влияния ts на целостность данных

Каждый из этих факторов приводит либо к ошибкам расшифровки, либо к снижению безопасности системы.