В 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: 10000
}
Типичные значения:
ks задаёт длину ключа в битах.
{
ks: 256
}
Важно: SJCL работает с AES, поэтому ключ должен соответствовать допустимым размерам алгоритма.
ts (tag size) определяет длину тега аутентификации в
битах.
{
ts: 64
}
Тег используется для проверки целостности данных при расшифровке.
Чем больше значение, тем сложнее подделать зашифрованные данные.
SJCL поддерживает несколько режимов блочного шифрования AES.
{
mode: "ccm"
}
adata (additional data) — это данные, которые не
шифруются, но участвуют в проверке целостности.
{
adata: "header-info"
}
Любое изменение adata приведёт к ошибке расшифровки.
По умолчанию используется AES:
{
cipher: "aes"
}
В SJCL AES является основным поддерживаемым симметричным алгоритмом. В большинстве случаев этот параметр не изменяется.
{
v: 1
}
v обозначает версию формата сериализации зашифрованных
данных.
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 не совпадает, расшифровка завершится
ошибкой.
После шифрования данные сохраняются в JSON-структуре:
{
"iv": "base64...",
"v": 1,
"iter": 20000,
"ks": 256,
"ts": 128,
"mode": "ccm",
"adata": "metadata",
"cipher": "aes",
"salt": "base64...",
"ct": "base64..."
}
Каждое поле соответствует параметру конфигурации и является частью криптографического контекста.
В низкоуровневом API SJCL можно отдельно управлять параметрами генерации ключа:
const key = sjcl.misc.pbkdf2("password", "salt", 10000, 256);
Здесь:
10000 — количество итераций256 — размер ключаЭтот механизм напрямую связан с параметром iter в
высокоуровневом API.
Некоторые параметры работают совместно:
ks определяет размер ключа AESiter влияет на устойчивость пароляmode определяет криптографическую схему обработки
блоковts связан с проверкой целостности данныхНеправильные комбинации (например, низкий iter и высокий
уровень безопасности) приводят к компромиссам в стойкости системы.
При проектировании систем на SJCL обычно применяются следующие принципы:
aes-256 (ks: 256)iter не ниже 10000ccm как основной режимts 96 или 128adata для защиты структуры данныхЭти параметры формируют базовый профиль безопасного шифрования в браузерных приложениях.
На практике часто встречаются типичные ошибки:
adata при шифровании и дешифрованииiter, снижающего
стойкостьv вручную без понимания форматаts на целостность данныхКаждый из этих факторов приводит либо к ошибкам расшифровки, либо к снижению безопасности системы.