Формула HMAC
HMAC(K, m) = H( (K ⊕ opad) || H((K ⊕ ipad) || m) )
Ключ XOR-ится с двумя константами (ipad=0x36, opad=0x5C), данные хешируются дважды. Это защищает от Length Extension Attack, которой уязвим простой H(key || message).
Зачем HMAC, а не просто хеш
SHA-256(key + data) уязвим к Length Extension Attack: зная хеш, можно добавить данные и посчитать новый валидный хеш без ключа. HMAC этой атаке не подвержен из-за двойного хеширования.
Применения
JWT (HS256): подпись токена = HMAC-SHA256(header.payload, secret).
GitHub Webhooks: каждый POST подписан HMAC-SHA256 вашего секрета.
AWS Signature v4: цепочка HMAC для подписи запросов к API.