KJUR.crypto.Cipher — это высокоуровневая обёртка в библиотеке jsrsasign, предназначенная для симметричного шифрования и расшифрования данных. Класс скрывает сложность работы с алгоритмами блочного шифрования, режимами работы и производными ключами, предоставляя единый интерфейс для криптографических операций.
Основная идея заключается в том, чтобы разработчик мог оперировать строками и ключевыми фразами, не погружаясь в детали низкоуровневого криптографического API.
Класс ориентирован на сценарии:
KJUR.crypto.Cipher работает поверх набора симметричных алгоритмов, где один и тот же ключ используется для шифрования и расшифрования.
Процесс включает несколько этапов:
Преобразование пароля в криптографический ключ Используются функции деривации ключа (обычно PBKDF2 или OpenSSL EVP_BytesToKey-подобный механизм).
Выбор алгоритма шифрования Например AES-128-CBC или AES-256-CBC.
Генерация случайного IV (инициализационного вектора)
Шифрование данных в бинарном режиме
Кодирование результата (обычно Base64 или hex)
В зависимости от конфигурации jsrsasign доступны следующие классы алгоритмов:
На практике наиболее часто используется AES-256-CBC как баланс безопасности и производительности.
KJUR.crypto.Cipher работает преимущественно со строками.
Вход:
Выход:
Результат обычно содержит:
Эти компоненты объединяются в один пакет.
Типичный метод шифрования:
KJUR.crypto.Cipher.encrypt(plaintext, password, options)
Параметры:
plaintext — исходный текстpassword — пароль или ключевая фразаoptions — объект конфигурацииПример опций:
alg — алгоритм (например “AES-256-CBC”)iter — количество итераций PBKDF2iv — фиксированный IV (не рекомендуется)out — формат вывода (“base64” или “hex”)KJUR.crypto.Cipher.decrypt(ciphertext, password, options)
Параметры аналогичны шифрованию, за исключением того, что
ciphertext — это ранее зашифрованная строка.
Шифрование строки:
const plain = "Секретное сообщение";
const pass = "strong-password";
const encrypted = KJUR.crypto.Cipher.encrypt(
plain,
pass,
{ alg: "AES-256-CBC" }
);
Расшифрование:
const decrypted = KJUR.crypto.Cipher.decrypt(
encrypted,
pass,
{ alg: "AES-256-CBC" }
);
Cipher в jsrsasign опирается на блочные режимы, где ключевые параметры:
Критически важный момент — даже при одинаковом тексте результат шифрования будет различаться из-за случайного IV.
Пароль напрямую не используется как ключ. Он проходит через функцию деривации:
Пример логики:
password + salt → PBKDF2 → key + iv
Это делает невозможным простое перебирание пароля без затрат вычислений.
KJUR.crypto.Cipher может генерировать данные, совместимые с OpenSSL форматом:
Это позволяет обмениваться данными между JavaScript и системными утилитами OpenSSL.
Типичные ситуации, приводящие к ошибкам:
В случае ошибки дешифрования возвращается исключение или пустой результат (в зависимости от конфигурации).
Класс предоставляет удобный интерфейс, но безопасность зависит от правильного использования:
Слабые конфигурации приводят к уязвимостям даже при использовании корректной библиотеки.
Шифрование локального хранилища:
localStorage.setItem(
"data",
KJUR.crypto.Cipher.encrypt(JSON.stringify(obj), password)
);
Защищённая передача данных:
const payload = KJUR.crypto.Cipher.encrypt(message, sessionKey);
socket.send(payload);
Хранение конфигураций:
const config = KJUR.crypto.Cipher.decrypt(encryptedConfig, masterPassword);
В браузере Cipher использует встроенные криптографические реализации jsrsasign без доступа к системным API.
В Node.js поведение аналогично, но при сборке с поддержкой Node Crypto возможно ускорение операций.
KJUR.crypto.Cipher часто используется совместно с:
В гибридных схемах Cipher используется для шифрования данных, а асимметричная криптография — для передачи ключей.
Внутри Cipher формирует структуру:
Эти части сериализуются в бинарную строку и затем кодируются.
Некоторые реализации позволяют управлять:
Пример расширенной конфигурации:
{
alg: "AES-256-CBC",
iter: 2048,
out: "base64"
}
Cipher часто применяется для сериализации структур:
const encrypted = KJUR.crypto.Cipher.encrypt(
JSON.stringify(data),
password
);
При расшифровании необходимо восстанавливать структуру:
const obj = JSON.parse(
KJUR.crypto.Cipher.decrypt(encrypted, password)
);