Skip to content

Darmowy generator sekretu JWT — HS256/384/512

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.

Bez śledzenia Działa w przeglądarce Bezpłatne
Twój sekret jest generowany lokalnie za pomocą crypto.getRandomValues i nigdy nie jest przesyłany, logowany ani przechowywany. Pozostaje na tym urządzeniu.
16 64

Równoważne polecenia CLI

Zgodne z poprawnością długości klucza wg RFC 7518 §3.2, dokładnością kodowań RFC 4648 dla base64url / base64 / hex, źródłem CSPRNG (crypto.getRandomValues, nigdy Math.random), prywatnością bez sieci i bez przechowywania generowanego sekretu oraz dostępnością (oznaczone kontrolki, maskowanie pokaż/ukryj, komunikaty dla czytników ekranu przy generowaniu i kopiowaniu). — Zespół ds. Bezpieczeństwa Go Tools · Jun 16, 2026

Czym jest generator sekretu JWT?

Generator sekretu JWT wytwarza losowy klucz podpisujący, którego token JSON Web Token podpisany HMAC używa, aby dowieść, że nie został naruszony. Gdy podpisujesz token za pomocą HS256, HS384 lub HS512, algorytm uruchamia HMAC na nagłówku i ładunku tokenu, używając jednego współdzielonego sekretu; weryfikator ponownie oblicza ten sam HMAC z tym samym sekretem i akceptuje token tylko wtedy, gdy podpisy się zgadzają. Całe bezpieczeństwo tego schematu opiera się na tym, że sekret jest długi i nieprzewidywalny — a dokładnie to tworzy to narzędzie: losowy ciąg o wysokiej entropii, wygenerowany w Twojej przeglądarce, o rozmiarze dobranym poprawnie do wybranego algorytmu.

Warto być precyzyjnym co do tego, co to narzędzie robi, a czego nie. Generuje klucz sekretu — wartość, którą wstawiasz do zmiennej środowiskowej JWT_SECRET — a nie gotowy token. Jeśli chcesz złożyć nagłówek i ładunek oraz podpisać je w prawdziwy JWT, to zadanie kodera JWT; aby rozłożyć istniejący token i zweryfikować jego podpis, użyj dekodera JWT. Pomyśl o sekrecie jak o kluczu, a o koderze jak o zamku, który ten klucz obsługuje: generujesz klucz raz, bezpiecznie go przechowujesz i ponownie używasz do podpisywania oraz weryfikowania wielu tokenów.

Jak długi powinien być klucz? Odpowiedź jest ustalona przez specyfikację, a nie przez preferencje. RFC 7518 §3.2 — standard JSON Web Algorithms — wymaga, aby klucz HMAC był co najmniej tak duży jak wynik haszowania: „MUSI być użyty klucz o rozmiarze takim samym jak wynik haszowania (na przykład 256 bitów dla HS256) lub większy”. Daje to czytelną tabelę, którą generator stosuje automatycznie:

| Algorytm | HMAC | Min bajtów | Min bitów | znaki hex | znaki base64 | znaki base64url | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |

Liczby znaków wynikają z kodowań RFC 4648 tych długości bajtów: hex podwaja liczbę bajtów; base64 rozszerza o 4⁄3 z dopełnieniem; base64url pomija dopełnienie, więc 32-bajtowy klucz to 43 znaki base64url, a nie 44. base64url jest natywnym kodowaniem JWT — bezpieczny dla adresów URL alfabet bez dopełnienia — i dlatego jest tu domyślnym wyjściem; sekret w base64url może znaleźć się w nagłówku, adresie URL lub wartości konfiguracji bez escapowania.

Losowość to ta część, na której nie możesz pójść na kompromis. Ten generator pobiera bajty z crypto.getRandomValues, kryptograficznie bezpiecznego generatora liczb pseudolosowych przeglądarki, tego samego prymitywu, który stoi za generowaniem kluczy Web Crypto. Nigdy nie używa Math.random, który jest szybki, ale przewidywalny i całkowicie nieodpowiedni dla klucza podpisującego — przewidywalny RNG oznacza odgadywalny sekret, a odgadywalny sekret oznacza fałszowalne tokeny. Ponieważ weryfikacja HMAC odbywa się lokalnie ze współdzielonym sekretem, atakujący, który przechwyci token, może złamać słaby klucz siłą offline bez żadnego limitu szybkości; narzędzia takie jak hashcat (tryb 16500) i jwt_tool istnieją właśnie po to. Pełnoentropijny 32-bajtowy losowy klucz jest natomiast obliczeniowo poza zasięgiem. Wniosek jest dosadny: nigdy nie używaj hasła, słowa ze słownika ani ręcznie wpisanego ciągu jako sekretu JWT — wygeneruj losowy.

