JWE в экосистеме JSON Web Token представляет собой механизм
шифрования содержимого, обеспечивающий конфиденциальность данных на
уровне структуры токена. В контексте JavaScript-библиотеки jsrsasign эта
функциональность реализована через модуль KJUR.jwe, который
поддерживает создание, шифрование и расшифровку JWE в соответствии со
спецификациями JOSE (JSON Object Signing and Encryption).
JWE представляет собой зашифрованный контейнер, состоящий из нескольких структурных элементов:
В jsrsasign эти компоненты формируются и обрабатываются через высокоуровневый API, скрывающий криптографические детали реализации. Основной акцент библиотеки — соответствие стандартам RFC 7516 и поддержка распространённых алгоритмов.
Jsrsasign реализует набор алгоритмов, используемых в JWE, включая ключевую обёртку (key management) и симметричное шифрование контента.
Особое внимание в jsrsasign уделяется режиму GCM, так как он обеспечивает одновременно шифрование и целостность данных без необходимости отдельного MAC-слоя.
Процесс создания JWE в jsrsasign включает несколько этапов: генерацию ключей, подготовку заголовка, шифрование payload и сериализацию результата.
Базовый объект для работы — KJUR.jwe.JWE.
const rsaKey = KEYUTIL.generateKeypair("RSA", 2048);
const header = {
alg: "RSA-OAEP",
enc: "A256GCM",
typ: "JWE"
};
const payload = "Секретное сообщение";
const jwe = new KJUR.jwe.JWE();
const result = jwe.generateJWEByJWEKey(
header,
payload,
rsaKey.pubKey
);
В результате формируется компактная сериализация:
BASE64URL(header).BASE64URL(encryptedKey).BASE64URL(iv).BASE64URL(ciphertext).BASE64URL(tag)
Заголовок играет ключевую роль в интерпретации токена. Jsrsasign строго следует JOSE-формату:
alg — алгоритм шифрования ключаenc — алгоритм шифрования данныхcty — тип содержимого (опционально)kid — идентификатор ключаПример:
{
"alg": "RSA-OAEP-256",
"enc": "A128GCM",
"kid": "key-2026-01"
}
Jsrsasign автоматически сериализует и кодирует заголовок в Base64URL перед включением в JWE структуру.
Наиболее распространённый сценарий в jsrsasign — асимметричное шифрование с RSA.
const pubKey = KEYUTIL.getKey(publicKeyPEM);
const jwe = new KJUR.jwe.JWE();
const encrypted = jwe.generateJWEByJWEKey(
{ alg: "RSA-OAEP", enc: "A256CBC-HS512" },
"данные",
pubKey
);
const privKey = KEYUTIL.getKey(privateKeyPEM);
const jwe = new KJUR.jwe.JWE();
const decrypted = jwe.decryptJWE(encrypted, privKey);
Внутри процесса библиотека:
Режим alg: "dir" исключает этап шифрования ключа. Один и
тот же секрет используется для шифрования данных.
const jwe = new KJUR.jwe.JWE();
const result = jwe.generateJWEByPassword(
{ alg: "dir", enc: "A256GCM" },
"секретные данные",
"shared-secret-key"
);
Особенность этого режима — высокая производительность, но зависимость от безопасного обмена ключом.
Алгоритмы A128KW, A256KW используются для
обёртки ключей с помощью AES.
Пример конфигурации:
{
alg: "A256KW",
enc: "A256GCM"
}
Jsrsasign применяет AES Key Wrap для защиты CEK (Content Encryption Key), после чего используется GCM или CBC для шифрования полезной нагрузки.
При использовании GCM-режима jsrsasign автоматически:
Эти элементы критически важны для защиты от модификации ciphertext.
Внутренне библиотека использует WebCrypto или собственную реализацию, в зависимости от окружения.
Процесс декодирования зеркален шифрованию.
Jsrsasign выполняет:
const jwe = new KJUR.jwe.JWE();
const data = jwe.decryptJWE(jweString, privateKey);
Jsrsasign возвращает ошибки при нарушении структуры токена:
Типичные сценарии отказа:
alg и encJsrsasign ориентирован на совместимость с JOSE-экосистемой, однако имеет особенности:
Несмотря на это, библиотека обеспечивает стабильную реализацию основных сценариев JWE: RSA + AES-GCM и симметрическое шифрование.
Внутри jsrsasign модуль JWE построен вокруг нескольких компонентов:
KJUR.jwe.JWE — основной интерфейсKJUR.crypto — криптографические операцииKEYUTIL — работа с ключамиKJUR.lang.String — утилиты кодированияСборка JWE происходит через последовательное применение:
JWE используется в сценариях, где необходимо защитить payload:
Особенность jsrsasign — возможность объединять JWS и JWE в гибридные схемы, где сначала выполняется подпись, затем шифрование результата.
Jsrsasign строго использует Base64URL encoding без padding. Это важно для совместимости с JWT/JWE стандартами.
Ключевые отличия:
+ заменяется на -/ заменяется на _= удаляетсяJsrsasign позволяет реализовывать сложные схемы:
Каждый из этих сценариев реализуется через модификацию JOSE header и выбор соответствующего ключевого менеджмента.
Jsrsasign тесно интегрируется с:
Это позволяет использовать JWE в enterprise-средах без дополнительных преобразований форматов.
Пример загрузки ключа:
const key = KEYUTIL.getKey(certPEM);
После чего он может быть использован напрямую в JWE API.
Использование GCM обеспечивает:
Jsrsasign автоматически управляет тегами аутентификации, исключая необходимость ручного контроля.
Производительность зависит от:
GCM-режим демонстрирует более высокую скорость за счёт параллелизации операций.
Jsrsasign позволяет детально управлять параметрами:
algencKEYUTILЭто делает библиотеку пригодной как для учебных задач, так и для production-решений с ограничениями безопасности.