В режиме прямого шифрования JWE (alg: dir) используется
симметричный ключ, который одновременно применяется для шифрования и
расшифрования полезной нагрузки без промежуточного механизма обёртки
ключа. В отличие от схем с RSA или ECDH, здесь отсутствует этап передачи
или защиты ключа-шифровщика: один и тот же секретный ключ целиком
отвечает за криптографическую безопасность сообщения.
Алгоритм dir в спецификации JWE (JSON Web Encryption)
относится к категории direct encryption, где:
Формально процесс выглядит так:
enc (например,
A256GCM);При использовании dir критически важно соблюдение
требований к длине и типу ключа.
Для различных алгоритмов enc требуются ключи
соответствующего размера:
A128GCM → 16 байт (128 бит)A192GCM → 24 байта (192 бита)A256GCM → 32 байта (256 бит)Несоответствие длины ключа приводит к ошибкам на этапе криптографической проверки или генерации.
Ключ должен быть:
JWE Compact Serialization при dir имеет следующую
форму:
BASE64URL(Protected Header).
BASE64URL(Encrypted Key - пусто).
BASE64URL(IV).
BASE64URL(Ciphertext).
BASE64URL(Authentication Tag)
Особенность dir:
Пример заголовка:
{
"alg": "dir",
"enc": "A256GCM"
}
Библиотека Jose в JavaScript предоставляет высокоуровневый API для работы с JWE.
Основные модули:
jose/jwe/compact/encryptjose/jwe/compact/decryptjose/util/generate_secretСимметричный ключ создаётся через криптографически безопасный генератор:
import { generateSecret } from 'jose'
const key = await generateSecret('A256GCM')
Внутри создаётся CryptoKey, совместимый с Web Crypto
API.
Процесс шифрования с dir выглядит следующим образом:
import { CompactEncrypt } from 'jose'
const secret = await generateSecret('A256GCM')
const encoder = new TextEncoder()
const jwe = await new CompactEncrypt(
encoder.encode('Секретные данные')
)
.setProtectedHeader({
alg: 'dir',
enc: 'A256GCM'
})
.encrypt(secret)
В этом процессе:
CompactEncrypt формирует JWE структуру;dir;encrypt(secret) применяет симметричный ключ
напрямую;Расшифрование выполняется симметрично:
import { compactDecrypt } from 'jose'
const { plaintext } = await compactDecrypt(jwe, secret)
console.log(new TextDecoder().decode(plaintext))
Внутренний процесс:
secret;В dir отсутствует асимметричное распределение ключей,
поэтому безопасность полностью зависит от:
Модель угроз:
dir применяется в случаях, где:
Типичные сценарии:
Использование ключа неправильного размера приводит к ошибкам вида:
dir несовместим с RSA/ECDH ключевыми структурами.
Прямое встраивание ключа в исходный код делает систему криптографически бессмысленной.
В JWE всегда действует связка:
alg: dir — способ обращения с ключомenc: A256GCM — алгоритм шифрования контентаВажно, что:
alg не выполняет шифрование данных;enc отвечает за AES-GCM или аналогичный алгоритм;enc и качеством
ключа.При использовании A256GCM выполняются:
Это обеспечивает:
При расшифровке Jose выполняет строгую валидацию:
alg;enc;Любое несоответствие приводит к ошибке без раскрытия частичных данных.
dir является одной из самых быстрых схем JWE:
Это делает его предпочтительным для high-throughput систем.
dirНесмотря на простоту, существуют ограничения:
Пример итоговой строки:
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..
[IV].
[Ciphertext].
[Tag]
Второй сегмент всегда пустой, что визуально отличает dir
от других режимов.
Jose использует Web Crypto API, поэтому:
crypto.webcrypto;CryptoKey;Uint8Array.При работе с dir ключевой аспект — управление
секретом:
Также важно:
alg и enc;