Wreszcie, generowanie klucza po stronie klienta samo w sobie jest właściwością bezpieczeństwa. Sekret podpisujący nigdy nie powinien być przesyłany do strony trzeciej, nawet do witryny, która pomaga go utworzyć. Każdy bajt tutaj jest wytwarzany i kodowany w Twojej przeglądarce; nic nie jest przesyłane, logowane ani przechowywane. Gdy będziesz gotów wdrożyć klucz, przycisk Kopiuj do .env podaje Ci wiersz JWT_SECRET=…, a jeśli potrzebujesz go wpleść w większą konfigurację, pomóc może konwerter JSON na .env. Wygeneruj, skopiuj, przechowaj w menedżerze sekretów — i rotuj z nagłówkiem kid oraz nakładającymi się oknami ważności, gdy nadejdzie czas.

// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool

// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
  algorithm: 'HS256',
  expiresIn: '15m'
});

// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });

// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"])  # whitelist!

// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
//   openssl rand -base64 32
//   node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
//   python -c "import secrets; print(secrets.token_urlsafe(32))"

Kluczowe funkcje

Długość klucza świadoma algorytmu

Wybierz HS256, HS384 lub HS512, a generator automatycznie ustawi minimalny rozmiar klucza z RFC 7518 §3.2 — 32, 48 lub 64 bajty. Możesz zażądać dłuższego klucza, ale nigdy przypadkiem nie zapewnisz zbyt małego, który narusza specyfikację lub którym restrykcyjna biblioteka odmówi podpisania.

Trzy bezpieczne tekstowo formaty wyjściowe

Otrzymaj te same losowe bajty jako base64url (natywne, bezpieczne dla adresów URL kodowanie JWT bez dopełnienia — domyślne), standardowy base64 lub hex, pokazane obok siebie. base64url to najbezpieczniejszy domyślny wybór dla JWT_SECRET; zmień format, gdy konkretny loader lub biblioteka oczekuje innego. Entropia jest identyczna we wszystkich trzech.

Kryptograficznie bezpieczna losowość

Każdy sekret jest pobierany z crypto.getRandomValues, CSPRNG przeglądarki i prymitywu stojącego za generowaniem kluczy Web Crypto. Nigdy Math.random. To gwarantuje pełnoentropijny klucz bez przewidywalnej struktury — właściwość, która stawia sekret poza zasięgiem ataku siłowego offline.

Kopiuj do .env jednym kliknięciem

Kopiuj do .env opakowuje wartość w konwencjonalne przypisanie JWT_SECRET=…, jeden wiersz, bez cudzysłowów — gotowe do wklejenia do pliku .env, sekretu Dockera lub zmiennej CI bez ręcznego wpisywania nazwy klucza. Zwykłe Kopiuj pobiera surowy sekret, gdy potrzebujesz tylko wartości.

Równoważne polecenia CLI

Panel wypisuje pasujące jednowierszowce openssl rand, Node crypto.randomBytes i Python secrets dla wybranego algorytmu, więc możesz odtworzyć klucz o równej sile w skrypcie provisioningu lub Dockerfile. Większość konkurencyjnych narzędzi to pomija; tutaj jest wbudowane.

Maskowanie Pokaż / Ukryj

Sekret jest domyślnie zamaskowany, więc pozostaje poza ekranem podczas pokazu, samouczka czy udostępniania ekranu. Odsłoń go ikoną oka dopiero, gdy będziesz gotów do skopiowania. Akcje kopiowania zawsze umieszczają prawdziwy sekret na schowku, niezależnie od tego, czy jest pokazany, czy ukryty.

W 100% prywatne, tylko w przeglądarce

Sekret jest generowany, kodowany i wyświetlany w całości na Twoim urządzeniu. Żadnych żądań sieciowych, logowania ani przechowywania — sprawdź w narzędziach deweloperskich → Sieć. Klucz podpisujący nigdy nie powinien trafić do strony trzeciej, a tutaj nigdy nie trafia, co jest całym powodem, by generować go po stronie klienta.

