Обзор возможностей jsrsasign в части JWE

JWE в экосистеме JSON Web Token представляет собой механизм шифрования содержимого, обеспечивающий конфиденциальность данных на уровне структуры токена. В контексте JavaScript-библиотеки jsrsasign эта функциональность реализована через модуль KJUR.jwe, который поддерживает создание, шифрование и расшифровку JWE в соответствии со спецификациями JOSE (JSON Object Signing and Encryption).

JWE представляет собой зашифрованный контейнер, состоящий из нескольких структурных элементов:

  • защищённый заголовок (JOSE Header)
  • зашифрованный ключ (Encrypted Key)
  • вектор инициализации (Initialization Vector)
  • зашифрованный контент (Ciphertext)
  • тег аутентификации (Authentication Tag)

В jsrsasign эти компоненты формируются и обрабатываются через высокоуровневый API, скрывающий криптографические детали реализации. Основной акцент библиотеки — соответствие стандартам RFC 7516 и поддержка распространённых алгоритмов.

Поддерживаемые алгоритмы шифрования

Jsrsasign реализует набор алгоритмов, используемых в JWE, включая ключевую обёртку (key management) и симметричное шифрование контента.

Алгоритмы управления ключами (alg)

  • RSA-OAEP
  • RSA-OAEP-256
  • RSA1_5 (устаревающий, но поддерживаемый)
  • A128KW / A192KW / A256KW (AES Key Wrap)
  • dir (прямое использование симметрического ключа)

Алгоритмы шифрования контента (enc)

  • A128CBC-HS256
  • A192CBC-HS384
  • A256CBC-HS512
  • A128GCM
  • A192GCM
  • A256GCM

Особое внимание в jsrsasign уделяется режиму GCM, так как он обеспечивает одновременно шифрование и целостность данных без необходимости отдельного MAC-слоя.

Формирование JWE в jsrsasign

Процесс создания JWE в jsrsasign включает несколько этапов: генерацию ключей, подготовку заголовка, шифрование payload и сериализацию результата.

Базовый объект для работы — KJUR.jwe.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)

Структура заголовка JWE

Заголовок играет ключевую роль в интерпретации токена. Jsrsasign строго следует JOSE-формату:

  • alg — алгоритм шифрования ключа
  • enc — алгоритм шифрования данных
  • cty — тип содержимого (опционально)
  • kid — идентификатор ключа

Пример:

{
  "alg": "RSA-OAEP-256",
  "enc": "A128GCM",
  "kid": "key-2026-01"
}

Jsrsasign автоматически сериализует и кодирует заголовок в Base64URL перед включением в JWE структуру.

Использование RSA в 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);

Внутри процесса библиотека:

  1. извлекает зашифрованный симметрический ключ
  2. расшифровывает его RSA-приватным ключом
  3. использует его для дешифрования payload

Симметричный режим (direct encryption)

Режим alg: "dir" исключает этап шифрования ключа. Один и тот же секрет используется для шифрования данных.

const jwe = new KJUR.jwe.JWE();

const result = jwe.generateJWEByPassword(
  { alg: "dir", enc: "A256GCM" },
  "секретные данные",
  "shared-secret-key"
);

Особенность этого режима — высокая производительность, но зависимость от безопасного обмена ключом.

AES Key Wrap в jsrsasign

Алгоритмы A128KW, A256KW используются для обёртки ключей с помощью AES.

Пример конфигурации:

{
  alg: "A256KW",
  enc: "A256GCM"
}

Jsrsasign применяет AES Key Wrap для защиты CEK (Content Encryption Key), после чего используется GCM или CBC для шифрования полезной нагрузки.

Работа с Initialization Vector и Authentication Tag

При использовании GCM-режима jsrsasign автоматически:

  • генерирует IV (обычно 96 бит)
  • вычисляет authentication tag
  • объединяет их в структуру JWE

Эти элементы критически важны для защиты от модификации ciphertext.

Внутренне библиотека использует WebCrypto или собственную реализацию, в зависимости от окружения.

Декодирование JWE и восстановление данных

Процесс декодирования зеркален шифрованию.

Jsrsasign выполняет:

  1. разбор компактной строки JWE
  2. декодирование Base64URL компонентов
  3. расшифровку CEK
  4. дешифрование payload
  5. проверку целостности (GCM tag или CBC-MAC)
