Skip to main content
CheckTown
Narzędzia dev

HMAC: jak działa uwierzytelnianie wiadomości oparte na hashu

Opublikowano 6 min czytania
W tym artykule

Czym jest HMAC?

HMAC (Hash-based Message Authentication Code) to mechanizm kryptograficzny, ktory łączy tajny klucz z funkcja hashujaca w celu wygenerowania kodu uwierzytelniania wiadomości. W przeciwieństwie do zwykłego hasha, HMAC dowodzi zarowno integralności, jak i autentyczności wiadomości.

HMAC jest zdefiniowany w RFC 2104 i jest stosowany w TLS, IPsec, podpisach JWT i weryfikacji webhookow API. Algorytm jest odporny na ataki rozszerzenia długości, ktore dotykaja zwykłych funkcji hashujacych.

Jak działa HMAC

HMAC wykorzystuje dwuprzebiegowe podejście do hashowania z wewnętrznym i zewnetrznym wypelnieniem. Tajny klucz jest uzupelniany do rozmiaru bloku funkcji hashujacej i łączony z dwiema różnymi stałymi.

  • Hash wewnętrzny — klucz jest łączony z ipad (0x36), konkatenowany z wiadomoscia i hashowany: H(K XOR ipad || wiadomość)
  • Hash zewnętrzny — klucz jest łączony z opad (0x5C), konkatenowany z wynikiem hasha wewnętrznego: H(K XOR opad || inner_hash)
  • Wynik końcowy — wynik hasha zewnętrznego jest wartością HMAC, zazwyczaj reprezentowana jako ciag szesnastkowy

Ta konstrukcja podwojnego hashowania zapobiega atakom rozszerzenia długości. Nawet jeśli atakujący zna H(wiadomość), nie moze obliczyc HMAC(klucz, wiadomość || dodatkowe_dane) bez tajnego klucza.

Algorytmy HMAC

Konstrukcja HMAC działa z dowolna kryptograficzna funkcja hashujaca. Najpopularniejsze wybory to SHA-256, SHA-384 i SHA-512.

  • HMAC-SHA256 — wyjście 256-bitowe, najszerzej stosowany wariant do uwierzytelniania API, podpisow JWT HS256 i weryfikacji webhookow. Zalecany rozmiar klucza: 32 bajty
  • HMAC-SHA384 — wyjście 384-bitowe, stosowany w zestawach szyfrowania TLS 1.3 i aplikacjach o wysokim bezpieczeństwie. Zalecany rozmiar klucza: 48 bajtow
  • HMAC-SHA512 — wyjście 512-bitowe, preferowany gdy potrzebny jest maksymalny margines bezpieczeństwa. Zalecany rozmiar klucza: 64 bajty

Klucz powinien byc co najmniej tak długi jak wyjście hasha. Dla większości zastosowan HMAC-SHA256 z losowym 32-bajtowym kluczem zapewnia doskonale bezpieczeństwo.

Wypróbuj za darmo — bez rejestracji

Generuj podpisy HMAC →

Typowe zastosowania

HMAC jest fundamentem wielu protokołów bezpieczeństwa i schematow uwierzytelniania API.

  • Uwierzytelnianie API — serwisy takie jak Stripe, GitHub i AWS używają podpisow HMAC do weryfikacji ladunkow webhookow
  • Podpisywanie JWT — algorytmy HS256, HS384 i HS512 używają HMAC do podpisywania ładunku tokena
  • Integralność wiadomości — HMAC weryfikuje, ze dane nie zostały zmienione podczas transmisji
  • OAuth 1.0a — metoda podpisu HMAC-SHA1 podpisuje parametry żądania OAuth w celu udowodnienia autoryzacji

HMAC vs inne metody uwierzytelniania

HMAC jest jednym z kilku podejść do uwierzytelniania wiadomości. Każde ma różne kompromisy w zakresie bezpieczeństwa, wydajności i zarządzania kluczami.

  • HMAC vs podpisy cyfrowe — HMAC używa współdzielonego tajnego klucza (symetryczny), podpisy cyfrowe używają par kluczy (asymetryczny). HMAC jest szybszy, ale wymaga wspoldzielenia sekretu.
  • HMAC vs klucze API — klucze API sa prostymi tokenami nosnika. HMAC podpisuje zawartość żądania, zapobiegając falszowaniu nowych zadan.
  • HMAC vs zwykłe hashowanie — hashowanie dowodzi integralności, ale nie autentyczności. HMAC wymaga tajnego klucza.

Często zadawane pytania

Jaka jest idealna długość klucza HMAC?

Klucz powinien byc co najmniej tak długi jak wyjście hasha — 32 bajty dla HMAC-SHA256, 48 dla HMAC-SHA384, 64 dla HMAC-SHA512. Krotsze klucze oslabiaja bezpieczeństwo.

Czy HMAC to to samo co szyfrowanie?

Nie. HMAC zapewnia uwierzytelnianie i integralność, nie poufnosc. Wiadomość pozostaje czytelna. Użyj szyfrowania (AES, ChaCha20) oprocz HMAC do ukrycia zawartości.

Czy moge używać HMAC w przeglądarce z Web Crypto API?

Tak. Web Crypto API obsługuje HMAC natywnie przez crypto.subtle.importKey() i crypto.subtle.sign(). Możesz generowac podpisy HMAC w całości po stronie klienta.

Powiązane narzędzia