Структура JWE Compact Serialization

Compact Serialization в спецификации JWE (JSON Web Encryption) определяет компактное представление зашифрованного сообщения в виде одной строки. В библиотеке Jsrsasign этот формат используется для передачи зашифрованных данных между системами, где важна минимальная длина и совместимость с URL-safe строками.

Структура JWE Compact Serialization всегда состоит из пяти частей, разделённых точками:

BASE64URL(Protected Header).
BASE64URL(Encrypted Key).
BASE64URL(Initialization Vector).
BASE64URL(Ciphertext).
BASE64URL(Authentication Tag)

Каждый сегмент кодируется в Base64URL без паддинга и имеет строго определённое назначение.


Protected Header

Первая часть содержит заголовок в формате JSON, закодированный в Base64URL. Он описывает параметры шифрования и криптографические алгоритмы, используемые для формирования JWE.

Типичный пример заголовка:

{
  "alg": "RSA-OAEP",
  "enc": "A256GCM"
}
  • alg — алгоритм шифрования ключа контента (key management algorithm)
  • enc — алгоритм шифрования данных (content encryption algorithm)

После кодирования JSON превращается в первую часть JWE строки.


Encrypted Key

Вторая часть представляет собой зашифрованный ключ симметричного шифрования (Content Encryption Key, CEK).

В зависимости от алгоритма alg:

  • при RSA-OAEP CEK шифруется публичным RSA-ключом
  • при ECDH-ES ключ может быть выведен из общего секрета, и поле может быть пустым

Если значение отсутствует, часть всё равно присутствует как пустая строка между точками.


Initialization Vector (IV)

Третья часть содержит вектор инициализации, необходимый для алгоритмов симметричного шифрования (например, AES-GCM).

IV обеспечивает уникальность шифрования при каждом новом сообщении, предотвращая повторное использование одного и того же ключевого потока.

Длина IV зависит от выбранного алгоритма, например:

  • AES-GCM обычно использует 96 бит (12 байт)

Ciphertext

Четвёртая часть — это непосредственно зашифрованные данные.

Исходный открытый текст перед шифрованием объединяется с Protected Header (через процесс AAD — Additional Authenticated Data), после чего шифруется симметрическим алгоритмом.

Ciphertext не содержит структурной информации и представляет собой результат блочного или потокового шифрования.


Authentication Tag

Пятая часть используется только в режимах AEAD (Authenticated Encryption with Associated Data), таких как AES-GCM.

Authentication Tag обеспечивает:

  • целостность данных
  • проверку подлинности шифротекста и заголовка

При расшифровке изменение любого байта в предыдущих частях приводит к невалидному тегу и ошибке проверки.


Общая схема сборки JWE

Финальная строка формируется простым объединением пяти компонентов:

protectedHeader.encryptedKey.iv.ciphertext.authTag

Каждый элемент обязателен для полного JWE Compact Serialization, даже если его значение пустое.


Пример JWE Compact Serialization

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFp.
48V1_ALb6US04U3b.
5eym8TW_c8SuK9PmQ.
XFBoMYUZodetZdvTiFvSkQ

В этом примере:

  • первая часть — заголовок с RSA-OAEP и AES-256-GCM
  • вторая — зашифрованный CEK
  • третья — IV
  • четвёртая — ciphertext
  • пятая — authentication tag

Особенности обработки в Jsrsasign

В Jsrsasign работа с Compact Serialization реализована через объекты JWE, где каждая часть генерируется или извлекается автоматически при вызове функций шифрования и расшифрования.

Внутренний процесс включает:

  • сериализацию заголовка
  • генерацию CEK
  • шифрование CEK публичным ключом
  • формирование IV
  • шифрование payload с использованием AES-GCM
  • вычисление authentication tag

При декодировании выполняется обратная операция с обязательной проверкой тега.


Ограничения формата Compact Serialization

Compact Serialization накладывает ряд структурных ограничений:

  • отсутствие произвольных полей (в отличие от JSON Serialization)
  • фиксированное количество сегментов
  • невозможность расширения метаданных без изменения заголовка
  • строгая зависимость от Base64URL кодирования

Эти ограничения компенсируются компактностью и удобством передачи в URL, HTTP заголовках и токенах.


Отличие от JSON Serialization

В альтернативном формате JWE JSON Serialization данные представляются структурированным JSON-объектом с возможностью множественных recipients и расширенных полей.

Compact Serialization:

  • одна строка
  • один recipient
  • минимальный размер

JSON Serialization:

  • расширяемая структура
  • поддержка нескольких получателей
  • более сложный парсинг