Dostępne w 15 językach

Pełny interfejs — etykiety, instrukcje i wskazówki — jest zlokalizowany na 15 języków, więc narzędzie jest użyteczne, a porady bezpieczeństwa zrozumiałe niezależnie od tego, gdzie pracuje Twój zespół.

Przykłady krok po kroku

Wygeneruj sekret HS256 w base64url (domyślnie)

Algorytm: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256 podpisuje za pomocą HMAC-SHA-256, więc RFC 7518 §3.2 wymaga klucza o długości co najmniej 32 bajtów (256 bitów). Generator pobiera 32 kryptograficznie bezpieczne losowe bajty z crypto.getRandomValues i koduje je jako base64url — bezpieczny dla adresów URL alfabet bez dopełnienia, którego sam JWT używa. 32 bajty stają się 43-znakowym ciągiem base64url. Wstaw tę wartość prosto do JWT_SECRET. Każde kliknięcie generuje na nowo świeży sekret; nic nigdy nie jest takie samo dwa razy.

Wygeneruj sekret HS512 (64 bajty / 512 bitów)

Algorytm: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512 używa HMAC-SHA-512, którego wynik haszowania ma 64 bajty, więc RFC 7518 §3.2 nakazuje klucz o długości co najmniej 64 bajtów (512 bitów). Narzędzie wyczuwa algorytm i automatycznie podnosi liczbę bajtów — nigdy nie musisz pamiętać minimum. 64 losowe bajty kodują się do 86-znakowego ciągu base64url, 88 znaków w standardowym base64 lub 128 znaków hex. Wybranie tutaj dłuższego algorytmu to sposób na jedno kliknięcie, by zapewnić sekret o wyższej entropii.

Skopiuj sekret jako wiersz .env

Kliknij „Kopiuj do .env”
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

Kopiuj do .env opakowuje wygenerowaną wartość w konwencjonalne przypisanie JWT_SECRET=…, więc możesz wkleić ją bezpośrednio do pliku .env, sekretu Dockera lub zmiennej CI bez ręcznego wpisywania nazwy klucza. Wartość pozostaje w jednym wierszu bez otaczających cudzysłowów — dokładnie tak, jak oczekują tego loadery w stylu dotenv. Potrzebujesz zmiennej osadzonej w szerszej konfiguracji? Połącz to z konwerterem JSON na .env podlinkowanym poniżej.

Odtwórz sekret z CLI (równoważna siła)

Pokaż polecenie CLI
openssl rand -base64 32

Panel CLI wypisuje polecenia openssl, Node i Python, które pobierają tę samą liczbę bezpiecznych losowych bajtów dla wybranego algorytmu — openssl rand -base64 32 dla HS256, …48 dla HS384, …64 dla HS512. Wynik to sekret o równej sile, a nie ciąg identyczny co do bajtu: openssl emituje standardowy base64 z dopełnieniem, podczas gdy to narzędzie domyślnie używa base64url, więc alfabety i końcowe znaki się różnią. Użyj tego, co pasuje do Twojego skryptu provisioningu; entropia jest taka sama.

Pokaż i ukryj sekret

Przełącz ikonę oka
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

Sekret jest domyślnie zamaskowany, więc nie można go podejrzeć przez ramię ani przechwycić przez nagranie ekranu podczas pokazu czy udostępniania ekranu. Kliknij ikonę oka, aby go odsłonić, gdy będziesz gotów do skopiowania, i ukryj go ponownie później. Kopiuj oraz Kopiuj do .env działają niezależnie od tego, czy wartość jest pokazana, czy zamaskowana — na schowku zawsze ląduje prawdziwy sekret, nigdy kropki.

Jak korzystać z generatora sekretu JWT

  1. 1

    Wybierz algorytm podpisujący

    Wybierz HS256, HS384 lub HS512. Generator natychmiast stosuje minimalną długość klucza z RFC 7518 §3.2 dla tego wariantu HMAC — 32, 48 lub 64 bajty — więc nigdy nie musisz sprawdzać tej liczby ani ryzykować zbyt małego klucza.

  2. 2

    Wybierz format wyjściowy

    base64url jest domyślny — natywne, bezpieczne dla adresów URL kodowanie JWT bez dopełnienia. Przełącz na standardowy base64, jeśli loader tego oczekuje, lub hex, gdy system akceptuje tylko znaki 0–f. Wszystkie trzy kodują te same losowe bajty o identycznej entropii.

  3. 3

    Odsłoń i skopiuj sekret

    Sekret jest domyślnie zamaskowany, aby pozostawał poza ekranem podczas pokazu czy udostępniania ekranu. Kliknij ikonę oka, aby go odsłonić, a następnie Kopiuj, aby pobrać surową wartość, lub Kopiuj do .env, aby skopiować wiersz JWT_SECRET=… gotowy do pliku .env lub zmiennej CI.

  4. 4

    Generuj ponownie w razie potrzeby

    Kliknij Generuj ponownie po świeży, niezależny sekret pobrany z crypto.getRandomValues. Generuj po jednym na środowisko — nigdy nie używaj ponownie tego samego klucza podpisującego w deweloperce, środowisku przejściowym i produkcji.

  5. 5

    Użyj odpowiednika CLI lub przejdź do podpisywania

    Panel CLI pokazuje pasujące jednowierszowce openssl, Node i Python do skryptowego provisioningu. Z sekretem w ręku podpisz token koderem JWT i potwierdź podpis dekoderem JWT.

Częste błędy z sekretem JWT

Użyto hasła lub krótkiej frazy jako sekretu

Ciąg wybrany przez człowieka ma zbyt mało entropii jak na klucz podpisujący i można go odzyskać offline atakiem słownikowym lub siłowym, po czym dowolny token da się sfałszować. Zamiast tego wygeneruj pełnoentropijny losowy sekret.

✗ Niepoprawne
JWT_SECRET=mySuperSecret123  →  low entropy, brute-forceable
✓ Poprawne
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0  →  32 random bytes

Klucz krótszy, niż wymaga algorytm

RFC 7518 §3.2 nakazuje klucz HMAC co najmniej tak długi jak wynik haszowania. 16-bajtowy klucz dla HS256 jest poniżej granicy 32 bajtów — osłabia podpis, a niektóre biblioteki odrzucają go wprost.

✗ Niepoprawne
16-byte key with HS256  →  below the 32-byte minimum
✓ Poprawne
32-byte key with HS256  →  meets RFC 7518 §3.2

Wygenerowano klucz za pomocą Math.random

Math.random nie jest kryptograficznie bezpieczny — jego wynik jest przewidywalny, więc sekret na nim zbudowany jest odgadywalny, a tokeny nim podpisane fałszowalne. Klucz podpisujący musi pochodzić z CSPRNG, takiego jak crypto.getRandomValues.

✗ Niepoprawne
Math.random()-based key  →  predictable, unsafe
✓ Poprawne
crypto.getRandomValues key  →  full entropy

Ponownie zakodowano sekret przed podpisaniem

Przechowuj i podawaj dokładnie ten ciąg, który wytworzyło narzędzie. Dekodowanie go z base64 do bajtów w jednej usłudze, a traktowanie jako dosłownego ciągu w innej daje obu stronom różne klucze i każde sprawdzenie podpisu zawodzi.

✗ Niepoprawne
Service A: raw string · Service B: base64-decoded  →  signatures never match
✓ Poprawne
Both services use the identical stored string  →  signatures verify

Użyto tego samego sekretu we wszystkich środowiskach

Jeden JWT_SECRET współdzielony przez deweloperkę, środowisko przejściowe i produkcję oznacza, że wyciek gdziekolwiek fałszuje tokeny wszędzie, a rotacja staje się wszystko-albo-nic. Zapewnij odrębny sekret na środowisko.

✗ Niepoprawne
Same JWT_SECRET in dev, staging, prod  →  one leak breaks all
✓ Poprawne
A unique secret per environment  →  blast radius contained

Zaufano polu alg tokenu podczas weryfikacji

Pozwolenie weryfikatorowi akceptować dowolny algorytm deklarowany przez token umożliwia fałszerstwa alg:none oraz pomieszania HS/RS. Przekazuj jawną białą listę algorytmów niezależnie od tego, jak mocny jest sekret.

✗ Niepoprawne
jwt.verify(token, secret)  →  accepts the token's alg
✓ Poprawne
jwt.verify(token, secret, { algorithms: ['HS256'] })  →  pinned

Kto korzysta z tego narzędzia

Zapewnij JWT_SECRET dla nowej usługi
Stawiasz API, które wydaje tokeny podpisane HMAC? Wybierz algorytm, którego używa Twoja biblioteka, skopiuj sekret jako wiersz JWT_SECRET=… i wstaw go do środowiska usługi. Wygeneruj odrębny klucz dla deweloperki, środowiska przejściowego i produkcji — nigdy nie współdziel jednego sekretu między środowiskami.
Rotuj skompromitowany lub starzejący się sekret
Gdy podejrzewasz wyciek klucza lub po prostu nadszedł czas na rotację, wygeneruj tutaj świeży sekret, przypisz mu nowy kid i wdróż go z oknem nakładania się, aby aktywne tokeny weryfikowały się aż do wygaśnięcia. Przy potwierdzonej kompromitacji rotuj natychmiast i usuń stary klucz z zestawu akceptowanych.
Zastąp słaby lub ręcznie wpisany klucz
Odziedziczyłeś kod, którego JWT_SECRET to krótka fraza lub skopiowana wartość przykładowa? Taki klucz da się złamać siłą offline. Wygeneruj pełnoentropijny 32-bajtowy zamiennik, podmień go za oknem rotacji i zamknij lukę fałszowania tokenów, zanim zostanie wykorzystana.
Skryptuj generowanie kluczy w pipeline
Potrzebujesz klucza tworzonego w CI lub Dockerfile, a nie ręcznie? Użyj jednowierszowca openssl, Node lub Python z panelu CLI, aby wybić sekret o równej sile wewnątrz skryptu provisioningu, a tej strony użyj, aby zrozumieć długości bajtów i kodowania wytwarzane przez każde polecenie.
Bezpiecznie ucz podpisywania JWT
Przeprowadź zespół przez to, jak działa HS256, nigdy nie odsłaniając prawdziwego klucza produkcyjnego — wygeneruj na ekranie jednorazowy sekret (zamaskowany, dopóki go nie odsłonisz), podpisz przykładowy token koderem JWT i zweryfikuj go dekoderem JWT, tak aby cała pętla podpisywania i weryfikacji była widoczna.
Porównaj rozmiary kluczy HS256, HS384 i HS512
Decydujesz, który wariant HMAC ujednolicić? Przełączaj się między algorytmami, aby zobaczyć, jak rośnie wymagana długość klucza i zakodowany ciąg — 43, 64 i 86 znaków base64url — i wybierz kompromis między siłą a rozmiarem tokenu, który pasuje do Twojego systemu, zanim zapiszesz go w konfiguracji.
Generuj klucze do lokalnej deweloperki
Potrzebujesz szybkiego, prawidłowego sekretu, aby uruchomić lokalny przepływ uwierzytelniania? Wygeneruj jeden jednym kliknięciem, skopiuj go do .env i jesteś odblokowany — z prawdziwym kluczem z CSPRNG, a nie z zaślepką, którą zapomnisz wymienić przed wdrożeniem.

Jak działa generator

