Алгоритм A128CBC-HS256 относится к семейству JWE Content Encryption Algorithms, объединяющих симметричное шифрование AES в режиме CBC и механизм целостности на основе HMAC-SHA-256. В контексте библиотеки JOSE в JavaScript этот алгоритм применяется для защиты полезной нагрузки JSON Web Encryption с одновременным обеспечением конфиденциальности и криптографической целостности.
Внутренний Content Encryption Key (CEK) имеет длину 256 бит и делится на две части:
Такое разделение выполняется детерминированно после генерации CEK и является обязательным элементом спецификации.
Процесс обработки данных включает несколько этапов:
= _{128}((, ))
Итоговый тег обрезается до 128 бит, что соответствует требованиям JWE.
В библиотеке jose алгоритм используется как один из
стандартных режимов шифрования JWE Compact Serialization.
Пример создания зашифрованного объекта:
import { CompactEncrypt } from 'jose'
const encoder = new TextEncoder()
const jwe = await new CompactEncrypt(
encoder.encode('секретные данные')
)
.setProtectedHeader({ alg: 'dir', enc: 'A128CBC-HS256' })
.encrypt(sharedKey)
В данном контексте sharedKey должен соответствовать
длине 256 бит для CEK или быть материалом для его вывода в зависимости
от выбранного режима согласования ключей.
Алгоритм A192CBC-HS384 расширяет предыдущий подход, увеличивая размер ключей и криптографическую стойкость за счёт использования AES-192-CBC и HMAC-SHA-384.
CEK в этом алгоритме составляет 384 бита и делится следующим образом:
Такое распределение обеспечивает симметричную криптографическую нагрузку между конфиденциальностью и целостностью.
Используется HMAC-SHA-384 с последующим усечением результата до 192 бит:
= _{192}((, ))
AAD (Additional Authenticated Data) включает заголовок JWE и другие аутентифицируемые параметры, не подлежащие шифрованию.
Библиотека автоматически управляет разбиением CEK и применением соответствующих примитивов криптографии через WebCrypto или Node.js crypto API.
Пример использования:
import { CompactEncrypt } from 'jose'
const data = new TextEncoder().encode('данные')
const jwe = await new CompactEncrypt(data)
.setProtectedHeader({ alg: 'dir', enc: 'A192CBC-HS384' })
.encrypt(keyMaterial)
Особенность данного алгоритма заключается в повышенной длине блока ключей и увеличенной длине MAC-тега, что повышает устойчивость к коллизиям HMAC.
Алгоритм A256CBC-HS512 представляет наиболее криптографически тяжёлую конфигурацию в семействе CBC-HMAC конструкций JWE. Он использует AES-256-CBC совместно с HMAC-SHA-512.
CEK составляет 512 бит и делится на две равные части:
Подобное распределение обеспечивает высокий уровень устойчивости как шифрования, так и аутентификации.
= _{256}((, ))
Увеличенная длина HMAC обеспечивает более высокий криптографический запас прочности при атаке на целостность сообщений.
Использование данного алгоритма идентично предыдущим вариантам,
отличие заключается только в параметре enc.
import { CompactEncrypt } from 'jose'
const payload = new TextEncoder().encode('конфиденциальный контент')
const jwe = await new CompactEncrypt(payload)
.setProtectedHeader({ alg: 'dir', enc: 'A256CBC-HS512' })
.encrypt(secretKey)
Семейство AxxxCBC-HSyyy основано на принципе разделения обязанностей:
Ключевая особенность заключается в том, что MAC вычисляется не только по ciphertext, но и по дополнительным аутентифицируемым данным:
=
Это предотвращает подмену заголовков JWE, включая алгоритмы и параметры шифрования.
Библиотека jose абстрагирует все криптографические
детали:
При работе через Node.js используется нативный crypto,
при работе в браузере — WebCrypto API.
Внутренне алгоритм не требует ручного управления MAC или padding, однако корректность входных ключей критична: длины должны строго соответствовать спецификации: