Preveriti podpis JSON Web Token (JWT)
- Nadzorna plošča
- Dokumentacija
- API
Zakaj preverjati podpis JWT?
Spletni žeton JSON (JWT) je razdeljen na tri dele, ločene s pikami:
header.payload.signature. Dekodiranje JWT je preprosto stvar branja prvih dveh
deli (ki so Base64URL). Vsakdo lahko to naredi in vsak lahkonaredi
JWT s tovorom po vaši izbiri. Tisto, zaradi česar je JWT vreden zaupanja, je samo
podpis: brez preverjanja sprejemanje JWT pomeni, da v svoj dom spustite vsakogar, ki
pretvarja se, da je nekdo, ne da bi zahteval identifikacijo.
To orodje preveri podpis JWT iz ključa. Ni zadovoljen z dekodiranje: ponovno izračuna podpis iz glave, tovora in vašega ključa, nato pa ga primerja s podpisom žetona. Če se ujemata, je žeton pristen. Sicer je bilo ponarejeno, spremenjen ali podpisan z drugim ključem.
Preverjanje je temelj vsake arhitekture, ki uporablja JWT za
avtentikacija ali avtorizacija: brez veljavnega podpisa lahko tovor laže.
Napadalec, ki spremeni "role":"user" v "role":"admin", ne bi imel
težave pri tem, če je strežnik preveril samo obliko žetona in ne njegovega podpisa.
Skupni algoritmi
Specifikacija JWT (RFC 7518, spletni algoritmi JSON) definira več družin algoritmov. Tukaj je najbolj uporabljeni v proizvodnji:
- HMAC (HS256, HS384, HS512): simetrični podpis, ki temelji na HMAC-SHA. The Za podpisovanje in preverjanje se uporablja isti tajni ključ. Enostavna nastavitev, učinkovito, toda vsaka stranka, ki je sposobna preveriti žeton, ga je sposobna tudi izdati. Prilagojeno na scenarije, kjer sta izdajatelj in preveritelj ista ekipa ali oddelek.
- RSA (RS256, RS384, RS512): asimetrični podpis. Zasebni ključ znak, javni ključ preveri. Idealno, ko oddajnik in Preverjevalci so ločene entitete (OAuth2, OpenID Connect, Identity Federation). je algoritem, ki ga podpira večina ponudnikov javne identitete.
- ECDSA (ES256, ES384): asimetrični podpis na eliptičnih krivuljah. Ista logika kot RSA (zasebni ključ za podpis, javni ključ za preverjanje), vendar s ključi in bolj kompaktni podpisi za enakovredno raven varnosti. Vse bolj razširjena v moderne arhitekture.
Kako zagotoviti ključ
Format pričakovanega ključa je odvisen od algoritma, deklariranega v glavi JWT:
- HS256, HS384, HS512: ključ je skrivni niz (niz).
To je skrivnost, ki se deli z izdajateljem, pogosto shranjena v spremenljivki okolja, kot je
JWT_SECRET. Brez posebnega oblikovanja, samo neobdelana vrednost. - RS256, RS384, RS512: ključ je javni ključ RSA v formatu PEM,
ki se začne z
-----BEGIN PUBLIC KEY-----in konča z-----KONEC JAVNEGA KLJUČA-----. Ohranite nove vrstice takšne, kot so, sicer OpenSSL ga noče razčleniti. - ES256, ES384: ključ je javni ključ ECDSA v formatu PEM, na ustrezni krivulji (P-256 za ES256, P-384 za ES384).
Primer pričakovanega javnega ključa RSA
-----ZAČETEK JAVNEGA KLJUČA-----
MIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx...
...vQIDAQAB
-----KONEC JAVNEGA KLJUČA-----
Kako poteka preverjanje?
Naš strežnik natančno reproducira operacijo, ki jo izvede oddajnik:
- JWT ločuje na glavo, obremenitev in podpis.
- Združuje
base64url(header) + "." + base64url(tovor). - Za HMAC izračuna HMAC-SHA-256/384/512 z vašim tajnim ključem in ga nato primerja z
podpis, prejet prek
hash_equals(konstantna časovna primerjava za preprečevanje napadov čas). - Za RSA pokliče
openssl_verifyz vašim javnim ključem v formatu PEM.
Primeri uporabe
- Odpravljanje napak pri preverjanju pristnosti API-ja: prejmete 401, preverite, ali je vaš žeton dobro podpisan s pričakovanim ključem.
- Preverjanje žetona, prejetega od dobavitelja: partner (Auth0, Keycloak, Cognito, Okta) vam pošlje JWT-je, podpisane v RS256; želite potrditi, da prihajajo iz njega z njegovim javnim ključem.
- Varnostna revizija: preverite, ali storitev tretje osebe pravilno podpisuje svoje žetone z robustnim algoritmom in ne v HS256 z nizko tajnostjo.
- Ročni testi: preverite, ali JWT, ki ga ustvari vaša koda, prestane preverjanje s posredovanim javnim ključem.
- Hitro preverjanje prejetega žetona: med integracijo SSO ali Partner API, preverite čez nekaj sekund, ali podpis/veriga ključev deluje prej da napišete najmanjšo vrstico kode.
Kako uporabljati orodje
- Prilepite celoten JWT (trije deli, ločeni s pikami).
- Navedite ključ, prilagojen algoritmu glave:
- Za HS256, HS384 ali HS512 je ključ skrivni niz
deliz oddajnikom. Je brezplačen niz, pogosto shranjen v a
spremenljivka okolja, kot je
JWT_SECRET. - Za RS256, RS384 ali RS512 je ključ javni ključ v obliki
PEM, ki se začne z
-----BEGIN PUBLIC KEY-----in konča z-----KONEC JAVNEGA KLJUČA-----.
- Za HS256, HS384 ali HS512 je ključ skrivni niz
deliz oddajnikom. Je brezplačen niz, pogosto shranjen v a
spremenljivka okolja, kot je
- Izvedite preverjanje. Orodje prikaže status (veljavno ali neveljavno) in dekodirano obremenitev.
Pogoste pasti, ki se jim je treba izogniti
- Algoritem "none": specifikacija dovoljuje
alg: none, kar pomeni "ne podpis". Klasična napaka je izdelava žetona s to glavo v upanju, da bo strežnik to sprejme. Naše orodje sistematično zavrača žetone zalg: brez. - Zmeda HMAC proti RSA (zmeda algoritma): napadalec spremeni algoritem
RS256vHS256in podpiše tovor z uporabljenim javnim ključem RSA kot skrivnost HMAC. Če strežnik ne nadzoruje algoritma, sprejme žeton. Vedno zakleni pričakovani algoritem na strani strežnika. - Trdno kodirane skrivnosti HMAC: upodobitev skrivnosti, odobrene v repozitoriju Git vse zaupanje v žetone je izginilo. Shranjevanje skrivnosti v spremenljivke okolja oz varna aplikacija.
- Javni ključ proti zasebnemu ključu: za preverjanje JWT, podpisanega v RSA ali ECDSA, ponuja javni ključ, nikoli zasebnega. Zasebni se uporablja samo za podpisovanje in ne nikoli ne sme izstopiti iz oddajnika.
- Potek prezrt: veljaven podpis na potečenem žetonu ne bi smel
nikoli ne bo sprejet. Ne pozabite preveriti
expinnbf. - Nenadzorovano občinstvo: žeton, namenjen za API A, ne bi smel biti sprejet
API B. Preverite zahtevek
aud.
Časovni zahtevki: exp in nbf
Poleg podpisa mora veljaven JWT upoštevati tudi svoje časovne omejitve:
- exp (iztek): žeton po tem datumu ni več veljaven.
- nbf (ne prej): žeton pred tem datumom še ni veljaven.
Naše orodje izrecno sporoči, ko je žeton potekel ali še ni veljavni, tudi če je njegov podpis pravilen. To je pomembno: veljaven podpis na a Žetona, ki je potekel, ne smete nikoli sprejeti v produkciji.
Razlika z našim dekoderjem JWT
Naš dekoder JWT samo dekodira glavo in obremenitev, da jih naredite berljive. Ne izvaja nobenega preverjanja podpisa in ne zahtevaj ključa. Uporabite ga za hiter pregled vsebine žetona. Uporabite Preverjevalnik JWT (ta stran) vsakič, ko morate dokazati, da je žeton verodostojno. Če želite narediti podpisan JWT za testiranje, uporabite naš Graditelj JWT.
Pogosta vprašanja
Zakaj RS256 namesto HS256?
Pri HS256 si izdajatelj in preveritelj delita isto skrivnost: vse zato lahko overitelj izda žetone. Obvladljivo je, ko nadzorujete oba konca. Od da govorimo o enem samem ponudniku identitete z več potrošniškimi storitvami, zamenjamo v RS256: oddajnik hrani zasebni ključ, javni ključ razdelimo vsem API-jem, ki treba preveriti. Noben porabniški API potem ne more ponarediti žetonov.
Kako pridobim javni ključ ponudnika identitete (IdP)?
Večina IdP-jev izpostavi standardizirano končno točko JWKS (npr.
https://example.com/.well-known/jwks.json). Ta končna točka vrne JSON, ki vsebuje
aktivnih javnih ključev. Pretvorite lahko vnos JWK, ki se ujema s kid
iz glave vašega JWT v ključ PEM prek ukaza openssl ali prek knjižnice
JWKS iz vašega sklada (npr. jose-jwt, jwks-rsa).
Kaj storiti, če preverjanje ne uspe?
Najprej preverite algoritem: žetona, podpisanega v HS256, ni mogoče preveriti s ključem RSA in
obratno. Nato preverite ključ: en dodaten bel znak, ena manjka nova vrstica
v ključu PEM ali skrivnost HMAC, ki se nekoliko razlikuje od tiste, ki jo uporablja izdajatelj
so dovolj, da ne uspejo pri preverjanju. Če je IdP izvedel rotacijo ključev, vaš
kid lahko pokaže na ključ, ki ga nimate več.
Kaj je JWKS?
JWKS (JSON Web Key Set, RFC 7517) je format JSON, ki opisuje nabor
javnih ključev. Vsak ključ identificira kid (ID ključa) in JWT, ki ga je treba preveriti
se v svoji glavi sklicuje na tega kid. Mehanizem omogoča vrtenje IdP
ključe, ne da bi zlomili preglednike: preprosto poizvedujejo po končni točki JWKS, da pridobijo
ključ, ki ustreza kid prejetega žetona.
Kako ustvarim par ključev RSA za podpis svojih JWT?
Z OpenSSL: openssl genrsa -out private.pem 2048 nato
openssl rsa -in private.pem -pubout -out public.pem. Stranski znak zasebnega ključa
izdajatelja, javni ključ preverja na strani potrošnika. Za nove storitve raje 3072 oz
4096 bitov.
Ali naj bo JWT poleg podpisovanja (JWE) šifriran?
Podpisani JWT (JWS) zagotavlja celovitost in pristnost, vendar koristni tovor ostane berljiv z kdor ga pobere. Če žeton vsebuje občutljive podatke (notranji identifikatorji, pravice podrobni osebni podatki), razmislite o formatu JWE (JSON Web Encryption). ki poleg podpisa šifrira koristni tovor.
Primer zahteve
curl -X POST https://cdrn.fr/api/v1/tools/jwt-verifier/execute \
-H "Content-Type: application/json" \
-d '{"token":"...","key":"..."}'
Vhodna shema
| Polje | Tip | Obvezno | Privzeto |
|---|---|---|---|
token |
text | ✓ | – |
key |
text | ✓ | – |
Končne točke
GET https://cdrn.fr/api/v1/tools- izpiše vsa razpoložljiva orodjaGET https://cdrn.fr/api/v1/tools/jwt-verifier- pridobi shemo tega orodjaPOST https://cdrn.fr/api/v1/tools/jwt-verifier/execute- izvede to orodje s JSON payloadom