crypto.getRandomValues (CSPRNG)
Sekrety są generowane przez wypełnienie Uint8Array za pomocą crypto.getRandomValues, kryptograficznie bezpiecznego generatora liczb pseudolosowych Web Crypto. To to samo źródło entropii, które stoi za generowaniem kluczy Web Crypto. Math.random nie jest używany nigdzie — jest statystycznie przewidywalny i nieprzydatny do żadnego klucza kryptograficznego.
Dobór rozmiaru klucza wg RFC 7518 §3.2
Liczba bajtów na algorytm wynika z wymogu JSON Web Algorithms, by klucz HMAC był co najmniej tak duży jak wynik haszowania: 32 bajty dla HS256 (SHA-256), 48 dla HS384 (SHA-384), 64 dla HS512 (SHA-512). Wybór algorytmu ustawia minimum; generator nie wyemituje klucza poniżej dolnej granicy specyfikacji.
Kodowania RFC 4648 (base64url / base64 / hex)
Surowe bajty są kodowane alfabetami RFC 4648. base64url używa bezpiecznego dla adresów URL alfabetu bez dopełnienia (32 bajty → 43 znaki), standardowy base64 używa +, / i dopełnienia = (→ 44 znaki), a hex zapisuje dwa znaki na bajt (→ 64 znaki). Zmiana formatu ponownie koduje te same bajty — podstawowa entropia pozostaje niezmieniona.
Dlaczego base64url jest domyślny
Komponenty JWT same są kodowane w base64url, a bezpieczny dla adresów URL alfabet bez dopełnienia oznacza, że sekret w base64url nigdy nie wymaga escapowania w nagłówku, adresie URL ani pliku konfiguracji. Znaki + i / oraz końcowe = standardowego base64 mogą się w tych kontekstach łamać, więc base64url jest zachowawczym domyślnym wyborem dla JWT_SECRET.
Formatowanie Kopiuj do .env
Kopiuj do .env emituje JWT_SECRET= w jednym wierszu bez otaczających cudzysłowów — w postaci, którą loadery w stylu dotenv parsują bez modyfikacji. Surowy sekret nigdy nie zawiera znaków wymagających cudzysłowów w pliku .env, więc wiersz można bezpiecznie wkleić w niezmienionej postaci.
Polecenia CLI o równej sile, nie identyczne co do bajtu
Polecenia openssl rand -base64 N, Node randomBytes(N).toString('base64url') i Python secrets.token_urlsafe(N) z panelu CLI pobierają N bezpiecznych losowych bajtów dla wybranego algorytmu. Wytwarzają klucze o równej sile, a nie ten sam ciąg — openssl emituje standardowy base64 z dopełnieniem, więc alfabet i końcowe znaki różnią się od domyślnego base64url tego narzędzia.

Dobre praktyki dla sekretu JWT

Dopasuj długość klucza do algorytmu
Używaj co najmniej 32 bajtów dla HS256, 48 dla HS384 i 64 dla HS512, jak wymaga RFC 7518 §3.2. Ten generator robi to za Ciebie, ale jeśli dobierasz rozmiar klucza ręcznie, nigdy nie schodź poniżej długości wyniku haszowania — zbyt mały klucz HMAC zarówno osłabia podpis, jak i może zostać odrzucony przez restrykcyjne biblioteki.
Zawsze generuj za pomocą CSPRNG, nigdy hasłem
Sekret JWT to dane uwierzytelniające maszyny, których nikt nie musi zapamiętywać, więc poświęć pełną entropię: użyj kryptograficznie bezpiecznego losowego klucza, a nie frazy hasłowej, słowa ze słownika ani ręcznie wpisanego ciągu. Sekrety wybierane przez człowieka są najłatwiejszym celem ataków siłowych offline, które automatyzują narzędzia do łamania JWT.
Używaj unikalnego sekretu na środowisko
Deweloperka, środowisko przejściowe i produkcja powinny mieć własny JWT_SECRET. Współdzielenie jednego klucza oznacza, że wyciek w niskoryzykownym środowisku fałszuje tokeny wszędzie, a rotacja staje się wszystko-albo-nic. Wygeneruj tu osobny sekret dla każdego środowiska i przechowuj każdy w jego własnym zakresie menedżera sekretów.
Przypnij algorytm podczas weryfikacji
Po stronie weryfikującej zawsze przekazuj jawną białą listę algorytmów — algorithms: ['HS256'] w jsonwebtoken, algorithms=["HS256"] w PyJWT — i nigdy nie ufaj polu alg w tokenie. Akceptowanie samodeklarowanego algorytmu tokenu umożliwia klasyczne ataki alg-confusion i alg:none, niezależnie od tego, jak mocny jest Twój sekret.
Rotuj z nagłówkiem kid i nakładającymi się kluczami
Oznacz podpisane tokeny identyfikatorem klucza (kid) i publikuj aktywne klucze przez endpoint JWKS, abyś mógł rotować bez przestoju: podpisuj nowe tokeny nowym kluczem, jednocześnie akceptując stary, dopóki jego tokeny nie wygasną. Przy podejrzeniu kompromitacji pomiń nakładanie i unieważnij stary klucz natychmiast.

Najczęstsze pytania

