Utilia

Generator HMAC

Oblicz HMAC-SHA1, SHA-256, SHA-384 lub SHA-512 z kluczem tekstowym, hex lub Base64, uzyskaj wynik hex i Base64 i sprawdź podpis webhooka.

Wiadomość jest podpisywana dokładnie tak, jak ją wpisano, w kodowaniu UTF-8, łącznie ze spacjami i znakami nowego wiersza.

Porównanie działa w stałym czasie, tak jak powinien to robić serwer, więc czas jego trwania nie zdradza, ile znaków się zgadza.

Jak obliczyć HMAC

  1. Wklej Wiadomość. W przypadku webhooka musi to być surowa treść żądania, bajt w bajt.
  2. Wpisz Klucz tajny i wybierz jego Format klucza: Tekst (UTF-8), Szesnastkowy lub Base64.
  3. Wybierz Algorytm: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 lub HMAC-SHA512.
  4. Wynik aktualizuje się podczas pisania; możesz też kliknąć Generuj HMAC. Otrzymasz HMAC (hex), HMAC (Base64) oraz Nagłówek podpisu webhooka (w stylu GitHub), każdy z przyciskiem Kopiuj.
  5. Aby sprawdzić otrzymany podpis, wklej go w pole Porównaj z oczekiwanym podpisem (hex, Base64 lub sha256=…). Narzędzie poinformuje, czy się zgadza.

Wiadomość jest kodowana w UTF-8 dokładnie tak, jak ją wpisano, łącznie ze spacjami i znakami nowego wiersza. Obliczenia wykorzystują Web Crypto API twojej przeglądarki; wiadomość i klucz nigdy nie opuszczają twojego urządzenia.

Czym jest HMAC

HMAC (hash-based message authentication code, RFC 2104) to kod uwierzytelniający wiadomość, który łączy klucz tajny z funkcją skrótu:

HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))

gdzie K′ to klucz dopełniony do rozmiaru bloku funkcji skrótu (a jeśli jest dłuższy – najpierw zahashowany), a ipad i opad to stałe. Tylko osoba znająca klucz może wygenerować poprawny kod dla wiadomości, a każda zmiana wiadomości całkowicie zmienia kod. Dlatego HMAC służy do podpisywania webhooków, żądań API (np. AWS Signature Version 4) i tokenów JWT typu HS256.

HMAC to nie szyfrowanie: wiadomość nie jest ukrywana. Nie jest to też hash hasła – do przechowywania haseł używaj powolnej funkcji, takiej jak bcrypt lub Argon2.

Długość wyniku zależy od algorytmu: 20 bajtów dla SHA-1, 32 dla SHA-256, 48 dla SHA-384 i 64 dla SHA-512. HMAC-SHA1 wciąż uchodzi za bezpieczny jako MAC, ale w nowych systemach wybieraj SHA-256. Zalecany jest losowy klucz co najmniej tak długi jak wynik (32 bajty dla HMAC-SHA256); klucze w formacie hex lub Base64 pozwalają wpisać takie losowe bajty bezpośrednio.

Sprawdzanie webhooka z GitHuba

GitHub podpisuje każdą dostawę twoim sekretem webhooka i wysyła wynik w nagłówku X-Hub-Signature-256 jako sha256=, po którym następuje szesnastkowy HMAC-SHA256 treści. Przykład z dokumentacji GitHuba używa sekretu It's a Secret to Everybody i treści Hello, World!; wpisz je tutaj z algorytmem HMAC-SHA256, a nagłówek pokaże:

X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17

Pole porównania przyjmuje cały wiersz nagłówka, wartość sha256=… albo sam podpis w hex lub Base64 (Stripe, Shopify i Slack stosują podobne schematy z własnymi nagłówkami i podpisywanymi ciągami). Dla SHA-384 i SHA-512 narzędzie pokazuje ogólny nagłówek X-Signature, bo nie ma tu powszechnego standardu.

Porównanie w stałym czasie

Serwer, który porównuje podpisy zwykłym porównaniem ciągów, zatrzymuje się na pierwszym różniącym się znaku. Mierząc czasy odpowiedzi, atakujący mógłby odgadywać poprawny podpis znak po znaku. Porównanie w tym narzędziu sprawdza każdy bajt niezależnie od wyniku – tak jak powinien to robić serwer za pomocą crypto.timingSafeEqual w Node.js, hmac.compare_digest w Pythonie lub hash_equals w PHP.

Najczęściej zadawane pytania

Dlaczego mój HMAC różni się od obliczonego przez serwer?

Najczęstsze przyczyny to inna wiadomość (serwer podpisuje surową treść, a ty wkleiłeś przeformatowany JSON albo różnią się znaki nowego wiersza), klucz w niewłaściwym polu Format klucza lub inny algorytm. Nawet jedna dodatkowa spacja zmienia cały wynik.

Wynik ma być w hex czy w Base64?

Oba zapisy kodują te same bajty. GitHub używa hex, a wiele innych API, np. Shopify, używa Base64. Wybierz format, którego oczekuje system odbierający.

Czy mogę użyć pustego klucza?

Narzędzie go przyjmie, ale ostrzeże: przy pustym kluczu każdy może obliczyć ten sam HMAC, więc niczego on nie dowodzi.

Czy HMAC-SHA1 jest złamany tak jak SHA-1?

Ataki kolizyjne na SHA-1 nie łamią HMAC-SHA1, który nadal uważa się za bezpieczny jako MAC. Jest wciąż obsługiwany w starszych systemach, np. w dawnym nagłówku X-Hub-Signature, ale nowe systemy powinny używać HMAC-SHA256 lub silniejszego.

Czy mój klucz tajny jest tu bezpieczny?

Klucz i wiadomość są przetwarzane wyłącznie w twojej przeglądarce i nigdy nigdzie nie są wysyłane. Mimo to obchodź się ostrożnie z kluczami produkcyjnymi i zmień klucz, jeśli podejrzewasz, że wyciekł.