Назад к вопросам
Middle
133
questionbank
Что такое HMAC и как он используется?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
HMAC (Hash-based Message Authentication Code) — это механизм для проверки целостности и аутентичности сообщения с использованием секретного ключа и криптографической хеш-функции.
Алгоритм работы:
- Формирование внутреннего и внешнего ключей из секретного ключа и констант (
ipad,opad). - Вычисление внутреннего хеша:
hash(секретный ключ XOR ipad + сообщение). - Вычисление внешнего хеша:
hash(секретный ключ XOR opad + внутренний хеш). Это и есть HMAC.
Использование:
- Аутентификация API запросов: Сервер и клиент имеют общий секретный ключ. Клиент вычисляет HMAC для данных запроса и отправляет его в заголовке. Сервер вычисляет HMAC по тем же данным и ключу, сравнивая с присланным значением. Если совпадает, запрос считается аутентичным.
- Проверка целостности данных: Если HMAC сообщения совпадает с повторно вычисленным HMAC, можно быть уверенным, что данные не были изменены во время передачи.
- Использование в JSON Web Tokens (JWT): HMAC часто применяется как алгоритм цифровой подписи (HS256, HS384, HS512) для обеспечения целостности данных токена.
Пример реализации (псевдокод):
function hmacSHA256(key, message) {
// padding константы
const blockSize = 64; // для SHA-256
const ipad = 0x36;
const opad = 0x5c;
// Подготовка ключа
let paddedKey = key;
if (key.length > blockSize) {
paddedKey = sha256(key);
}
while (paddedKey.length < blockSize) {
paddedKey += 0x00;
}
// Внутренний хеш
const innerPaddedKey = xor(paddedKey, ipad);
const innerHash = sha256(innerPaddedKey + message);
// Внешний хеш (HMAC)
const outerPaddedKey = xor(paddedKey, opad);
const hmac = sha256(outerPaddedKey + innerHash);
return hmac;
}
// В реальных библиотеках реализация оптимизирована и отличается
Ключевое отличие от простого хеширования с добавлением ключа (hash(ключ + сообщение) или hash(сообщение + ключ)) в том, что HMAC устойчив к атакам удлинения сообщений, так как используется две фазы хеширования с разными константами padding.