AES (Advanced Encryption Standard) представляет собой симметричный алгоритм шифрования, который лежит в основе большинства современных криптографических протоколов. В контексте веб-экосистемы JavaScript он активно используется через JWE (JSON Web Encryption), а библиотека Jose реализует высокоуровневый интерфейс для работы с криптографическими примитивами, включая AES в различных режимах.
В спецификации JSON Web Encryption данные шифруются по многоступенчатой схеме:
AES отвечает за этап непосредственного шифрования payload. В Jose это
реализуется через набор алгоритмов, которые определяются параметром
enc.
Ключевая особенность архитектуры заключается в разделении ответственности:
alg — алгоритм управления ключами (например, RSA-OAEP,
ECDH-ES, direct)enc — алгоритм симметричного шифрования (AES-GCM,
AES-CBC + HMAC)В библиотеке Jose используются стандартизированные режимы AES, описанные в RFC 7518.
Наиболее современный и рекомендуемый режим:
A128GCMA192GCMA256GCMGCM объединяет шифрование и аутентификацию данных. Это означает, что помимо конфиденциальности обеспечивается целостность.
Особенности:
В Jose использование AES-GCM выглядит следующим образом:
import { generateKey, EncryptJWT, jwtDecrypt } from 'jose'
const key = await generateKey('A256GCM')
const token = await new EncryptJWT({ userId: 123 })
.setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
.setIssuedAt()
.setExpirationTime('2h')
.encrypt(key)
const { payload } = await jwtDecrypt(token, key)
Режим dir указывает, что ключ используется напрямую как
CEK, без дополнительной обёртки.
До появления GCM широко использовалась комбинация:
В Jose это представлено как:
A128CBC-HS256A192CBC-HS384A256CBC-HS512Структура алгоритма разделяет ключ на две части:
Это обеспечивает разделение криптографических обязанностей: конфиденциальность и целостность реализуются независимо.
Пример использования:
import { EncryptJWT } from 'jose'
import { createSecretKey } from 'crypto'
const key = createSecretKey(Buffer.from('your-256-bit-secret-key-your-256-bit-secret'))
const token = await new EncryptJWT({ role: 'admin' })
.setProtectedHeader({ alg: 'dir', enc: 'A256CBC-HS512' })
.setIssuedAt()
.setExpirationTime('1h')
.encrypt(key)
Алгоритм dir не выполняет шифрование ключа. Вместо
этого:
Это упрощает процесс, но требует строгого контроля ключей. Любая утечка секрета полностью компрометирует данные.
В контексте AES это означает:
AES-ключи в Jose могут быть представлены в нескольких формах:
Генерация ключей:
import { generateKey } from 'jose'
const key = await generateKey('A256GCM')
Для ручного создания ключей:
import { createSecretKey } from 'crypto'
const key = createSecretKey(Buffer.from('32-bytes-long-secret-key........'))
Важно учитывать:
Использует nonce (обычно 96 бит):
Jose генерирует nonce автоматически при вызове
.encrypt()
Использует IV (Initialization Vector):
AES-GCM поддерживает AAD (Additional Authenticated Data), которые не шифруются, но участвуют в проверке целостности.
В Jose AAD формируется из:
Это обеспечивает защиту структуры токена от подмены.
Компактный JWE состоит из пяти частей:
protectedHeader.encryptedKey.iv.ciphertext.tag
В AES-режимах:
ciphertext — результат AES-шифрованияtag — аутентификационный тег (AES-GCM или
CBC-HMAC)Пример структуры:
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0
.
.
48V1_ALb6US04U3b
.
5eym8TW_c8SuK0lt
.
XFBoMYUZodetZdvTiFvSkQ
В AES-GCM это приводит к:
generateKey вместо ручных строкAES-GCM:
AES-CBC-HMAC:
Выбор режима в Jose обычно определяется требованиями совместимости, а не предпочтениями разработчика, поскольку современные системы почти полностью перешли на GCM.
AES в Jose не существует изолированно. Он тесно связан с:
В этих схемах AES выступает конечным слоем, обеспечивающим защиту данных после доставки CEK.
В результате архитектура Jose формирует многослойную модель, где AES является центральным механизмом конфиденциальности полезной нагрузки.