HMAC (Hash-based Message Authentication Code) на основе SHA-256 представляет собой криптографический механизм, обеспечивающий целостность и подлинность сообщения при наличии общего секретного ключа. В библиотеке Iron (Node.js, экосистема hapi) данный алгоритм используется как фундаментальный элемент защиты данных при их «запечатывании» (sealing) и проверке целостности.
HMAC строится поверх криптографической хеш-функции SHA-256 и
использует секретный ключ K вместе с сообщением
M.
Формальное определение:
(K, M) = H((K’ opad) ;|; H((K’ ipad) ;|; M))
где:
Перед вычислением HMAC ключ приводится к размеру блока SHA-256 (64 байта):
Результат — нормализованный ключ K'.
HMAC использует два прохода хеширования:
H_{inner} = H((K’ ipad) ;|; M)
На этом этапе сообщение связывается с ключом через внутренний паддинг.
HMAC = H((K’ opad) ;|; H_{inner})
Результат внутреннего хеша дополнительно защищается внешним слоем.
Ключевые свойства механизма:
Iron применяет HMAC-SHA256 как часть схемы «seal/unseal» для структурированных данных.
Основные этапы:
При создании защищённого токена выполняются следующие шаги:
= (K_{mac}, ; ciphertext ; | ; metadata)
где:
K_mac — ключ подписиciphertext — зашифрованные данныеmetadata — служебные поляРезультирующая строка обычно включает:
Все части кодируются в компактное строковое представление (base64 или аналогичный формат).
Процесс верификации выполняется в обратном порядке:
Ключевой момент — сравнение выполняется в константное время для защиты от timing-атак.
import crypto from "crypto";
function hmacSha256(key, data) {
return crypto
.createHmac("sha256", key)
.update(data)
.digest("hex");
}
const key = "secret-key";
const message = "important data";
const signature = hmacSha256(key, message);
Использование HMAC-SHA256 в Iron требует соблюдения ряда условий:
HMAC-SHA256 выполняет критическую функцию:
В сочетании с симметричным шифрованием HMAC формирует двухуровневую модель защиты, где компрометация одного слоя не приводит к полной потере безопасности.