🟣Как работает HMAC: клиент и сервер заранее знают общий секретный ключ. Клиент берёт данные запроса, считает от них криптографическую подпись и отправляет её вместе с запросом.
GET /api/user/42
X-Timestamp: 1714000000
X-Signature: 8f3a91...
Сервер повторяет расчёт с тем же секретом. Подписи совпали - запрос не изменён и знает секрет.
🟣Что именно подписывается: обычно метод, путь, timestamp, nonce и тело запроса. Например:
POST
/api/payment
1714000000
abc123
{"amount":100}
Из этой строки и секретного ключа получается HMAC:
HMAC-SHA256(data, secret)🟣Почему просто отправить секрет нельзя: клиент не передаёт ключ серверу при каждом запросе. Он используется только для вычисления подписи.
Если атакующий изменит:
{"amount":100}на:
{"amount":100000}подпись уже не совпадёт.
🟣Но HMAC сам по себе не защищает от повторной отправки запроса. Если украсть настоящий запрос, его можно попробовать отправить ещё раз.
Поэтому рядом используют timestamp и nonce:
timestamp → запрос должен быть свежим
nonce → конкретный запрос можно использовать один раз
signature → данные нельзя незаметно изменить
Такую схему часто используют API, вебхуки и взаимодействие между сервисами, где важно доказать не только «кто отправил запрос», но и что его содержимое не меняли по дороге.
Серверная Админа | Zeroday | #HMAC
