Алгоритмы обёртки ключей: RSA-OAEP, ECDH-ES, AES-KW, PBES2, dir

Обёртка ключей (Key Management) — центральный механизм в спецификациях JWE (JSON Web Encryption), определяющий, каким образом шифруется или передаётся симметричный ключ контента (CEK, Content Encryption Key). Библиотека jose реализует все основные алгоритмы, описанные в стандартах RFC 7516 и RFC 7518.

Ключевые алгоритмы управления ключами:

  • RSA-OAEP
  • ECDH-ES
  • AES Key Wrap (A128KW, A192KW, A256KW)
  • PBES2
  • dir (Direct Encryption)

RSA-OAEP

Алгоритм RSA-OAEP использует асимметричное шифрование для обёртки CEK с помощью публичного ключа RSA.

Особенности:

  • Использует схему OAEP (Optimal Asymmetric Encryption Padding)

  • Поддерживает варианты:

    • RSA-OAEP
    • RSA-OAEP-256
  • Требует пару ключей: публичный для шифрования, приватный для расшифровки

Пример

import { generateKeyPair, CompactEncrypt } from 'jose';

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

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

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

Расшифровка

import { compactDecrypt } from 'jose';

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

ECDH-ES (Elliptic Curve Diffie-Hellman Ephemeral Static)

Алгоритм ECDH-ES реализует обмен ключами на основе эллиптических кривых. Он не шифрует CEK напрямую, а выводит его через общий секрет.

Особенности:

  • Использует ephemeral ключ отправителя

  • Генерирует общий секрет через ECDH

  • CEK выводится через KDF (Key Derivation Function)

  • Может использоваться в комбинации с AES Key Wrap:

    • ECDH-ES+A128KW
    • ECDH-ES+A256KW

Пример

import { generateKeyPair, CompactEncrypt } from 'jose';

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

const jwe = await new CompactEncrypt(new TextEncoder().encode('data'))
  .setProtectedHeader({ alg: 'ECDH-ES', enc: 'A256GCM' })
  .encrypt(publicKey);

Важные моменты:

  • В заголовке автоматически добавляется epk (ephemeral public key)
  • Получатель использует свой приватный ключ и epk для восстановления CEK

AES Key Wrap (AES-KW)

Алгоритмы A128KW, A192KW, A256KW используют симметричное шифрование AES для обёртки CEK.

Особенности:

  • Требуется заранее известный симметричный ключ
  • CEK шифруется через AES Key Wrap (RFC 3394)
  • Используется как Key Encryption Key (KEK)

Пример

import { CompactEncrypt } from 'jose';

const key = crypto.getRandomValues(new Uint8Array(32)); // A256KW

const jwe = await new CompactEncrypt(new TextEncoder().encode('data'))
  .setProtectedHeader({ alg: 'A256KW', enc: 'A256GCM' })
  .encrypt(key);

Преимущества:

  • Высокая производительность
  • Простота реализации

Ограничения:

  • Требует безопасной передачи KEK

PBES2 (Password-Based Encryption)

Алгоритмы PBES2 позволяют использовать пароль для обёртки CEK.

Варианты:

  • PBES2-HS256+A128KW
  • PBES2-HS512+A256KW

Принцип работы:

  1. Пароль преобразуется в ключ через PBKDF2
  2. Полученный ключ используется в AES-KW

Пример

import { CompactEncrypt } from 'jose';

const password = new TextEncoder().encode('strong-password');

const jwe = await new CompactEncrypt(new TextEncoder().encode('data'))
  .setProtectedHeader({ alg: 'PBES2-HS256+A128KW', enc: 'A256GCM' })
  .encrypt(password);

В заголовке появляются параметры:

  • p2s — salt
  • p2c — количество итераций

Особенности:

  • Удобен для пользовательских сценариев
  • Безопасность зависит от сложности пароля и числа итераций

dir (Direct Encryption)

Алгоритм dir (direct) не выполняет обёртку ключа. Вместо этого CEK передаётся напрямую.

Особенности:

  • Симметричный ключ используется как CEK
  • Нет этапа обёртки
  • Максимальная производительность

Пример

import { CompactEncrypt } from 'jose';

const key = crypto.getRandomValues(new Uint8Array(32));

const jwe = await new CompactEncrypt(new TextEncoder().encode('data'))
  .setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
  .encrypt(key);

Ограничения:

  • Требуется безопасный канал передачи ключа
  • Не подходит для публичных сценариев

Сравнение алгоритмов

Алгоритм Тип ключа Обёртка CEK Безопасность Производительность
RSA-OAEP Асимметричный Да Высокая Средняя
ECDH-ES Асимметричный Нет (KDF) Очень высокая Высокая
AES-KW Симметричный Да Высокая Высокая
PBES2 Пароль Да Зависит от PW Низкая
dir Симметричный Нет Средняя Максимальная

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

  • RSA-OAEP — универсальный выбор для сервер-клиент архитектур
  • ECDH-ES — предпочтителен при необходимости forward secrecy
  • AES-KW — эффективен в системах с заранее известными ключами
  • PBES2 — применяется при пользовательской аутентификации
  • dir — подходит для внутренних сервисов с защищённым обменом ключами

Особенности реализации в jose

  • Все алгоритмы выбираются через alg в protected header

  • enc определяет алгоритм шифрования содержимого (например, A256GCM)

  • Библиотека автоматически:

    • генерирует CEK (если требуется)
    • управляет IV, tag, epk и другими параметрами
  • Поддерживается как Compact, так и JSON Serialization


Взаимодействие алгоритмов

Некоторые алгоритмы комбинируются:

  • ECDH-ES + AES-KW — сначала вычисляется общий секрет, затем используется AES-KW
  • PBES2 + AES-KW — пароль → ключ → AES обёртка

Это позволяет гибко управлять балансом между безопасностью и производительностью.


Безопасность

  • RSA требует достаточной длины ключа (не менее 2048 бит)

  • ECDH зависит от выбранной кривой (например, P-256, X25519)

  • PBES2 требует:

    • большого числа итераций (p2c)
    • случайного salt (p2s)
  • dir требует защищённого канала передачи ключа


Работа с ключами

jose поддерживает различные форматы:

  • JWK (JSON Web Key)
  • PEM / DER
  • Uint8Array (для симметричных ключей)

Импорт:

import { importJWK } from 'jose';

const key = await importJWK(jwk, 'RSA-OAEP');

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

При создании JWE:

  1. Генерируется CEK (если не dir)
  2. CEK оборачивается выбранным алгоритмом
  3. Данные шифруются через enc
  4. Формируется структура JWE

При расшифровке:

  1. Извлекается encrypted CEK
  2. Расшифровывается через alg
  3. Используется для расшифровки payload

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