HMAC (Hash-based Message Authentication Code) представляет собой механизм проверки целостности и подлинности сообщений, основанный на криптографических хэш-функциях. В контексте JavaScript-библиотеки CryptoJS реализация HMAC с использованием SHA-256 и SHA-512 является одной из ключевых возможностей для построения безопасных протоколов передачи данных, подписей запросов и защиты API.
HMAC строится на основе двух входных компонентов: сообщения и секретного ключа. В отличие от обычного хэширования, где результат зависит только от данных, HMAC добавляет секретный ключ, что делает невозможным подделку подписи без знания этого ключа.
В CryptoJS HMAC реализован как обёртка над хэш-функциями. Основная структура выглядит следующим образом:
HMAC вычисляется по стандартной схеме:
Формально:
HMAC(K, m) = H((K opad) ;||; H((K ipad) ;||; m))
где:
Библиотека подключается в классическом варианте через CDN или npm:
import CryptoJS from "crypto-js";
или
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>
SHA-256 используется как стандартный баланс между безопасностью и производительностью. Длина хэша составляет 256 бит (32 байта).
const secret = "super_secret_key";
const message = "important data";
const hash = CryptoJS.HmacSHA256(message, secret).toString();
console.log(hash);
Результат по умолчанию возвращается в hex-формате.
CryptoJS работает через внутренний тип данных WordArray, что важно при работе с бинарными данными:
const key = CryptoJS.enc.Utf8.parse("super_secret_key");
const msg = CryptoJS.enc.Utf8.parse("important data");
const hash = CryptoJS.HmacSHA256(msg, key);
HMAC можно представить в разных форматах:
const hex = CryptoJS.HmacSHA256(message, secret).toString(CryptoJS.enc.Hex);
const base64 = CryptoJS.HmacSHA256(message, secret).toString(CryptoJS.enc.Base64);
Hex используется для логирования и API-подписей, Base64 — для передачи в HTTP-заголовках.
SHA-512 обеспечивает более высокий уровень криптографической стойкости за счёт длины хэша 512 бит (64 байта). Он предпочтителен в системах с повышенными требованиями к безопасности.
const secret = "super_secret_key";
const message = "important data";
const hash = CryptoJS.HmacSHA512(message, secret).toString();
console.log(hash);
const key = CryptoJS.enc.Utf8.parse("super_secret_key");
const msg = CryptoJS.enc.Utf8.parse("important data");
const hash = CryptoJS.HmacSHA512(msg, key);
SHA-256 и SHA-512 различаются не только длиной выхода, но и внутренней архитектурой.
|SHA-256| = 256 bits, |SHA-512| = 512 bits
const secret = "api_secret";
const payload = JSON.stringify({
userId: 42,
action: "transfer"
});
const signature = CryptoJS.HmacSHA256(payload, secret).toString();
Подпись передаётся вместе с запросом и проверяется на сервере.
function verify(message, secret, expectedHash) {
const computed = CryptoJS.HmacSHA512(message, secret).toString();
return computed === expectedHash;
}
const signature = CryptoJS.HmacSHA256(body, secret)
.toString(CryptoJS.enc.Hex);
if (signature !== receivedSignature) {
throw new Error("Invalid signature");
}
CryptoJS не использует нативные криптографические API браузера. Вся реализация HMAC построена на JavaScript, что приводит к следующим особенностям:
Ключ в HMAC не требует сложной подготовки, но его качество напрямую влияет на безопасность.
Пример генерации ключа:
const key = CryptoJS.lib.WordArray.random(32);
Это приводит к компрометации всей схемы подписи при утечке одного сервиса.
CryptoJS.HmacSHA256("data", "key")
и
CryptoJS.HmacSHA256(CryptoJS.enc.Utf8.parse("data"), "key")
могут давать разные результаты при неконсистентной обработке входных данных.
if (hash === signature) { }
Такие сравнения потенциально уязвимы при высоких требованиях к безопасности.
В Node.js аналог HMAC выглядит так:
import crypto from "crypto";
const hmac = crypto
.createHmac("sha256", "secret")
.update("message")
.digest("hex");
Результаты совпадают с CryptoJS при корректной обработке кодировок.
CryptoJS поддерживает несколько форматов:
Несоответствие форматов является одной из основных причин расхождения хэшей между системами.
HMAC-SHA256 чаще применяется в:
HMAC-SHA512 используется в: