Обёртка ключей (Key Management) — центральный механизм в
спецификациях JWE (JSON Web Encryption), определяющий, каким образом
шифруется или передаётся симметричный ключ контента (CEK, Content
Encryption Key). Библиотека jose реализует все основные
алгоритмы, описанные в стандартах RFC 7516 и RFC 7518.
Ключевые алгоритмы управления ключами:
Алгоритм RSA-OAEP использует асимметричное шифрование для обёртки CEK с помощью публичного ключа RSA.
Использует схему OAEP (Optimal Asymmetric Encryption Padding)
Поддерживает варианты:
RSA-OAEPRSA-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 реализует обмен ключами на основе эллиптических кривых. Он не шифрует CEK напрямую, а выводит его через общий секрет.
Использует ephemeral ключ отправителя
Генерирует общий секрет через ECDH
CEK выводится через KDF (Key Derivation Function)
Может использоваться в комбинации с AES Key Wrap:
ECDH-ES+A128KWECDH-ES+A256KWimport { 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Алгоритмы A128KW, A192KW, A256KW используют симметричное шифрование AES для обёртки CEK.
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);
Алгоритмы PBES2 позволяют использовать пароль для обёртки CEK.
PBES2-HS256+A128KWPBES2-HS512+A256KWimport { 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 — saltp2c — количество итерацийАлгоритм dir (direct) не выполняет обёртку ключа. Вместо этого 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 | Симметричный | Нет | Средняя | Максимальная |
joseВсе алгоритмы выбираются через alg в protected
header
enc определяет алгоритм шифрования содержимого
(например, A256GCM)
Библиотека автоматически:
Поддерживается как Compact, так и JSON Serialization
Некоторые алгоритмы комбинируются:
ECDH-ES + AES-KW — сначала вычисляется общий секрет,
затем используется AES-KWPBES2 + AES-KW — пароль → ключ → AES обёрткаЭто позволяет гибко управлять балансом между безопасностью и производительностью.
RSA требует достаточной длины ключа (не менее 2048 бит)
ECDH зависит от выбранной кривой (например, P-256, X25519)
PBES2 требует:
p2c)p2s)dir требует защищённого канала передачи ключа
jose поддерживает различные форматы:
Импорт:
import { importJWK } from 'jose';
const key = await importJWK(jwk, 'RSA-OAEP');
При создании JWE:
encПри расшифровке:
algГлубокое понимание алгоритмов обёртки ключей позволяет грамотно проектировать системы шифрования, выбирать оптимальные схемы обмена ключами и обеспечивать баланс между безопасностью, скоростью и удобством интеграции.