Работа с алгоритмом HS256, HS384, HS512

HS256, HS384 и HS512 относятся к семейству HMAC-алгоритмов, основанных на SHA-хэшировании. В контексте JSON Web Token (JWT) и библиотеки Jsrsasign они используются для симметричного подписывания и проверки токенов, где один и тот же секрет применяется как для генерации подписи, так и для её верификации.

HMAC (Hash-based Message Authentication Code) представляет собой механизм, обеспечивающий целостность и подлинность данных с использованием криптографической хэш-функции и секретного ключа.

В Jsrsasign алгоритмы HS256, HS384 и HS512 реализуются через SHA-2 семейство:

  • HS256 → HMAC с SHA-256
  • HS384 → HMAC с SHA-384
  • HS512 → HMAC с SHA-512

Ключевой особенностью является симметричность: секрет одинаково используется на стороне подписания и проверки.

Алгоритм HS256

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

В Jsrsasign работа с HS256 обычно строится через пространство имён KJUR.jws.JWS.

Пример создания JWT:

const header = {
  alg: "HS256",
  typ: "JWT"
};

const payload = {
  sub: "user123",
  name: "Ivan Petrov",
  admin: true,
  iat: Math.floor(Date.now() / 1000)
};

const secret = "my-secret-key";

const token = KJUR.jws.JWS.sign(
  "HS256",
  JSON.stringify(header),
  JSON.stringify(payload),
  secret
);

В этом процессе:

  • Header определяет алгоритм
  • Payload содержит полезные данные
  • Secret используется для генерации HMAC подписи

Проверка подписи HS256

Верификация токена выполняется тем же секретом:

const isValid = KJUR.jws.JWS.verify(token, secret, ["HS256"]);

Параметр массива алгоритмов позволяет ограничить допустимые схемы подписи.

Если подпись корректна, результат будет true, иначе false.

HS384: усиленная криптографическая стойкость

HS384 использует SHA-384, что увеличивает длину хэш-выхода и повышает устойчивость к коллизиям.

Создание JWT:

const token = KJUR.jws.JWS.sign(
  "HS384",
  JSON.stringify(header),
  JSON.stringify(payload),
  secret
);

Проверка:

const isValid = KJUR.jws.JWS.verify(token, secret, ["HS384"]);

HS384 применяется в системах, где требуется повышенный уровень криптографической устойчивости без перехода на асимметричные алгоритмы.

HS512: максимальная длина хэша в семействе HMAC-SHA2

HS512 использует SHA-512 и обеспечивает наиболее длинный хэш среди HMAC-вариантов JWT.

Подписание:

const token = KJUR.jws.JWS.sign(
  "HS512",
  JSON.stringify(header),
  JSON.stringify(payload),
  secret
);

Проверка:

const isValid = KJUR.jws.JWS.verify(token, secret, ["HS512"]);

Использование HS512 увеличивает вычислительную нагрузку, но обеспечивает более высокий уровень защиты от атак перебора и коллизий.

Разбор структуры JWT в Jsrsasign

JWT в Jsrsasign состоит из трёх частей:

header.payload.signature

Каждая часть кодируется в Base64URL.

Библиотека автоматически:

  • сериализует JSON
  • кодирует Base64URL
  • вычисляет HMAC
  • формирует подпись

Для ручного анализа можно декодировать токен:

const decoded = KJUR.jws.JWS.parse(token);

console.log(decoded.headerObj);
console.log(decoded.payloadObj);

Выбор алгоритма HS256 vs HS384 vs HS512

В Jsrsasign выбор алгоритма определяется балансом между:

  • производительностью
  • длиной хэша
  • уровнем безопасности

HS256:

  • минимальная нагрузка
  • стандарт индустрии
  • достаточен для большинства веб-приложений

HS384:

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

HS512:

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

Обработка ошибок при верификации

Jsrsasign не выбрасывает исключение при невалидной подписи, вместо этого возвращается false. Однако при некорректной структуре токена возможны исключения.

Пример безопасной проверки:

try {
  const result = KJUR.jws.JWS.verify(token, secret, ["HS256", "HS384", "HS512"]);
  if (result) {
    // токен валиден
  } else {
    // подпись не совпадает
  }
} catch (e) {
  // повреждённый или некорректный токен
}

Использование нескольких алгоритмов одновременно

Jsrsasign позволяет указывать набор допустимых алгоритмов:

const isValid = KJUR.jws.JWS.verify(token, secret, [
  "HS256",
  "HS384"
]);

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

Особенности безопасности HMAC в Jsrsasign

При использовании HS256/384/512 важно учитывать:

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

Jsrsasign не управляет безопасностью ключей — это зона ответственности приложения.

Генерация безопасного секрета

Пример генерации случайного ключа:

const secret = KJUR.crypto.Util.getRandomHexOfNbytes(32);

Для HS512 рекомендуется использовать не менее 512 бит (64 байта) энтропии.

Интеграция с JWS API уровня KJUR

Низкоуровневый API позволяет более гибко управлять процессом:

const sHeader = JSON.stringify({ alg: "HS256", typ: "JWT" });
const sPayload = JSON.stringify({ data: "test" });

const jws = new KJUR.jws.JWS();

const signed = jws.sign(
  "HS256",
  sHeader,
  sPayload,
  secret
);

Этот подход используется в более сложных сценариях, где требуется контроль над этапами формирования JWT.

Типичные ошибки при работе с HS256/384/512

  • несовпадение алгоритма в header и verify
  • использование разных секретов на подписи и проверке
  • передача объекта вместо JSON-строки
  • некорректное Base64URL кодирование при ручной обработке
  • попытка использовать асимметричные ключи (RSA/ECDSA) с HS-алгоритмами

Каждый из этих случаев приводит к невалидной подписи или ошибке проверки.

Совместимость с браузером и Node.js

Jsrsasign реализован на чистом JavaScript и одинаково работает:

  • в браузере
  • в Node.js
  • в гибридных окружениях

Алгоритмы HS256/384/512 не зависят от криптографических API платформы, так как реализованы внутри библиотеки через JavaScript-хэширование.