Алгоритм dir в спецификации JSON Web Encryption (JWE),
реализуемой библиотекой jose в JavaScript, представляет
собой прямое симметричное шифрование, при котором один и тот же
секретный ключ используется как для шифрования, так и для расшифрования
данных без применения дополнительного механизма шифрования ключа
содержимого.
В отличие от гибридных схем, где содержимое защищается случайным
ключом (CEK), а затем этот ключ дополнительно шифруется асимметричным
алгоритмом, модель dir полностью исключает этап обёртки
ключа. Это делает поток обработки более коротким и строгим, но
накладывает требование: длина и криптографическая стойкость общего
секрета должны соответствовать выбранному алгоритму контентного
шифрования.
В структуре JWE с использованием alg: "dir" ключевой
особенностью является отсутствие отдельного ключа для шифрования
контента (CEK). Вместо этого:
enc) определяет
требования к длине ключаФактически JWE в этом режиме становится полностью симметричной схемой защиты данных.
Алгоритм dir используется только как параметр
alg в заголовке защищённого сообщения JWE:
alg: "dir" — прямое использование ключаenc — алгоритм шифрования содержимого (например,
A256GCM, A128GCM,
A256CBC-HS512)Ключевые свойства:
encПри использовании dir ключ должен быть заранее
подготовлен и иметь корректную длину в байтах.
Примеры требований:
A256GCM → 32 байта (256 бит)A128GCM → 16 байт (128 бит)A256CBC-HS512 → 64 байта (разделяется на HMAC и
шифрование)Если ключ не соответствует требованиям, библиотека jose
выдаёт ошибку на этапе шифрования или расшифровки.
В библиотеке jose ключ для dir создаётся
как симметричный Uint8Array и импортируется через
importKey.
import { importJWK, CompactEncrypt, compactDecrypt } from 'jose'
const secret = new TextEncoder().encode(
'32-byte-long-secret-key-for-a256gcm!!'
)
Для безопасного использования часто применяется генерация криптографически стойкого ключа:
import { randomBytes } from 'crypto'
const secret = randomBytes(32)
Процесс шифрования в jose при использовании
dir выполняется через CompactEncrypt.
Ключ не оборачивается, а напрямую используется в операции шифрования.
import { CompactEncrypt } from 'jose'
const payload = new TextEncoder().encode('секретные данные')
const jwe = await new CompactEncrypt(payload)
.setProtectedHeader({
alg: 'dir',
enc: 'A256GCM'
})
.encrypt(secret)
Результатом является компактная JWE-строка формата:
BASE64URL(header).BASE64URL(iv).BASE64URL(ciphertext).BASE64URL(tag)
Пятый сегмент (encrypted key) остаётся пустым, что отражает отсутствие ключевой обёртки.
Расшифрование выполняется через compactDecrypt, где
используется тот же секретный ключ.
import { compactDecrypt } from 'jose'
const { plaintext } = await compactDecrypt(jwe, secret)
const decoded = new TextDecoder().decode(plaintext)
Процесс полностью симметричен: структура JWE не содержит дополнительной информации о ключах, кроме параметров заголовка.
JWE Compact Serialization в режиме dir имеет следующий
вид:
protectedHeader..iv.ciphertext.tag
Обратите внимание:
Внутренне библиотека выполняет следующие шаги:
alg: "dir"enc и длины ключаНаиболее часто используемые значения:
A256GCM — современный AEAD режимA128GCM — облегчённый вариантA256CBC-HS512 — комбинированный режим (шифрование +
HMAC)Выбор влияет на:
Использование dir накладывает специфические
ограничения:
При этом модель остаётся криптографически корректной при соблюдении следующих условий:
A256GCM
предпочтителен)Алгоритм dir применяется в случаях, где:
Примеры:
При работе с jose часто встречаются следующие
проблемы:
1. Invalid key size
Причина: несоответствие длины ключа алгоритму enc.
2. Unsupported “dir” with selected enc
Причина: использование несовместимого режима шифрования.
3. Decryption failed
Причина: изменение данных JWE или неверный ключ.
В модели dir остаются неизменными:
Отсутствует только компонент:
Это делает структуру более компактной, но более зависимой от общего секрета.