Czy mój wygenerowany sekret JWT jest wysyłany na wasz serwer?
Nie. Sekret jest generowany w całości w Twojej przeglądarce za pomocą crypto.getRandomValues, kryptograficznie bezpiecznego generatora liczb losowych platformy. Bajty są wytwarzane na Twoim urządzeniu, kodowane lokalnie i pokazywane tylko Tobie. Nic nie jest przesyłane, nic nie jest logowane, nic nie jest zapisywane na dysku i nic nie jest wysyłane do żadnej strony trzeciej — otwórz narzędzia deweloperskie → karta Sieć, a zobaczysz, że przy kliknięciu Generuj ponownie lub Kopiuj nie wystrzeliwuje żadne żądanie. Oznacza to, że klucz, który tu wygenerujesz, należy wyłącznie do Ciebie w chwili, gdy się pojawi; żaden serwer nigdy go nie obserwuje. To cały sens generowania sekretu podpisującego po stronie klienta, a nie na stronie, która z zasady mogłaby przechowywać kopię każdego wydanego klucza.
Jak wygenerować bezpieczny sekret JWT?
Trzy kroki. Po pierwsze, wybierz algorytm podpisujący, którego używa Twoja aplikacja — HS256, HS384 lub HS512 — a generator natychmiast dobierze rozmiar klucza do minimum z RFC 7518 §3.2 dla tego wariantu (32, 48 lub 64 bajty), więc nigdy nie wybierasz liczby ręcznie ani nie ryzykujesz zbyt małego klucza. Po drugie, pozostaw kodowanie na base64url (natywny, bezpieczny dla adresów URL format JWT) lub przełącz na base64 albo hex, jeśli Twój loader konfiguracji oczekuje jednego z nich. Po trzecie, kliknij Kopiuj — albo Kopiuj do .env, aby uzyskać gotowy do wklejenia wiersz JWT_SECRET=… — i przechowuj wartość w menedżerze sekretów lub zmiennej środowiskowej, nigdy w systemie kontroli wersji. Ponieważ każdy bajt pochodzi z crypto.getRandomValues, 32-bajtowy klucz niesie już 256 bitów entropii, co jest daleko poza zasięgiem ataków siłowych offline, które łamią sekrety wybierane przez człowieka. Wolisz wiersz poleceń? Narzędzie wypisuje też równoważne jednowierszowce openssl, Node i Python, które możesz wkleić do terminala.
Jak długi powinien być sekret JWT dla HS256?
Co najmniej 32 bajty (256 bitów). RFC 7518 §3.2 — specyfikacja JSON Web Algorithms — stwierdza, że dla podpisów HMAC „MUSI być użyty klucz o rozmiarze takim samym jak wynik haszowania (na przykład 256 bitów dla HS256) lub większy”. HS256 podpisuje za pomocą HMAC-SHA-256 (256-bitowy hash), więc minimalny klucz to 32 bajty; HS384 używa HMAC-SHA-384 i potrzebuje co najmniej 48 bajtów (384 bity); HS512 używa HMAC-SHA-512 i potrzebuje co najmniej 64 bajtów (512 bitów). Ten generator dobiera poprawne minimum automatycznie, gdy wybierasz algorytm, a możesz też zażądać dłuższego klucza. Krótszy klucz jest nie tylko słabszy — narusza specyfikację, a niektóre biblioteki odmówią nim podpisywania.
Jaka jest różnica między base64url, base64 a hex i który wybrać?
Wszystkie trzy kodują te same losowe bajty; różnią się jedynie alfabetem znaków, a nie entropią. base64url to natywne kodowanie JWT — używa bezpiecznego dla adresów URL alfabetu (- i _ zamiast + i /) i pomija dopełnienie, więc nigdy nie wymaga escapowania w tokenie, adresie URL ani nagłówku. Dlatego jest tu domyślny. Standardowy base64 używa +, / i dopełnienia =; wybierz go, gdy loader konfiguracji lub biblioteka wyraźnie oczekuje klasycznego base64. hex (base16) zapisuje każdy bajt jako dwa znaki 0–f, dając dłuższy, ale jednoznaczny ciąg, przydatny, gdy system odrzuca znaki niealfanumeryczne. Dla zmiennej środowiskowej JWT_SECRET base64url jest najbezpieczniejszym domyślnym wyborem; każdy z trzech działa, dopóki przechowujesz dokładnie ten ciąg i podajesz go niezmieniony do swojej biblioteki podpisującej.
Czy słaby sekret JWT można złamać?
Tak — i to jest największe pojedyncze ryzyko związane z tokenami JWT podpisanymi HMAC. Ponieważ HS256/384/512 używają jednego współdzielonego sekretu, każdy, kto posiada token, może przeprowadzić atak siłowy lub słownikowy offline na podpis bez żadnego limitu szybkości i bez kontaktu z serwerem. Narzędzia takie jak hashcat (tryb 16500 celuje w JWT) i jwt_tool są stworzone właśnie do tego; na zwykłych GPU sekret o niskiej entropii zwykle pada w sekundy do godzin, a słowo ze słownika lub wyciekłe hasło może paść niemal natychmiast. Pełnoentropijny 32-bajtowy losowy klucz z tego generatora jest daleko poza zasięgiem ataku siłowego. Gdy atakujący odzyska sekret, może sfałszować dowolny token — w tym taki, który deklaruje uprawnienia administratora — więc siła sekretu nie jest opcjonalna. Generuj klucz podpisujący za pomocą CSPRNG, nigdy ciągu wybranego przez człowieka. Po głębsze omówienie ataków na słabe sekrety, alg-confusion i powtórki tokenów zajrzyj do naszego przewodnika po najlepszych praktykach bezpieczeństwa JWT.
Czy mogę użyć hasła jako sekretu JWT?
Możesz, ale nie powinieneś. Hasło zapamiętywalne przez człowieka — nawet długa fraza hasłowa — niesie znacznie mniej entropii niż 32 losowe bajty, co czyni je realistycznym celem ataków siłowych i słownikowych offline opisanych powyżej. Sekrety JWT to dane uwierzytelniające między maszynami; nikt nie musi ich zapamiętywać, więc nie ma powodu, by wymieniać entropię na zapamiętywalność. Wygeneruj tutaj losowy sekret, przechowuj go w menedżerze sekretów lub zmiennej środowiskowej i pozwól aplikacji go odczytać. Jeśli potrzebujesz zapamiętywalnych danych uwierzytelniających do innego celu, to zadanie dla generatora haseł, a do przechowywania haseł użytkowników — jednokierunkowego skrótu z generatora bcrypt, a nie klucza podpisującego tokeny.
Jak rotować sekret JWT bez psucia aktywnych tokenów?
Rotuj z nakładaniem się, a nie twardym przełączeniem. Dodaj identyfikator klucza (nagłówek kid) do podpisywanych tokenów, aby weryfikator wiedział, względem którego sekretu sprawdzać, i opublikuj aktywne klucze — zwykle przez endpoint JWKS, który czytają Twoje usługi. Aby rotować: wygeneruj tutaj nowy sekret, zacznij podpisywać nowe tokeny nowym kid, jednocześnie nadal akceptując poprzedni klucz do weryfikacji, i wycofaj stary klucz dopiero, gdy wygasną wszystkie tokeny nim podpisane. To okno nakładania się oznacza, że żadna ważna sesja nie zostaje unieważniona w locie. Przy podejrzeniu kompromitacji pomiń łagodne nakładanie: rotuj natychmiast, usuń stary klucz z zestawu akceptowanych i wymuś ponowne uwierzytelnienie, aby wyciekłe tokeny od razu przestały się weryfikować.
Czym klucz HMAC (HS*) różni się od klucza RSA lub ECDSA (RS*/ES*)?
Rozwiązują ten sam problem przeciwnymi modelami kluczy. HS256/384/512 to algorytmy HMAC: używają jednego symetrycznego sekretu — takiego, jaki generuje to narzędzie — który zarówno podpisuje, jak i weryfikuje, więc każda strona, która potrafi zweryfikować token, potrafi też go sfałszować. To proste i szybkie oraz idealne, gdy pojedyncza usługa zarówno wydaje, jak i sprawdza własne tokeny. RS* (RSA) i ES* (ECDSA) są asymetryczne: używają pary kluczy, w której klucz prywatny podpisuje, a osobny klucz publiczny tylko weryfikuje. Przekazujesz klucz publiczny każdemu, kto musi walidować tokeny, nigdy nie odsłaniając klucza podpisującego — właściwy wybór, gdy dostawca tożsamości wydaje tokeny weryfikowane przez wiele niezależnych usług. Ten generator wytwarza wyłącznie symetryczne sekrety HMAC. Aby złożyć i podpisać prawdziwy token kluczem, który wygenerujesz, użyj kodera JWT; aby go zbadać i zweryfikować, użyj dekodera JWT.

Powiązane narzędzia

Zobacz wszystkie narzędzia →