Generator HMAC i weryfikator podpisów
Darmowy generator i weryfikator HMAC online. Oblicz HMAC-SHA256/SHA1/SHA384/SHA512 z kluczem Tekst, Hex lub Base64 i wynikiem Hex/Base64/Base64URL. 100% w Twojej przeglądarce — klucze nigdy nie opuszczają strony.
Czym jest HMAC?
HMAC (Hash-based Message Authentication Code) to krótki tag o stałej długości, który dowodzi, że wiadomość jest zarówno niezmodyfikowana, jak i autentyczna — że została wytworzona przez kogoś, kto trzyma współdzielony tajny klucz. Zdefiniowany w RFC 2104 i FIPS 198-1, HMAC łączy dowolną kryptograficzną funkcję skrótu z tajnym kluczem w konkretnej zagnieżdżonej konstrukcji, zapisanej jako HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Wewnętrzny skrót wiąże klucz z wiadomością; zewnętrzny skrót opakowuje wynik, co właśnie czyni HMAC odpornym na ataki length-extension dotykające surowe funkcje SHA-1 i SHA-256.
HMAC jest wszędzie w nowoczesnej infrastrukturze webowej. Podpisuje webhooki, dzięki czemu możesz potwierdzić, że przychodzące żądanie naprawdę pochodzi od GitHuba, Stripe, Slacka czy Twilio i nie zostało sfałszowane. Podpisuje żądania API (AWS Signature Version 4 jest zbudowany na HMAC-SHA256), dzięki czemu serwer może uwierzytelnić wywołującego bez przesyłania hasła przez sieć. To S w HS256: JWT podpisany za pomocą HS256 niesie HMAC-SHA256 nad swoim nagłówkiem i ładunkiem, który możesz obejrzeć w koderze JWT. Stanowi też podstawę wyprowadzania kluczy TLS (HKDF), algorytmów haseł jednorazowych (HOTP/TOTP) i integralności wiadomości w niezliczonych usługach wewnętrznych.
To narzędzie oblicza HMAC w całości w Twojej przeglądarce, używając crypto.subtle.sign('HMAC', ...) z Web Crypto API — tego samego prymitywu, którego przeglądarki używają podczas uzgadniania TLS. Twój tajny klucz i wiadomość nigdy nie są przesyłane, więc jest bezpieczne dla produkcyjnych sekretów podpisujących. Ponieważ ten sam sekret można wyrazić jako surowy tekst, hex lub base64, narzędzie pozwala jawnie wybrać Kodowanie klucza, a ponieważ różni dostawcy oczekują tagu w różnych formach, możesz wygenerować Hex, Base64 lub Base64URL. Zakładka Weryfikuj pozwala sprawdzić podpis, który otrzymałeś, używając porównania w czasie stałym, dzięki czemu samo sprawdzenie nie wycieka informacji o czasie.
const crypto = require('crypto');
// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
.createHmac('sha256', 'my-secret-key')
.update('Hello, World!')
.digest('hex');
console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'
// Verify a signature in constant time
function verify(message, key, expectedHex) {
const actual = crypto.createHmac('sha256', key).update(message).digest();
const expected = Buffer.from(expectedHex, 'hex');
return actual.length === expected.length &&
crypto.timingSafeEqual(actual, expected);
} Kluczowe funkcje
Generowanie i weryfikacja w jednym narzędziu
Wygeneruj podpis w zakładce Generuj albo wklej Oczekiwany HMAC w zakładce Weryfikuj, aby uwierzytelnić przychodzący webhook lub token. Weryfikacja używa porównania w czasie stałym, więc wynik nigdy nie wycieka informacji o czasie.
Wybierz kodowanie klucza
Interpretuj swój sekret jako Tekst (UTF-8), Szesnastkowy lub Base64. To ustawienie, które większość innych narzędzi pomija — i najczęstszy powód, dla którego dwa systemy obliczają różne HMAC dla tego samego klucza.
Trzy kodowania wyjścia
Wypisz tag jako Hex (webhooki GitHuba, AWS), Base64 (Stripe, Twilio, wiele API) lub Base64URL (JWT i tokeny bezpieczne dla URL), aby pasował do Twojej integracji bez ręcznej konwersji.
Cztery natywne algorytmy
HMAC-SHA256 domyślnie, plus SHA-1, SHA-384 i SHA-512. Wszystkie działają na Web Crypto API przeglądarki, więc nie ma biblioteki kryptograficznej JavaScript, której trzeba ufać, ani straty wydajności.
100% po stronie klienta i prywatnie
Twój tajny klucz i wiadomość są przetwarzane w całości w przeglądarce i nigdy nie są wysyłane na żaden serwer. Otwórz zakładkę Network, a zobaczysz zero wychodzących żądań — bezpieczne dla produkcyjnych sekretów podpisujących.
Obliczenia na żywo
HMAC przelicza się natychmiast podczas edycji wiadomości, klucza, kodowania lub algorytmu — bez podróży w obie strony przyciskiem Generuj, więc możesz eksperymentować z kodowaniami, aż Twoja wartość zgadza się z wartością serwera.
Zbudowane na przetestowanych wektorach
Wynik jest walidowany względem oficjalnych wektorów testowych HMAC z RFC 4231, więc możesz ufać, że skróty pasują do tych produkowanych przez OpenSSL, moduł crypto Node i bibliotekę hmac Pythona.
Przykłady HMAC
Szybki start — HMAC-SHA256, wynik hex
Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699
Z kluczem „my-secret-key” (Kodowanie klucza = Tekst), algorytmem HMAC-SHA256 i Formatem wyjścia = Hex wiadomość „Hello, World!” daje cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. To kanoniczny 64-znakowy skrót hex, który otrzymujesz z crypto.createHmac('sha256', key).update(msg).digest('hex') w Node.
Weryfikacja webhooka w stylu Stripe (wynik Base64)
{"id":42,"event":"user.created"} Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=
Wielu dostawców webhooków wysyła podpis jako Base64. Z kluczem „whsec_test_secret” (Tekst), HMAC-SHA256 i Formatem wyjścia = Base64 to ciało JSON podpisuje się jako Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Wklej tę wartość w zakładce Weryfikuj, aby potwierdzić, że żądanie naprawdę pochodzi od Twojego dostawcy, zanim je przetworzysz. Wewnętrznie HMAC działa na tym samym prymitywie co nasz generator skrótów SHA-256, ale z kluczem opartym na Twoim sekrecie.
Wektor referencyjny RFC 4231
what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
To przypadek testowy 2 z RFC 4231, oficjalnego dokumentu wektorów testowych HMAC. Z kluczem „Jefe” (Tekst), HMAC-SHA256, wynikiem Hex wiadomość „what do ya want for nothing?” daje 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Dopasowanie dokładnie tej wartości to sposób na udowodnienie, że implementacja HMAC jest poprawna.
HMAC-SHA512 dla dłuższego skrótu
The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e
Przełącz algorytm na HMAC-SHA512, aby uzyskać 128-znakowy (512-bitowy) skrót. Z kluczem „key” (Tekst) i wynikiem Hex „The quick brown fox” daje powyższą wartość. SHA-512 jest na większości sprzętu 64-bitowego szybsze niż SHA-256 i daje większy wynik, choć SHA-256 pozostaje domyślnym wyborem dla interoperacyjności.
Jak wygenerować i zweryfikować HMAC
- 1
Wybierz algorytm
Wybierz HMAC-SHA256 (domyślny i właściwy wybór niemal do wszystkich webhooków, API i JWT) albo przełącz na SHA-1, SHA-384 lub SHA-512, aby dopasować się do systemu, który tego wymaga. Wszystkie cztery działają natywnie w Twojej przeglądarce przez Web Crypto API.
- 2
Wpisz tajny klucz i ustaw jego kodowanie
Wpisz lub wklej swój tajny klucz, a następnie ustaw Kodowanie klucza tak, aby pasowało do sposobu, w jaki serwer go interpretuje: Tekst (UTF-8) dla zwykłego ciągu, Hex dla bloba szesnastkowego lub Base64 dla sekretu base64. Pomyłka tutaj to główna przyczyna niezgodności HMAC, więc w razie wątpliwości wypróbuj wszystkie trzy.
- 3
Wpisz wiadomość
Wklej dokładnie te bajty, które chcesz podpisać — w przypadku webhooka jest to surowe ciało żądania, bajt po bajcie, bez ponownej serializacji ani zmian białych znaków. HMAC przelicza się na żywo podczas edycji, a nic nie jest wysyłane na serwer.
- 4
Wybierz format wyjścia i skopiuj
Wybierz Hex (styl GitHuba), Base64 (styl Stripe/AWS) lub Base64URL (styl JWT), aby pasował do tego, czego oczekuje Twoja integracja, a następnie kliknij Kopiuj, aby pobrać podpis.
- 5
Zweryfikuj istniejący podpis
Przejdź do zakładki Weryfikuj, wklej Oczekiwany HMAC z nagłówka lub tokena, a narzędzie potwierdzi w czasie stałym, czy obliczony przez Ciebie podpis pasuje — dzięki czemu możesz uwierzytelnić ładunek, zanim na nim zadziałasz.
Częste błędy w HMAC
Niezgodność kodowania klucza (przyczyna niezgodności #1)
Ten sam sekret można odczytać jako surowy tekst UTF-8, jako hex lub jako base64 — a każda interpretacja produkuje zupełnie inne bajty klucza, więc HMAC nie będzie pasował, jeśli Twoje narzędzie i serwer się nie zgadzają. Jeśli dostawca daje Ci sekret w hex lub base64, musisz zdekodować go do bajtów przed podpisaniem, a nie podpisywać ciąg jako taki. Gdy podpis nie przejdzie weryfikacji, najpierw wypróbuj klucz we wszystkich trzech opcjach Kodowania klucza.
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg) Niezgodność kodowania wyjścia
HMAC to surowe bajty; hex, base64 i base64url to tylko różne kodowania tekstowe tej samej wartości. Jeśli serwer wysyła podpis base64, a Ty porównujesz go ze swoim skrótem hex, nigdy nie będą pasować, mimo że bazowe bajty są identyczne. Dopasuj Format wyjścia do tego, czego używa nagłówek lub token.
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // Produce the same encoding the provider uses
actual = digest('base64') Podpisywanie ponownie zserializowanego JSON zamiast surowego ciała
Podpisy webhooków pokrywają dokładnie te bajty, które wysłał dostawca. Jeśli sparsujesz JSON i ponownie go zserializujesz, kolejność kluczy, odstępy i format liczb mogą się zmienić, zmieniając bajty i psując podpis. Zawsze podpisuj HMAC-iem surowe ciało żądania przechwycone przed jakimkolwiek parsowaniem.
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// Sign the raw bytes exactly as received verify(hmac(rawBody))
Użycie == zamiast porównania w czasie stałym
Porównywanie odebranego podpisu za pomocą == lub prostej równości ciągów wycieka informację o czasie, bo porównanie zatrzymuje się na pierwszym różniącym się bajcie. Przez wiele prób napastnik może odtworzyć poprawny tag. Przy weryfikacji zawsze używaj sprawdzania równości w czasie stałym.
if (received === computed) { /* trust */ } if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ } Do czego służy HMAC
- Weryfikuj podpisy webhooków
- Dostawcy tacy jak GitHub, Stripe, Slack i Twilio podpisują każdy webhook za pomocą HMAC nad ciałem żądania i sekretem, który dzielisz tylko Ty. Przelicz tag i porównaj go z nagłówkiem (na przykład X-Hub-Signature-256), aby potwierdzić, że zdarzenie jest prawdziwe, zanim na nim zadziałasz. Użyj zakładki Weryfikuj, aby zrobić to bez pisania jednorazowego kodu.
- Podpisuj żądania API
- Uwierzytelnione API często wymagają, by klient podpisał żądanie za pomocą HMAC (metoda, ścieżka, znacznik czasu, ciało) współdzielonym sekretem, zamiast wysyłać sam sekret. AWS Signature Version 4 to kanoniczny przykład. To narzędzie pozwala odtworzyć i debugować te podpisy krok po kroku.
- Zagwarantuj integralność wiadomości
- Gdy przekazujesz token, ciasteczko lub wiadomość między usługami, dołączenie HMAC pozwala odbiorcy wykryć każdą manipulację. Ponieważ tag zależy od sekretu, napastnik nie może go przeliczyć po zmodyfikowaniu danych — w przeciwieństwie do zwykłej sumy kontrolnej.
- Zrozum podpisywanie JWT HS256
- JWT podpisany za pomocą HS256 to po prostu base64url(header) + '.' + base64url(payload), podpisany za pomocą HMAC-SHA256, a wynik emitowany jako Base64URL. Ustaw tutaj algorytm na SHA-256, a wyjście na Base64URL, aby zobaczyć dokładnie, jak powstaje ten podpis, a potem sprawdź to krzyżowo w koderze JWT.
- Debuguj niezgodny podpis
- Gdy Twój HMAC nie chce pasować do serwera, to narzędzie jest najszybszym sposobem na wyizolowanie przyczyny: wypróbuj klucz jako Tekst, Hex i Base64, przełącz wyjście między Hex a Base64 i upewnij się, że podpisujesz dokładnie te surowe bajty — wszystko bez ponownego wdrażania kodu.
Jak działa HMAC
- Konstrukcja RFC 2104
- HMAC jest zdefiniowany jako H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), gdzie ipad to powtarzany bajt 0x36, a opad to powtarzany 0x5c, oba do rozmiaru bloku skrótu. Klucz dłuższy niż rozmiar bloku jest najpierw haszowany; krótszy jest dopełniany zerami. To dwuprzebiegowe zagnieżdżenie daje HMAC jego dowód bezpieczeństwa, który obowiązuje nawet wtedy, gdy bazowy skrót nie jest odporny na kolizje.
- Dlaczego skrót z kluczem bije zwykły skrót
- Zwykły skrót dowodzi tylko, że dane nie zostały przypadkowo uszkodzone, bo każdy może go przeliczyć dla dowolnej wiadomości — także zmodyfikowanej. HMAC dodaje sekret, więc tylko posiadacze klucza mogą wytworzyć poprawny tag. To zamienia samą integralność w integralność plus autentyczność, czyli właściwość, której naprawdę potrzebują webhooki i podpisane żądania.
- Odporność na length-extension
- Nagie SHA-1, SHA-256 i SHA-512 to skróty Merkle–Damgård podatne na length-extension: mając H(secret ‖ msg), napastnik może obliczyć H(secret ‖ msg ‖ extra) bez znajomości sekretu. Naiwne schematy „MAC z prefiksem sekretu” są przez to łamane. Zewnętrzny skrót HMAC neutralizuje ten atak, co jest głównym powodem, by używać HMAC zamiast haszowania sekretu i wiadomości razem.
- Wybór między SHA-256 a SHA-512
- HMAC-SHA256 produkuje 256-bitowy tag (64 znaki hex) i jest domyślnym wyborem dla interoperacyjności — szybki, wszechobecny i obsługiwany wszędzie. HMAC-SHA512 produkuje 512-bitowy tag (128 znaków hex) i często jest szybszy na 64-bitowych CPU, bo SHA-512 używa 64-bitowych słów. Wybierz SHA-256, chyba że specyfikacja lub system partnerski wymaga SHA-512; oba są bezpieczne do uwierzytelniania.
- Implementacja Web Crypto
- To narzędzie wywołuje crypto.subtle.importKey, aby załadować Twój klucz (zdekodowany z Tekst, Hex lub Base64), oraz crypto.subtle.sign('HMAC', ...), aby obliczyć tag, a następnie koduje surowe bajty jako Hex, Base64 lub Base64URL. To ta sama natywna, zaudytowana implementacja, której przeglądarka używa do TLS, działająca poza silnikiem JavaScript dla szybkości.
Najlepsze praktyki HMAC
- Użyj klucza co najmniej tak długiego jak wyjście skrótu
- Dla HMAC-SHA256 użyj sekretu o długości co najmniej 32 losowych bajtów (256 bitów); dla SHA-512 użyj 64. Krótki lub niskoentropijny klucz to najsłabsze ogniwo. Generuj klucze z kryptograficznie bezpiecznego źródła losowości — nigdy z hasła ani przewidywalnego ciągu.
- Zawsze porównuj tagi w czasie stałym
- Weryfikuj podpisy porównaniem w czasie stałym (crypto.timingSafeEqual w Node, hmac.compare_digest w Pythonie) zamiast == lub równości ciągów. Naiwne porównanie kończy się wcześnie na pierwszym różniącym się bajcie, wyciekając czas, który może pozwolić napastnikowi odtworzyć poprawny tag bajt po bajcie. Zakładka Weryfikuj tego narzędzia już porównuje w czasie stałym.
- Nigdy nie loguj ani nie ujawniaj tajnego klucza
- Trzymaj sekrety podpisujące z dala od logów, komunikatów o błędach, URL-i i kodu po stronie klienta. Przechowuj je w menedżerze sekretów lub zmiennych środowiskowych, rotuj okresowo i ogranicz każdą integrację do własnego klucza, aby jeden wyciek nie skompromitował wszystkiego.
- Preferuj HMAC-SHA256 lub mocniejszy
- Domyślnie wybieraj HMAC-SHA256; przejdź na SHA-384 lub SHA-512, gdy partner tego wymaga. Unikaj HMAC-SHA1 w nowych systemach i nigdy nie używaj HMAC-MD5. Choć HMAC lepiej toleruje słabszy skrót niż surowy podpis, start od nowoczesnego skrótu daje Ci największy margines.
- Podpisuj dokładnie te bajty, włącznie ze znacznikiem czasu
- Podpisuj surowy, niezmodyfikowany ładunek — ponowna serializacja JSON lub przycinanie białych znaków zmienia bajty i psuje weryfikację. Przy podpisywaniu żądań włącz znacznik czasu lub nonce do podpisanych danych i odrzucaj nieaktualne podpisy, aby zapobiec atakom powtórzeniowym.
FAQ o HMAC
Czym jest HMAC?
Czym HMAC różni się od zwykłego skrótu, takiego jak SHA-256?
Jak zweryfikować podpis przychodzącego webhooka?
Jakiego kodowania klucza i wyjścia używa mój serwer?
Czy HMAC-SHA256 jest bezpieczny?
Dlaczego nie ma tu HMAC-MD5 ani HMAC-SHA-3?
HS256 (HMAC) vs RS256 (RSA) — którego użyć do JWT?
Powiązane narzędzia
Zobacz wszystkie narzędzia →Generator i weryfikator skrótów bcrypt
Narzędzia bezpieczeństwa
Generuj i weryfikuj skróty bcrypt haseł online — regulowany koszt, prefiksy $2b$/$2a$/$2y$. W 100% w przeglądarce; Twoje hasło nigdy nie jest wysyłane.
Dekoder JWT
Narzędzia bezpieczeństwa
Dekoduj JWT online darmowym dekoderem JWT. Sprawdź header, payload, signature, claims i wygaśnięcie. W 100% w przeglądarce — token nie opuszcza urządzenia.
Koder i generator JWT
Narzędzia bezpieczeństwa
Darmowy generator i koder JWT online. Zbuduj header i payload, podpisz HS256, RS256 lub ES256 natychmiast. W 100% w przeglądarce — sekret i klucz nie opuszczają urządzenia.
Darmowy generator sekretu JWT — HS256/384/512
Narzędzia bezpieczeństwa
Wygeneruj mocny, zgodny z RFC sekret JWT dla HS256/384/512 — w 100% w przeglądarce, nigdy nie wysyłany na serwer. base64url, base64 lub hex; kopiuj do .env.
Generator MD5 hash i sum kontrolnych plików
Narzędzia bezpieczeństwa
Generuj hashe MD5, SHA-256, SHA-1 oraz SHA-512 online za darmo. Hashuj tekst lub pliki w przeglądarce, weryfikuj sumy kontrolne i kopiuj wyniki. Bez rejestracji.
Generator haseł — konfigurowalny, silny i bezpieczny
Narzędzia bezpieczeństwa
Wygeneruj silne losowe hasła natychmiast — za darmo, w 100% w przeglądarce. Dostosuj długość i znaki, partia do 50 z analizą entropii.