HMAC (Hash-based Message Authentication Code) to kryptograficzny mechanizm służący do potwierdzania autentyczności i integralności wiadomości przy wykorzystaniu funkcji skrótu oraz tajnego klucza.
W praktyce HMAC pozwala odpowiedzieć na dwa ważne pytania:
- czy wiadomość pochodzi od strony, która zna odpowiedni tajny klucz?
- czy wiadomość nie została zmieniona po jej wygenerowaniu?
HMAC jest szeroko stosowany w systemach informatycznych, API, komunikacji między serwerami, autoryzacji żądań oraz w świecie kryptowalut. Trader może się z nim zetknąć między innymi podczas korzystania z API giełd kryptowalutowych, gdzie HMAC jest często wykorzystywany do podpisywania prywatnych żądań.
Jak działa HMAC?
HMAC łączy trzy elementy:
wiadomość + tajny klucz + funkcja hashująca
Najczęściej wykorzystywane są funkcje takie jak SHA-256 lub SHA-512.
W uproszczeniu proces wygląda następująco:
- nadawca posiada wiadomość oraz tajny klucz,
- wiadomość zostaje przetworzona razem z kluczem przez algorytm HMAC,
- powstaje unikalny kod uwierzytelniający,
- odbiorca, posiadając ten sam tajny klucz, wykonuje analogiczne obliczenie,
- jeżeli otrzymane wartości się zgadzają, wiadomość została prawidłowo uwierzytelniona i nie została zmieniona.
Kluczowe jest to, że tajny klucz nie jest przesyłany razem z wiadomością.
HMAC a funkcja hashująca
HMAC często wykorzystuje funkcję hashującą, ale nie jest tym samym co zwykły hash.
Funkcja hashująca, np. SHA-256, przekształca dane w ciąg znaków o stałej długości.
Przykładowo:
dane → SHA-256 → hash
Problem polega na tym, że zwykły hash nie potwierdza, kto wygenerował dane.
Każdy może bowiem policzyć SHA-256 dla dowolnej wiadomości.
HMAC dodaje do procesu tajny klucz:
dane + tajny klucz → HMAC-SHA256 → kod uwierzytelniający
Dzięki temu osoba, która nie zna tajnego klucza, nie powinna być w stanie wygenerować prawidłowego podpisu HMAC dla zmodyfikowanej wiadomości.
HMAC w API
Jednym z najczęstszych miejsc, w których można spotkać HMAC, są API.
Przykładowo giełda kryptowalut może wymagać, aby prywatne żądania API były podpisane przy użyciu HMAC.
Trader lub aplikacja posiada wtedy zazwyczaj:
- API Key,
- Secret Key,
- parametry żądania,
- timestamp lub nonce,
- podpis HMAC.
API Key identyfikuje użytkownika lub aplikację, natomiast Secret Key służy do wygenerowania podpisu.
Przykładowo aplikacja chce wysłać do giełdy polecenie:
„Kup 0,1 BTC po określonej cenie.”
Zamiast wysłać takie żądanie bez dodatkowego zabezpieczenia, aplikacja tworzy podpis na podstawie parametrów żądania i tajnego klucza.
Giełda otrzymuje żądanie i samodzielnie oblicza oczekiwany podpis. Jeżeli podpis się zgadza, może uznać żądanie za autentyczne.
HMAC na giełdach kryptowalutowych
W świecie kryptowalut HMAC jest szczególnie istotny ze względu na możliwość automatycznego wykonywania operacji poprzez API.
Bot tradingowy może korzystać z API giełdy, aby:
- pobierać dane rynkowe,
- sprawdzać saldo,
- pobierać historię transakcji,
- składać zlecenia,
- anulować zlecenia,
- zarządzać pozycjami.
Operacje wymagające dostępu do konta powinny być odpowiednio uwierzytelnione.
W tym miejscu często pojawia się HMAC.
Schemat może wyglądać następująco:
parametry żądania → podpis HMAC → żądanie API → weryfikacja podpisu przez giełdę
Jeżeli ktoś zmodyfikuje parametry żądania, podpis przestanie się zgadzać.
Warto przy tym pamiętać, czego HMAC nie robi. Podpis gwarantuje, że giełda wykona dokładnie to, co zlecił bot – łącznie z błędem. Jeżeli bot źle policzy wielkość pozycji, giełda przyjmie to zlecenie jako w pełni poprawne i autentyczne. Dlatego logikę wyliczania pozycji warto sprawdzić ręcznie, zanim odda się ją automatowi – choćby w kalkulatorze wielkości pozycji.
HMAC-SHA256
Jednym z najczęściej spotykanych wariantów jest HMAC-SHA256.
W tym przypadku HMAC wykorzystuje SHA-256 jako funkcję skrótu.
Nie oznacza to jednak, że HMAC-SHA256 jest po prostu „SHA-256 z kluczem”. Konstrukcja HMAC wykorzystuje określony sposób łączenia klucza z funkcją hashującą, zapewniający właściwości potrzebne do uwierzytelniania wiadomości.
W uproszczeniu można zapisać:
HMAC-SHA256 = HMAC wykorzystujący SHA-256
To właśnie ten wariant jest bardzo popularny w komunikacji API.
HMAC a szyfrowanie
HMAC nie jest szyfrowaniem.
To bardzo ważne rozróżnienie.
Szyfrowanie ma na celu ukrycie treści wiadomości przed osobami nieuprawnionymi.
HMAC ma natomiast umożliwić sprawdzenie, czy wiadomość:
- pochodzi od posiadacza tajnego klucza,
- nie została zmieniona.
HMAC nie ukrywa treści wiadomości.
Jeżeli ktoś przechwyci komunikat zawierający:
„quantity=0.1&symbol=BTCUSDT”
to HMAC nie sprawi, że treść stanie się niewidoczna.
Jego zadaniem jest zabezpieczenie autentyczności i integralności komunikatu, a nie jego poufności.
HMAC a podpis cyfrowy
HMAC różni się również od klasycznego podpisu cyfrowego.
HMAC wykorzystuje jeden wspólny tajny klucz. Zarówno nadawca, jak i odbiorca muszą posiadać ten sam sekret.
W przypadku podpisu cyfrowego wykorzystuje się natomiast kryptografię asymetryczną:
- klucz prywatny służy do podpisywania,
- klucz publiczny służy do weryfikacji.
HMAC jest dzięki temu prosty i szybki, ale wymaga bezpiecznego współdzielenia tajnego klucza.
HMAC i bezpieczeństwo API
Bezpieczeństwo HMAC zależy w dużym stopniu od bezpieczeństwa tajnego klucza.
Jeżeli Secret Key wycieknie, osoba, która go posiada, może potencjalnie generować prawidłowe podpisy HMAC.
Dlatego przy korzystaniu z API giełd kryptowalutowych należy szczególnie uważać na:
- przechowywanie Secret Key,
- logowanie kluczy w aplikacji,
- przesyłanie kluczy przez komunikatory,
- umieszczanie kluczy w publicznym kodzie,
- repozytoria GitHub,
- zrzuty ekranu,
- pliki konfiguracyjne,
- nieznane boty i aplikacje.
Secret Key powinien być traktowany jak hasło.
Nie powinien być publikowany ani udostępniany osobom trzecim.
W praktyce ograniczam też szkody na wypadek wycieku: klucz API dla bota nie ma uprawnień do wypłat, a jeśli giełda na to pozwala, działa wyłącznie z określonych adresów IP. Przed uruchomieniem jakiejkolwiek automatyzacji przechodzę tę samą listę kontrolną co przy ręcznym handlu – checklista tradera sprawdza się tu równie dobrze.
HMAC w praktyce tradera
Dla zwykłego użytkownika giełdy HMAC może być całkowicie niewidoczny. Pojawia się jednak w tle, gdy korzystam z aplikacji lub własnego programu komunikującego się z API giełdy.
Przykładowo mój bot tradingowy może otrzymać:
API Key: identyfikator aplikacji
Secret Key: tajny klucz
Timestamp: czas żądania
Request: parametry operacji
Następnie tworzy odpowiedni podpis HMAC.
Giełda może sprawdzić:
Czy podpis jest prawidłowy?
Jeżeli tak, żądanie może zostać zaakceptowane.
Jeżeli ktoś zmieni np. ilość BTC z:
0,1 BTC
na:
10 BTC
podpis przestanie odpowiadać zawartości żądania, o ile atakujący nie zna tajnego klucza.
HMAC chroni przed tym, że ktoś po drodze zamieni 0,1 BTC na 10 BTC. Nie chroni przed tym, że zrobi to Twój własny program. Literówka w konfiguracji, pomylona jednostka albo błąd w pętli zostaną podpisane tak samo starannie jak poprawne zlecenie. Bot, który bez kontroli powtarza zbyt duże pozycje, to prosta droga do zjawiska opisanego w kalkulatorze ruiny gracza – tyle że zrealizowanego znacznie szybciej, niż zrobiłby to człowiek.
HMAC i timestamp
W API często stosuje się również timestamp lub nonce.
Ma to znaczenie między innymi ze względu na ochronę przed tzw. Replay Attack, czyli ponownym wykorzystaniem wcześniej przechwyconego prawidłowego żądania.
Przykładowo aplikacja może podpisać:
symbol + cena + ilość + timestamp
Zmiana któregokolwiek z tych elementów spowoduje zmianę podpisu.
Dodatkowo serwer może odrzucić żądanie, jeżeli timestamp jest zbyt stary.
Dzięki temu samo przechwycenie wcześniej poprawnego żądania nie musi oznaczać możliwości jego późniejszego ponownego wykorzystania.
HMAC a API Key
API Key i HMAC pełnią różne funkcje.
API Key pozwala serwerowi rozpoznać, którego użytkownika lub aplikacji dotyczy żądanie.
Secret Key jest tajnym materiałem wykorzystywanym do wygenerowania podpisu.
HMAC jest mechanizmem, który przy wykorzystaniu tego sekretu tworzy podpis pozwalający zweryfikować autentyczność żądania.
Można więc uprościć:
API Key = identyfikacja
Secret Key = sekret
HMAC = podpis uwierzytelniający
Najważniejsza zasada
HMAC nie służy do przewidywania ceny, analizy rynku ani generowania sygnałów tradingowych. Jest elementem infrastruktury bezpieczeństwa.
Trader może jednak spotkać go bardzo często, szczególnie podczas korzystania z API giełd kryptowalutowych lub tworzenia własnych botów.
Najprościej zapamiętać:
HMAC to kryptograficzny sposób podpisywania wiadomości przy użyciu tajnego klucza, który pozwala sprawdzić jej autentyczność i integralność.
W przypadku API giełdy oznacza to w praktyce, że giełda może zweryfikować, czy dane żądanie rzeczywiście zostało wygenerowane przez aplikację posiadającą właściwy Secret Key i czy jego treść nie została po drodze zmieniona.


