Прямое шифрование ключом: alg "dir"

Алгоритм dir в спецификации JSON Web Encryption (JWE), реализуемой библиотекой jose в JavaScript, представляет собой прямое симметричное шифрование, при котором один и тот же секретный ключ используется как для шифрования, так и для расшифрования данных без применения дополнительного механизма шифрования ключа содержимого.

В отличие от гибридных схем, где содержимое защищается случайным ключом (CEK), а затем этот ключ дополнительно шифруется асимметричным алгоритмом, модель dir полностью исключает этап обёртки ключа. Это делает поток обработки более коротким и строгим, но накладывает требование: длина и криптографическая стойкость общего секрета должны соответствовать выбранному алгоритму контентного шифрования.


В структуре JWE с использованием alg: "dir" ключевой особенностью является отсутствие отдельного ключа для шифрования контента (CEK). Вместо этого:

  • общий секретный ключ применяется напрямую
  • алгоритм шифрования контента (enc) определяет требования к длине ключа
  • ключ не передаётся в зашифрованном виде в заголовке

Фактически JWE в этом режиме становится полностью симметричной схемой защиты данных.


Криптографическая основа алгоритма dir

Алгоритм dir используется только как параметр alg в заголовке защищённого сообщения JWE:

  • alg: "dir" — прямое использование ключа
  • enc — алгоритм шифрования содержимого (например, A256GCM, A128GCM, A256CBC-HS512)

Ключевые свойства:

  • отсутствие Key Management Algorithm в классическом смысле
  • обязательное соответствие размера ключа требованиям enc
  • невозможность частичного восстановления данных без полного секрета

Требования к ключу

При использовании dir ключ должен быть заранее подготовлен и иметь корректную длину в байтах.

Примеры требований:

  • A256GCM → 32 байта (256 бит)
  • A128GCM → 16 байт (128 бит)
  • A256CBC-HS512 → 64 байта (разделяется на HMAC и шифрование)

Если ключ не соответствует требованиям, библиотека jose выдаёт ошибку на этапе шифрования или расшифровки.


Создание и импорт ключа в 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)

Шифрование данных с alg: dir

Процесс шифрования в 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 при использовании dir

JWE Compact Serialization в режиме dir имеет следующий вид:

protectedHeader..iv.ciphertext.tag

Обратите внимание:

  • второй сегмент (encrypted key) пуст
  • все операции завязаны на одном ключе
  • заголовок содержит только параметры алгоритмов

Поведение библиотеки jose при dir

Внутренне библиотека выполняет следующие шаги:

  1. проверка alg: "dir"
  2. проверка совместимости enc и длины ключа
  3. использование ключа напрямую как CEK
  4. генерация IV (инициализационного вектора)
  5. шифрование через выбранный AEAD-алгоритм
  6. формирование JWE Compact Serialization

Типичные алгоритмы enc при dir

Наиболее часто используемые значения:

  • A256GCM — современный AEAD режим
  • A128GCM — облегчённый вариант
  • A256CBC-HS512 — комбинированный режим (шифрование + HMAC)

Выбор влияет на:

  • требования к длине ключа
  • производительность
  • криптографические гарантии целостности

Особенности безопасности

Использование dir накладывает специфические ограничения:

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

При этом модель остаётся криптографически корректной при соблюдении следующих условий:

  • ключ генерируется случайно и имеет достаточную энтропию
  • ключ хранится вне кода и репозитория
  • используется современный AEAD (A256GCM предпочтителен)

Практическая модель использования

Алгоритм dir применяется в случаях, где:

  • обе стороны заранее разделяют секрет
  • требуется минимальная накладная сложность
  • отсутствует необходимость в публичной инфраструктуре ключей

Примеры:

  • внутренние сервисы
  • защищённые каналы между микросервисами
  • временные токены внутри одной системы

Ошибки и диагностика

При работе с jose часто встречаются следующие проблемы:

1. Invalid key size

Причина: несоответствие длины ключа алгоритму enc.

2. Unsupported “dir” with selected enc

Причина: использование несовместимого режима шифрования.

3. Decryption failed

Причина: изменение данных JWE или неверный ключ.


Взаимодействие с другими компонентами JWE

В модели dir остаются неизменными:

  • JWE Protected Header
  • Initialization Vector
  • Authentication Tag

Отсутствует только компонент:

  • Encrypted Key

Это делает структуру более компактной, но более зависимой от общего секрета.