sjcl.encryptФункция sjcl.encrypt реализует симметричное шифрование
на основе алгоритмов AES с использованием производных ключей из пароля.
В основе лежит концепция password-based encryption (PBE), где строка
шифруется не напрямую ключом, а ключом, полученным из пароля через
функцию деривации (KDF — Key Derivation Function).
Результат работы функции возвращается в виде JSON-структуры, содержащей все необходимые параметры для последующей расшифровки: соль, вектор инициализации, параметры KDF и сам зашифрованный текст.
sjcl.encrypt(password, plaintext)
password — строка пароля, используемая для генерации
ключаplaintext — исходный текст, подлежащий шифрованиюvar encrypted = sjcl.encrypt("myStrongPassword", "Секретное сообщение");
console.log(encrypted);
Результат — JSON-строка:
{
"iv":"Z8c3y2s8k2o=",
"v":1,
"iter":10000,
"ks":128,
"ts":64,
"mode":"ccm",
"adata":"",
"cipher":"aes",
"salt":"x9Y2m1kL0pQ=",
"ct":"3KJf9s0kL2...."
}
Каждое поле имеет строго определённую роль в процессе расшифровки:
ccm)aes)sjcl.encrypt поддерживает расширенную форму вызова:
sjcl.encrypt(password, plaintext, options)
Пример с настройками:
var encrypted = sjcl.encrypt(
"myStrongPassword",
"Конфиденциальный текст",
{
iter: 20000,
salt: "randomSaltValue",
iv: "randomIVValue",
mode: "ccm",
ts: 128,
ks: 256
}
);
optionsИспользование нестандартных значений требует синхронизации параметров при расшифровке.
Функция возвращает строку, а не объект Jav * aScript:
typeof sjcl.encrypt("pass", "text"); // "string"
Для работы с результатом часто требуется парсинг:
var encryptedObj = JSON.parse(encrypted);
При одинаковых входных данных результат шифрования отличается, поскольку:
saltivЭто делает невозможным сравнение зашифрованных строк напрямую.
var password = "securePassword123";
var message = "Данные для защиты";
var encrypted = sjcl.encrypt(password, message);
console.log(encrypted);
При необходимости можно включить дополнительные данные, защищённые целостностью:
var encrypted = sjcl.encrypt(
"password",
"message",
{
adata: "metadata"
}
);
Поле adata включается в расчёт аутентификационного тега
и защищает не только текст, но и метаданные.
Результат sjcl.encrypt часто сохраняется как строка в
базе данных или файле:
localStorage.setItem("secureData", sjcl.encrypt(pass, data));
или
fs.writeFileSync("data.json", sjcl.encrypt(pass, data));
Формат SJCL является самодостаточным и включает всё необходимое для расшифровки:
Это делает возможным перенос зашифрованных данных между средами без дополнительных метаданных.
Несовпадение параметров при расшифровке
Если изменить iter, ks или
mode без синхронизации с дешифратором, восстановление
данных становится невозможным.
Потеря соли или IV
Хотя они обычно встроены в результат, ручное вмешательство в JSON может привести к невозможности дешифрования.
Использование слабого пароля
Безопасность полностью зависит от качества пароля, так как SJCL не хранит ключи отдельно.
Строка, возвращаемая sjcl.encrypt, всегда является
валидным JSON, пригодным для хранения и передачи:
{
"iv": "...",
"salt": "...",
"ct": "...",
"mode": "ccm",
"cipher": "aes"
}
Повторное шифрование уже зашифрованного текста увеличивает размер данных и не даёт дополнительных преимуществ безопасности:
var first = sjcl.encrypt(pass, text);
var second = sjcl.encrypt(pass, first);
sjcl.encrypt применяется в сценариях, где требуется:
Перед шифрованием строка:
sjcl.decryptЛюбой результат sjcl.encrypt предназначен для обратной
обработки:
var decrypted = sjcl.decrypt(password, encrypted);
Структура JSON полностью необходима для восстановления исходного текста, включая:
saltivct