Семейство HMAC-алгоритмов в контексте JWT представляет собой один из наиболее распространённых способов симметричного подписывания токенов. В библиотеке jose эти алгоритмы реализуются через механизм JWS (JSON Web Signature) и включают три основных варианта: HS256, HS384 и HS512. Все они основаны на HMAC и различаются используемой хеш-функцией семейства SHA.
HMAC (Hash-based Message Authentication Code) представляет собой механизм, который использует криптографическую хеш-функцию вместе с секретным ключом для создания подписи сообщения. В отличие от асимметричных алгоритмов (RSA, ECDSA), здесь используется один общий секрет для подписи и проверки.
Ключевые свойства:
Общая формула HMAC:
HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
где:
HS256 использует SHA-256 как базовую хеш-функцию. Это наиболее распространённый вариант в JWT.
В jose алгоритм HS256 применяется через JWS API и требует передачи секретного ключа в виде Uint8Array.
import { SignJWT } from 'jose'
const secret = new TextEncoder().encode('super-secret-key')
const jwt = await new SignJWT({ userId: 123 })
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('2h')
.sign(secret)
import { jwtVerify } from 'jose'
const { payload } = await jwtVerify(token, secret, {
algorithms: ['HS256']
})
HS256 часто выбирается как стандартный вариант, если нет строгих требований к криптостойкости выше среднего уровня.
HS384 использует SHA-384 и обеспечивает более высокий уровень криптографической стойкости по сравнению с HS256.
Применяется в системах, где требуется усиленная защита токенов без перехода на асимметричную криптографию.
import { SignJWT } from 'jose'
const secret = new TextEncoder().encode('another-secret')
const token = await new SignJWT({ role: 'admin' })
.setProtectedHeader({ alg: 'HS384' })
.setIssuedAt()
.setExpirationTime('1h')
.sign(secret)
import { jwtVerify } from 'jose'
const { payload } = await jwtVerify(token, secret, {
algorithms: ['HS384']
})
HS384 редко используется как компромиссное решение: если безопасность важнее производительности, но инфраструктура не требует HS512 или асимметричных алгоритмов.
HS512 использует SHA-512 и обеспечивает максимальную криптографическую стойкость в рамках HMAC-семейства JWT.
import { SignJWT } from 'jose'
const secret = new TextEncoder().encode('ultra-secure-secret')
const token = await new SignJWT({ permissions: ['read', 'write'] })
.setProtectedHeader({ alg: 'HS512' })
.setIssuedAt()
.setExpirationTime('15m')
.sign(secret)
import { jwtVerify } from 'jose'
const { payload } = await jwtVerify(token, secret, {
algorithms: ['HS512']
})
HS512 часто применяется в системах с повышенными требованиями к безопасности, но его использование должно учитывать нагрузку на сервер.
Все HMAC-алгоритмы в jose требуют симметричный секрет. В отличие от строковых представлений в некоторых JWT-библиотеках, jose требует бинарного формата.
const secret = new TextEncoder().encode('my-super-secret')
Для production-систем часто используют криптографически стойкие ключи:
import { randomBytes } from 'crypto'
const secret = randomBytes(32)
Длина ключа должна соответствовать уровню выбранного алгоритма:
Разница становится заметной при высокой нагрузке (миллионы токенов).
// неправильно
const secret = 'my-secret'
// правильно
const secret = new TextEncoder().encode('my-secret')
Секреты вида:
делают JWT уязвимым независимо от выбранного алгоритма.
await jwtVerify(token, secret, {
algorithms: ['HS256'] // обязательно фиксировать допустимые алгоритмы
})
Отсутствие ограничения алгоритмов может привести к атакам типа alg confusion в старых реализациях.
Секрет должен храниться вне исходного кода:
При этом переход на HS512 не всегда оправдан, если архитектура или инфраструктура ограничивает производительность.
Библиотека jose строго проверяет:
Это снижает риск некорректной конфигурации по сравнению с более “свободными” библиотеками.
HS256, HS384 и HS512 являются частью стандарта JWA (JSON Web Algorithms) и полностью совместимы с:
Это обеспечивает переносимость между различными реализациями, включая Node.js, браузерные окружения и серверные платформы.
В экосистеме JavaScript HMAC-алгоритмы через jose формируют базовый уровень криптографической защиты JWT. Их выбор определяется компромиссом между:
HS256 остаётся наиболее универсальным вариантом, HS384 используется в усиленных сценариях, HS512 применяется в системах с максимальными требованиями к криптостойкости симметричной схемы подписи.