
HMAC: пример реализации и объяснение
Пример реализации базового HMAC (Hash-based Message Authentication Code) с использованием Flask на Python.
Hash-based message authentication code (HMAC) предоставляет серверу и клиенту закрытый ключ, известный только данному конкретному серверу и данному конкретному клиенту. Клиент создает уникальный HMAC (хэш) для каждого запроса к серверу, хэшируя данные запроса вместе с закрытым ключом и отправляя результат как часть запроса. HMAC более безопасен, чем Message Authentication Code (MAC), потому что ключ и сообщение хэшируются отдельными шагами.

Когда клиент отправляет запрос к серверу, он включает следующие заголовки:
X-Authorization-Content-HMAC: HMAC-хэш (весь URI запроса, текущая Unix-метка времени (UTC) и секретный ключ HMAC)
X-Authorization-Timestamp: текущая Unix-метка времени клиента (UTC)
(request)
GET /example/users?user=test&institutionID=999&signature=7e745d74b69b7f62e8e2 HTTP/1.1
Host: example.com
X-Authorization-Content-HMAC: 1c73495878ccea24af9dd281a4c883c40a3551ba799d30f4ad7d9afb6a60fbd4
X-Authorization-Timestamp: 1711662980
[ Процесс запроса клиента ]
Когда сервер отвечает на действительный запрос, он включает следующие заголовки:
X-Response-Content-HMAC: HMAC-хэш (все тело ответа, текущая Unix-метка времени (UTC) и секретный ключ HMAC)
X-Response-Content-TimeStamp: текущая Unix-метка времени (UTC)
(response)
HTTP/2 200 OK
Date: Fri, 29 Mar 2024 06:50:49 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 52
X-Response-Content-HMAC: 529c33aac3e33bf2a95d534f8b3ac61dee2ed79232d729e571dc669417a1a2ae
X-Response-Content-TimeStamp: 1711663027
Connection: close
{"result": "ok", "users": "test", "sub": 2840345654}
[ Процесс ответа ]
Server response HMAC verification successful
--------------
Response timestamp: 2024-03-29T09:25:31
Current time: 2024-03-29T09:25:31
Time difference: 0
X-Authorization-Timestamp) с текущим временем сервера. Если метка времени выходит за определенные рамки, сервер может отклонить запрос.Если вы нашли это полезным, поставьте "звезду"🌟, чтобы поддержать дальнейшие улучшения.