Cryptology Academy · Lekcja

HMAC w API: podpisywanie żądań

Zaimplementować podpisywanie żądań za pomocą HMAC i zapobieganie atakom typu replay

Lekcja 3 z 413 kroki

HMAC w API: podpisywanie żądań to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Wprowadzenie

Podpisywanie żądań na podstawie HMAC jest używane przez AWS, GitHub, Stripe i Twilio do uwierzytelniania wywołań API. W tej lekcji zbudujemy kompletny system podpisywania żądań.

Dlaczego podpisywać żądania API?

Klucze API w adresach URL mogą trafiać do logów serwerów proxy, historii przeglądarki i logów serwera. Podpisywanie żądań obejmuje w kodzie MAC całą treść żądania, dzięki czemu gwarantuje, że dane nie zostały zmodyfikowane, a sam klucz nie zostanie ujawniony.

AWS Signature Version 4

AWS SigV4 oblicza: 1. Żądanie kanoniczne (metoda + URL + nagłówki + skrót treści) 2. Ciąg znaków do podpisania (data + region + usługa + skrót żądania kanonicznego) 3. Klucz podpisywania = HMAC(HMAC(HMAC(HMAC('AWS4'+secret, date), region), service), 'aws4_request') 4. Podpis = HMAC(signing_key, string_to_sign)

Weryfikacja webhooków GitHub

GitHub podpisuje każdą treść webhooka: X-Hub-Signature-256: sha256=HMACHEX Weryfikacja: import hmac expected = 'sha256=' + hmac.new(secret, payload, 'sha256').hexdigest() hmac.compare_digest(expected, received_signature)

Zagrożenie atakiem typu replay

Jeśli atakujący przechwyci prawidłowo podpisane żądanie, może wysłać je ponownie wiele razy. Transfer o wartości 100 USD, podpisany tylko raz, mógłby zostać odtworzony 1000 razy. Sam HMAC NIE zapobiega atakom typu replay.

Zapobieganie atakom replay za pomocą znacznika czasu

Należy dołączyć znacznik czasu do podpisywanej wiadomości. Żądania starsze niż 5 minut należy odrzucać. Stripe wysyła nagłówek X-Stripe-Signature ze znacznikiem czasu. GitHub używa X-GitHub-Delivery (UUID), a nie rozwiązania opartego na znaczniku czasu.

Zapobieganie atakom replay za pomocą nonce

Należy dołączyć losowy nonce do każdego żądania. Serwer przechowuje użyte nonce (w Redis z TTL). Każde żądanie zawierające wcześniej użyty nonce należy odrzucić. To rozwiązanie jest bardziej niezawodne niż znaczniki czasu w systemach rozproszonych.

Implementacja podpisywania żądań

import hmac, hashlib, time, os def sign_request(secret, method, path, body, timestamp=None): ts = timestamp or str(int(time.time())) payload = f'{method}\n{path}\n{ts}\n' + hashlib.sha256(body).hexdigest() sig = hmac.new(secret.encode(), payload.encode(), 'sha256').hexdigest() return ts, sig

Weryfikacja po stronie serwera

def verify_request(secret, method, path, body, ts, received_sig): # Check timestamp freshness if abs(time.time() - int(ts)) > 300: # 5 minutes return False # Recompute and compare _, expected = sign_request(secret, method, path, body, ts) return hmac.compare_digest(expected, received_sig)

JWT z HMAC (HS256)

JWT-y HS256 używają HMAC-SHA256 ze współdzielonym sekretem. Serwer zarówno podpisuje tokeny, jak i je weryfikuje. Ograniczenie: każda strona posiadająca klucz może fałszować tokeny. W przypadku zaufania asymetrycznego (uwierzytelniania przez podmiot trzeci) należy użyć RS256 lub ES256.

Strategia rotacji kluczy

Klucze HMAC należy okresowo rotować: wygenerować nowy klucz, obsługiwać stary i nowy klucz w okresie przejściowym (24 godziny), a następnie wycofać stary klucz. AWS SigV4 wyprowadza klucze z sekretów zawierających datę, co umożliwia codzienną rotację.

Szybki test

Dlaczego samo podpisywanie żądań za pomocą HMAC nie wystarcza do zapobiegania atakom typu replay?

Podsumowanie

Zaimplementowano podpisywanie żądań za pomocą HMAC wraz z ochroną przed atakami typu replay. Następnie porównamy CMAC i Poly1305 jako alternatywne mechanizmy MAC oparte na szyfrach blokowych.
Bezpłatny start

Ucz się Cryptology Academy dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
67
Lekcje
261

Często zadawane pytania

Czy lekcja „HMAC w API: podpisywanie żądań” jest bezpłatna?

Tak — pełny tekst „HMAC w API: podpisywanie żądań” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „HMAC w API: podpisywanie żądań”?

Zaimplementować podpisywanie żądań za pomocą HMAC i zapobieganie atakom typu replay Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?

Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „HMAC w API: podpisywanie żądań”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?

Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcje MAC i ataki polegające na rozszerzeniu długości
  2. Konstrukcja HMAC i dowód bezpieczeństwa
  3. HMAC w API: podpisywanie żądań
  4. CMAC i Poly1305: MAC oparte na szyfrze blokowym
← Powrót do Cryptology Academy