Алгоритмы шифрования содержимого: AES-GCM, AES-CBC с HMAC

В экосистеме JOSE (JSON Object Signing and Encryption) шифрование JWE (JSON Web Encryption) строится вокруг концепции гибридного шифрования: симметричный ключ используется для защиты данных, а асимметричный — для безопасной передачи этого ключа. Центральное место в практических реализациях занимает семейство алгоритмов AES, среди которых наиболее распространены AES-GCM и AES-CBC в комбинации с HMAC.


Архитектура JWE и место алгоритмов шифрования

Структура JWE включает пять основных компонентов:

  • protected header (защищённый заголовок)
  • encrypted key (зашифрованный ключ контента, CEK)
  • initialization vector (IV)
  • ciphertext (зашифрованные данные)
  • authentication tag (тег аутентификации)

Алгоритмы шифрования в JOSE делятся на две категории:

  • Key Management Algorithms (например, RSA-OAEP, ECDH-ES)
  • Content Encryption Algorithms (например, A256GCM, A256CBC-HS512)

AES-GCM и AES-CBC + HMAC относятся ко второй категории и отвечают за непосредственное шифрование полезной нагрузки.


AES-GCM в контексте JOSE

AES-GCM (Galois/Counter Mode) представляет собой режим аутентифицированного шифрования (AEAD), объединяющий конфиденциальность и целостность данных в одном алгоритме.

Основные свойства AES-GCM:

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

Структура защиты:

AES-GCM одновременно формирует:

  • зашифрованный текст (ciphertext)
  • authentication tag (обычно 128 бит)

В JOSE:

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

  • A128GCM
  • A192GCM
  • A256GCM

Пример использования AES-GCM в библиотеке jose (Node.js)

import { CompactEncrypt, compactDecrypt } from 'jose'
import { generateKey } from 'jose/util/generate_key'

const key = await generateKey('A256GCM')

const encoder = new TextEncoder()

const jwe = await new CompactEncrypt(
  encoder.encode('секретное сообщение')
)
  .setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
  .encrypt(key)

const { plaintext } = await compactDecrypt(jwe, key)

Особенность режима dir заключается в том, что CEK не передаётся отдельно — он используется напрямую.


AES-CBC + HMAC: модель разделённой аутентификации

AES-CBC сам по себе обеспечивает только конфиденциальность, но не защищает от модификации данных. Для устранения этой проблемы в JOSE используется комбинированная схема:

  • AES-CBC для шифрования
  • HMAC-SHA2 для проверки целостности

Структура A256CBC-HS512

Алгоритм A256CBC-HS512 является наиболее распространённым представителем этой группы и включает:

  • AES-256-CBC — шифрование данных
  • HMAC-SHA-512 — аутентификация

Ключ фактически делится на две части:

  • половина используется для AES
  • половина используется для HMAC

Такой подход называется split key model.


Принцип работы AES-CBC + HMAC в JOSE

Процесс шифрования включает следующие этапы:

  1. Генерация случайного CEK

  2. Разделение CEK на:

    • encryption key
    • MAC key
  3. Шифрование данных через AES-CBC с IV

  4. Вычисление HMAC:

    • над AAD (Additional Authenticated Data)
    • над IV
    • над ciphertext
  5. Формирование authentication tag


Пример использования A256CBC-HS512 в jose

import { CompactEncrypt, compactDecrypt } from 'jose'

const textEncoder = new TextEncoder()

const key = crypto.getRandomValues(new Uint8Array(64)) // 512 бит

const jwe = await new CompactEncrypt(
  textEncoder.encode('данные для защиты')
)
  .setProtectedHeader({ alg: 'dir', enc: 'A256CBC-HS512' })
  .encrypt(key)

const { plaintext } = await compactDecrypt(jwe, key)

Здесь ключ должен иметь удвоенную длину относительно AES-части, поскольку он включает HMAC-компонент.


Сравнение AES-GCM и AES-CBC + HMAC

AES-GCM

  • единый алгоритм AEAD
  • высокая скорость
  • параллелизация
  • чувствителен к повторному использованию nonce
  • современный стандарт

AES-CBC + HMAC

  • разделённая модель (encrypt + MAC)
  • более сложная реализация
  • лучше изученная криптографическая основа
  • устойчивость к ошибкам реализации при правильной компоновке
  • используется в legacy-совместимости

Особенности реализации в JOSE

Библиотека jose строго следует спецификации RFC 7516 и учитывает:

  • корректное формирование AAD (protected header)
  • обязательную проверку authentication tag
  • запрет дешифровки при малейшем несоответствии MAC
  • строгую работу с IV (инициализационный вектор всегда уникален)

Protected Header и связь с алгоритмами

В заголовке JWE фиксируется используемая криптосхема:

{
  "alg": "dir",
  "enc": "A256GCM"
}

или

{
  "alg": "dir",
  "enc": "A256CBC-HS512"
}

Поле enc определяет именно алгоритм контентного шифрования, включая способ аутентификации.


Безопасность и практические аспекты

Критические требования при использовании AES-GCM:

  • уникальный IV для каждого сообщения
  • недопустимость повторного использования ключа с тем же nonce
  • контроль утечки authentication tag

Для AES-CBC + HMAC:

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

Роль JOSE в современных приложениях

В JavaScript-экосистеме JOSE применяется для:

  • защиты API-токенов (JWE)
  • безопасной передачи конфиденциальных данных
  • шифрования JWT payload
  • реализации end-to-end encryption поверх HTTP

Алгоритмы AES-GCM и AES-CBC + HMAC формируют основу практической криптографии в этих сценариях, обеспечивая баланс между производительностью, совместимостью и криптостойкостью.