Выбор алгоритмов для зашифрованного JWT

Алгоритмическая модель JWE в jose строится вокруг разделения ответственности между управлением ключами и шифрованием содержимого. В отличие от подписанных JWT (JWS), где цель — обеспечить целостность и аутентичность, зашифрованный JWT (JWE) решает задачу конфиденциальности, скрывая payload от любых сторон, кроме получателя.

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

  • алгоритм управления ключом (alg) — определяет, как передаётся или защищается ключ шифрования контента
  • алгоритм шифрования контента (enc) — определяет, каким симметричным алгоритмом шифруются данные JWT

В библиотеке jose выбор этих алгоритмов напрямую влияет на безопасность, производительность и совместимость системы.


Выбор алгоритма в JWE всегда начинается не с библиотеки, а с модели угроз. Основные сценарии, которые определяют конфигурацию:

  • необходимость защиты payload от промежуточных систем (API gateway, прокси, логирование)
  • необходимость поддержки ротации ключей без перешифрования данных
  • требования к производительности (высоконагруженные API)
  • необходимость поддержки нескольких получателей (multi-recipient JWE)
  • совместимость с внешними системами (OAuth2, OpenID Connect, legacy-клиенты)

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


Базовые комбинации алгоритмов в jose

В jose поддерживается несколько устойчивых комбинаций, которые считаются стандартными:

RSA-OAEP-256 + A256GCM

Наиболее распространённая схема в корпоративных системах:

  • RSA-OAEP-256 используется для защиты симметричного ключа
  • A256GCM используется для шифрования payload

Характеристики:

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

Недостатки:

  • высокая стоимость операций на больших объёмах
  • зависимость от размера RSA ключей
  • отсутствие forward secrecy

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


ECDH-ES + A256GCM

Более современный подход на эллиптических кривых:

  • ECDH-ES используется для выработки общего секрета
  • A256GCM шифрует payload

Характеристики:

  • высокая производительность
  • меньшие ключи при той же криптостойкости
  • поддержка forward secrecy при правильной реализации

Особенность заключается в том, что ключ шифрования не передаётся, а вычисляется на обеих сторонах.

В jose это один из предпочтительных вариантов для современных систем обмена токенами.


dir + A256GCM

Схема с прямым симметричным ключом:

  • alg: dir
  • enc: A256GCM

Здесь отсутствует обёртка ключа — один и тот же секрет используется напрямую.

Характеристики:

  • максимальная производительность
  • минимальная криптографическая сложность
  • отсутствие необходимости в PKI

Недостатки:

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

Используется в замкнутых системах, например между микросервисами внутри одного доверенного контура.


Роль A256GCM как стандарта шифрования контента

Большинство современных конфигураций jose используют AES-GCM, чаще всего A256GCM.

Причины:

  • встроенная аутентификация (AEAD)
  • защита от модификации ciphertext
  • высокая скорость на современных CPU (AES-NI)

В JWE этот алгоритм одновременно:

  • шифрует payload
  • обеспечивает целостность
  • защищает дополнительные аутентифицированные данные (AAD)

Ошибка выбора режима без AEAD (например CBC без HMAC) приводит к уязвимостям типа padding oracle.


Сравнение RSA и ECDH в контексте jose

RSA

  • зрелая экосистема
  • поддержка во всех корпоративных системах
  • простая модель ключей (public/private)

Однако:

  • операции дешифрования ресурсоёмкие
  • увеличение ключей ухудшает производительность
  • нет встроенного механизма forward secrecy

ECDH

  • компактные ключи
  • высокая скорость вычислений
  • возможность ephemeral key exchange

Особенность jose заключается в том, что ECDH-ES позволяет строить гибридные схемы, где каждый JWT имеет уникальный session key.


Алгоритмическая структура JWE в jose

JWE в jose строится из пяти основных компонентов:

  • protected header (alg, enc, kid)
  • encrypted key (или пустое поле при dir)
  • initialization vector (IV)
  • ciphertext
  • authentication tag

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


Пример конфигурации RSA-OAEP-256

import { EncryptJWT, jwtDecrypt, generateKeyPair } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('RSA-OAEP-256')

const jwt = await new EncryptJWT({ userId: 123, role: 'admin' })
  .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .encrypt(publicKey)

const decrypted = await jwtDecrypt(jwt, privateKey)

В этой схеме payload полностью недоступен без приватного ключа, а симметричный ключ генерируется для каждого токена отдельно.


Пример ECDH-ES схемы

import { EncryptJWT, jwtDecrypt, generateKeyPair } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('ECDH-ES')

const jwt = await new EncryptJWT({ scope: 'read:messages' })
  .setProtectedHeader({ alg: 'ECDH-ES', enc: 'A256GCM' })
  .encrypt(publicKey)

const payload = await jwtDecrypt(jwt, privateKey)

Здесь отсутствует передача зашифрованного ключа — он вычисляется на основе обмена эллиптическими параметрами.


Прямой симметричный ключ (dir)

import { EncryptJWT, jwtDecrypt } from 'jose'
import { createSecretKey } from 'crypto'

const key = createSecretKey(Buffer.from('32bytes-long-secret-key-................'))

const jwt = await new EncryptJWT({ data: 'secure' })
  .setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
  .encrypt(key)

const decoded = await jwtDecrypt(jwt, key)

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


Выбор между производительностью и безопасностью

Алгоритмы JWE можно условно разделить по нагрузке:

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

В высоконагруженных API часто наблюдается переход от RSA к ECDH-ES именно из-за стоимости операций при масштабировании.


Ротация ключей и параметр kid

В jose идентификатор ключа (kid) играет критическую роль в управлении несколькими ключами одновременно.

Структура header:

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

Использование kid позволяет:

  • поддерживать несколько активных ключей
  • проводить ротацию без остановки системы
  • дешифровать старые токены новыми сервисами при необходимости fallback

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


Multi-recipient JWE и влияние алгоритмов

Некоторые сценарии требуют шифрования одного JWT для нескольких получателей. В этом случае:

  • RSA позволяет использовать разные public keys для каждого recipient
  • ECDH-ES требует отдельного вычисления shared secret
  • dir практически неприменим

В jose multi-recipient модель увеличивает размер токена пропорционально количеству получателей, что важно учитывать при проектировании API.


Типичные ошибки выбора алгоритмов

На практике встречаются повторяющиеся ошибки:

  • использование RSA-1_5 вместо OAEP (устаревшая схема)
  • применение CBC без GCM
  • использование одного симметричного ключа без ротации
  • смешивание JWS и JWE без чёткого разделения ответственности
  • игнорирование IV повторного использования в AES-GCM

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


Практическая стратегия выбора алгоритмов

В прикладных системах выбор обычно сводится к следующим профилям:

  • публичные API с OAuth2 → RSA-OAEP-256 + A256GCM
  • внутренние микросервисы → ECDH-ES + A256GCM
  • высокоскоростные доверенные контуры → dir + A256GCM
  • интеграции с внешними провайдерами → комбинации с обязательной поддержкой RSA

Архитектура системы определяет не только алгоритм, но и модель жизненного цикла ключей, что в jose является центральным аспектом безопасности JWE.