Архитектура JWE: пять компонентов

JWE (JSON Web Encryption) представляет собой стандарт шифрования данных в формате JSON, определённый в рамках семейства JOSE. Его архитектура строго формализована и состоит из пяти ключевых компонентов, каждый из которых выполняет отдельную роль в процессе защиты данных. Эти компоненты обеспечивают конфиденциальность, целостность и управляемость криптографических операций.

Структура JWE может быть представлена в компактной форме (Compact Serialization) или в JSON-формате (JSON Serialization), однако логическая модель остаётся неизменной.


Protected Header (Защищённый заголовок)

Protected Header — это обязательный компонент, содержащий метаданные, необходимые для корректной обработки шифрования и расшифровки. Он сериализуется в формате JSON и затем кодируется с использованием Base64URL.

Ключевые параметры:

  • alg — алгоритм управления ключом (Key Management Algorithm)
  • enc — алгоритм шифрования содержимого (Content Encryption Algorithm)
  • typ, cty — тип токена и содержимого
  • kid — идентификатор ключа

Пример:

{
  "alg": "RSA-OAEP",
  "enc": "A256GCM"
}

Особенность Protected Header заключается в том, что он участвует в вычислении аутентификационного тега (Authentication Tag), обеспечивая защиту от подмены.


Encrypted Key (Зашифрованный ключ)

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

Варианты поведения:

  • При использовании асимметричных алгоритмов (например, RSA-OAEP) CEK шифруется публичным ключом.
  • При использовании алгоритмов на основе симметрии (например, AES Key Wrap) применяется общий секрет.
  • В случае alg: "dir" (Direct Encryption) компонент отсутствует, так как CEK совпадает с переданным ключом.

Формат: Base64URL-строка.


Initialization Vector (IV)

Initialization Vector (вектор инициализации) — случайное или псевдослучайное значение, используемое для обеспечения уникальности шифрования даже при одинаковых входных данных.

Требования:

  • Должен быть уникальным для каждой операции шифрования
  • Размер зависит от выбранного алгоритма (например, 96 бит для AES-GCM)

IV не является секретным, но критически важен для криптографической стойкости.


Ciphertext (Зашифрованное содержимое)

Основной компонент, содержащий результат шифрования полезной нагрузки (payload). Исходные данные преобразуются с использованием CEK и алгоритма, указанного в enc.

Свойства:

  • Представляет собой бинарные данные, закодированные в Base64URL
  • Не содержит информации о структуре исходного сообщения
  • Может быть любого размера

Шифрование обычно выполняется с использованием алгоритмов типа:

  • AES-GCM (аутентифицированное шифрование)
  • AES-CBC + HMAC (комбинированный подход)

Authentication Tag (Тег аутентификации)

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

Назначение:

  • Обнаружение изменений в зашифрованных данных
  • Проверка корректности Protected Header
  • Защита от атак типа “man-in-the-middle”

Если проверка тега не проходит, расшифровка считается недействительной.


Взаимосвязь компонентов

Все пять компонентов формируют целостную криптографическую конструкцию:

  1. Protected Header определяет правила обработки
  2. CEK генерируется и шифруется (Encrypted Key)
  3. IV используется для инициализации алгоритма
  4. Payload шифруется → Ciphertext
  5. Вычисляется Authentication Tag

В Compact Serialization итоговая строка имеет вид:

BASE64URL(Protected Header) .
BASE64URL(Encrypted Key) .
BASE64URL(IV) .
BASE64URL(Ciphertext) .
BASE64URL(Authentication Tag)

Реализация в библиотеке jose

В библиотеке jose для JavaScript архитектура JWE отражена через высокоуровневые API:

Шифрование

import { CompactEncrypt } from 'jose'

const encoder = new TextEncoder()
const data = encoder.encode('payload')

const jwe = await new CompactEncrypt(data)
  .setProtectedHeader({ alg: 'RSA-OAEP', enc: 'A256GCM' })
  .encrypt(publicKey)

Внутри:

  • Генерируется CEK
  • CEK шифруется → Encrypted Key
  • Создаётся IV
  • Выполняется шифрование → Ciphertext
  • Вычисляется Authentication Tag

Расшифровка

import { compactDecrypt } from 'jose'

const { plaintext } = await compactDecrypt(jwe, privateKey)

Процесс включает:

  • Декодирование Protected Header
  • Расшифровку CEK
  • Проверку Authentication Tag
  • Дешифрование Ciphertext

Расширенная JSON-сериализация

В отличие от компактной формы, JSON Serialization позволяет:

  • Использовать несколько получателей (multiple recipients)
  • Разделять unprotected и protected заголовки
  • Явно представлять все компоненты

Пример структуры:

{
  "protected": "...",
  "recipients": [
    {
      "encrypted_key": "...",
      "header": { "alg": "RSA-OAEP" }
    }
  ],
  "iv": "...",
  "ciphertext": "...",
  "tag": "..."
}

Криптографические аспекты

Ключевые свойства архитектуры JWE:

  • Конфиденциальность — обеспечивается симметричным шифрованием payload
  • Гибкость — возможность комбинирования алгоритмов
  • Масштабируемость — поддержка нескольких получателей
  • Безопасность заголовков — Protected Header участвует в аутентификации

Особое внимание уделяется правильному выбору алгоритмов:

  • RSA-OAEP предпочтительнее устаревшего RSA1_5
  • A256GCM обеспечивает аутентифицированное шифрование без необходимости отдельного MAC

Поток данных при шифровании

  1. Исходный payload кодируется в бинарный формат
  2. Генерируется CEK
  3. CEK шифруется выбранным алгоритмом
  4. Генерируется IV
  5. Payload шифруется с использованием CEK и IV
  6. Вычисляется Authentication Tag
  7. Все компоненты сериализуются

Поток данных при расшифровке

  1. Парсинг JWE-структуры
  2. Декодирование Protected Header
  3. Расшифровка CEK
  4. Проверка Authentication Tag
  5. Дешифрование Ciphertext
  6. Декодирование исходного payload

Ошибки и уязвимости

Некорректная работа с компонентами JWE может привести к серьёзным проблемам:

  • Повторное использование IV — критическая уязвимость
  • Игнорирование Authentication Tag — потеря целостности
  • Использование слабых алгоритмов — компрометация данных
  • Неправильная обработка заголовков — атаки на уровне метаданных

Библиотека jose минимизирует эти риски за счёт строгой валидации и безопасных значений по умолчанию.


Практические рекомендации

  • Всегда использовать современные алгоритмы (A256GCM, RSA-OAEP)
  • Не управлять CEK вручную без необходимости
  • Полагаться на встроенные механизмы генерации IV
  • Проверять поддержку алгоритмов на стороне получателя
  • Использовать JSON Serialization при работе с несколькими получателями

Роль каждого компонента в безопасности

Компонент Назначение
Protected Header Управление алгоритмами и параметрами
Encrypted Key Безопасная передача CEK
Initialization Vector Уникальность шифрования
Ciphertext Конфиденциальность данных
Authentication Tag Целостность и подлинность

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