const jwe = new KJUR.jwe.JWE();

const data = jwe.decryptJWE(jweString, privateKey);

Обработка ошибок в JWE

Jsrsasign возвращает ошибки при нарушении структуры токена:

  • некорректное количество сегментов
  • несовпадение алгоритмов
  • ошибка проверки authentication tag
  • невозможность расшифровать ключ

Типичные сценарии отказа:

  • использование неправильного приватного ключа
  • повреждение ciphertext
  • несовместимость alg и enc

Совместимость и ограничения реализации

Jsrsasign ориентирован на совместимость с JOSE-экосистемой, однако имеет особенности:

  • отсутствие полной поддержки всех JWE extensions RFC 7516
  • зависимость от окружения при использовании криптографических API браузера
  • различия в производительности между Node.js и браузером
  • ограниченная поддержка некоторых гибридных схем

Несмотря на это, библиотека обеспечивает стабильную реализацию основных сценариев JWE: RSA + AES-GCM и симметрическое шифрование.

Внутренние механизмы KJUR.jwe

Внутри jsrsasign модуль JWE построен вокруг нескольких компонентов:

  • KJUR.jwe.JWE — основной интерфейс
  • KJUR.crypto — криптографические операции
  • KEYUTIL — работа с ключами
  • KJUR.lang.String — утилиты кодирования

Сборка JWE происходит через последовательное применение:

  • сериализации JSON
  • Base64URL encoding
  • криптографических преобразований
  • конкатенации сегментов

Практическое применение JWE в jsrsasign

JWE используется в сценариях, где необходимо защитить payload:

  • хранение токенов с чувствительными данными
  • защищённый обмен сообщениями между сервисами
  • клиент-серверная передача конфиденциальной информации
  • шифрование JWT вместо только подписи (JWS)

Особенность jsrsasign — возможность объединять JWS и JWE в гибридные схемы, где сначала выполняется подпись, затем шифрование результата.

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

RSA-OAEP + A256GCM

  • высокая безопасность
  • асимметричная модель
  • подходит для распределённых систем

dir + A256GCM

  • максимальная производительность
  • требует общего секрета
  • используется в закрытых системах

A256KW + A256GCM

  • компромисс между скоростью и безопасностью
  • удобен для ротации ключей

Особенности Base64URL в JWE

Jsrsasign строго использует Base64URL encoding без padding. Это важно для совместимости с JWT/JWE стандартами.

Ключевые отличия:

  • + заменяется на -
  • / заменяется на _
  • = удаляется

Расширенные сценарии использования

Jsrsasign позволяет реализовывать сложные схемы:

  • multi-key encryption (несколько получателей)
  • динамическая смена алгоритмов через header
  • интеграция с X.509 сертификатами
  • комбинированные JWT (JWS + JWE)

Каждый из этих сценариев реализуется через модификацию JOSE header и выбор соответствующего ключевого менеджмента.

Взаимодействие с ключевой инфраструктурой

Jsrsasign тесно интегрируется с:

  • PEM-форматом ключей
  • X.509 сертификатами
  • JWK (JSON Web Key)

Это позволяет использовать JWE в enterprise-средах без дополнительных преобразований форматов.

Пример загрузки ключа:

const key = KEYUTIL.getKey(certPEM);

После чего он может быть использован напрямую в JWE API.

Контроль целостности и защита от атак

Использование GCM обеспечивает:

  • защиту от tampering
  • проверку целостности ciphertext
  • защиту IV reuse атак при корректной реализации

Jsrsasign автоматически управляет тегами аутентификации, исключая необходимость ручного контроля.

Производительность операций JWE

Производительность зависит от:

  • размера ключа RSA
  • режима шифрования (CBC vs GCM)
  • окружения (Node.js быстрее браузера при криптооперациях)
  • использования WebCrypto API

GCM-режим демонстрирует более высокую скорость за счёт параллелизации операций.

Гибкость конфигурации JWE

Jsrsasign позволяет детально управлять параметрами:

  • выбор алгоритма alg
  • выбор шифра enc
  • контроль ключей через KEYUTIL
  • настройка заголовков

Это делает библиотеку пригодной как для учебных задач, так и для production-решений с ограничениями безопасности.