JWE (JSON Web Encryption) представляет собой стандарт шифрования данных в формате JSON, определённый в рамках семейства JOSE. Его архитектура строго формализована и состоит из пяти ключевых компонентов, каждый из которых выполняет отдельную роль в процессе защиты данных. Эти компоненты обеспечивают конфиденциальность, целостность и управляемость криптографических операций.
Структура JWE может быть представлена в компактной форме (Compact Serialization) или в JSON-формате (JSON Serialization), однако логическая модель остаётся неизменной.
Protected Header — это обязательный компонент, содержащий метаданные, необходимые для корректной обработки шифрования и расшифровки. Он сериализуется в формате JSON и затем кодируется с использованием Base64URL.
Ключевые параметры:
Пример:
{
"alg": "RSA-OAEP",
"enc": "A256GCM"
}
Особенность Protected Header заключается в том, что он участвует в вычислении аутентификационного тега (Authentication Tag), обеспечивая защиту от подмены.
Этот компонент содержит симметричный ключ,
используемый для шифрования полезной нагрузки (Content Encryption Key,
CEK), зашифрованный с помощью алгоритма, указанного в
alg.
Варианты поведения:
alg: "dir" (Direct Encryption) компонент
отсутствует, так как CEK совпадает с переданным ключом.Формат: Base64URL-строка.
Initialization Vector (вектор инициализации) — случайное или псевдослучайное значение, используемое для обеспечения уникальности шифрования даже при одинаковых входных данных.
Требования:
IV не является секретным, но критически важен для криптографической стойкости.
Основной компонент, содержащий результат шифрования полезной нагрузки
(payload). Исходные данные преобразуются с использованием CEK и
алгоритма, указанного в enc.
Свойства:
Шифрование обычно выполняется с использованием алгоритмов типа:
Authentication Tag — результат криптографической проверки целостности и подлинности данных. Генерируется в процессе шифрования (например, в AES-GCM) и используется при расшифровке.
Назначение:
Если проверка тега не проходит, расшифровка считается недействительной.
Все пять компонентов формируют целостную криптографическую конструкцию:
В Compact Serialization итоговая строка имеет вид:
BASE64URL(Protected Header) .
BASE64URL(Encrypted Key) .
BASE64URL(IV) .
BASE64URL(Ciphertext) .
BASE64URL(Authentication Tag)
В библиотеке 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)
Внутри:
import { compactDecrypt } from 'jose'
const { plaintext } = await compactDecrypt(jwe, privateKey)
Процесс включает:
В отличие от компактной формы, JSON Serialization позволяет:
Пример структуры:
{
"protected": "...",
"recipients": [
{
"encrypted_key": "...",
"header": { "alg": "RSA-OAEP" }
}
],
"iv": "...",
"ciphertext": "...",
"tag": "..."
}
Ключевые свойства архитектуры JWE:
Особое внимание уделяется правильному выбору алгоритмов:
RSA-OAEP предпочтительнее устаревшего
RSA1_5A256GCM обеспечивает аутентифицированное шифрование без
необходимости отдельного MACНекорректная работа с компонентами JWE может привести к серьёзным проблемам:
Библиотека jose минимизирует эти риски за счёт строгой
валидации и безопасных значений по умолчанию.
A256GCM,
RSA-OAEP)| Компонент | Назначение |
|---|---|
| Protected Header | Управление алгоритмами и параметрами |
| Encrypted Key | Безопасная передача CEK |
| Initialization Vector | Уникальность шифрования |
| Ciphertext | Конфиденциальность данных |
| Authentication Tag | Целостность и подлинность |
Каждый элемент является критически важным и не может быть опущен без изменения всей модели безопасности.