Provjeriti potpis JSON Web Token (JWT)
- Nadzorna ploča
- Dokumentacija
- API
Zašto provjeravati potpis JWT-a?
JSON web token (JWT) podijeljen je u tri dijela odvojena točkama:
header.payload.signature. Dekodiranje JWT-a jednostavno je stvar čitanja prva dva
dijelovi (koji su Base64URL). Svatko to može i svatko moženapraviti
JWT s korisnim teretom po vašem izboru. Ono što JWT čini pouzdanim je samo
potpis: bez provjere, prihvaćanje JWT-a znači puštanje bilo koga u vaš dom tko
pretvara se da je netko, ne tražeći identifikaciju.
Ovaj alat provjerava potpis JWT-a iz ključa. Nije zadovoljan dekodiranje: ponovno izračunava potpis iz zaglavlja, nosivosti i vašeg ključa, zatim ga uspoređuje s potpisom tokena. Ako se ta dva podudaraju, token je autentičan. Inače je kovan, izmijenjen ili potpisan drugim ključem.
Provjera je kamen temeljac svake arhitekture koja koristi JWT za
autentifikacija ili autorizacija: bez valjanog potpisa, korisni teret može lagati.
Napadač koji modificira "role":"user" u "role":"admin" ne bi imao
poteškoće u tome ako je poslužitelj provjeravao samo format tokena, a ne njegov potpis.
Uobičajeni algoritmi
JWT specifikacija (RFC 7518, JSON web algoritmi) definira nekoliko obitelji algoritama. Evo najviše korišteni u proizvodnji:
- HMAC (HS256, HS384, HS512): simetrični potpis temeljen na HMAC-SHA. The isti tajni ključ koristi se za potpisivanje i provjeru. Jednostavan za postavljanje, učinkovit, ali svaka strana koja je sposobna provjeriti token također ga je sposobna izdati. Prilagođeno na scenarije u kojima su izdavatelj i verifikator isti tim ili odjel.
- RSA (RS256, RS384, RS512): asimetrični potpis. Privatni ključ znak, javni ključ potvrđuje. Idealno kada odašiljač i Verifikatori su zasebni entiteti (OAuth2, OpenID Connect, Identity Federation). to je algoritam koji preferira većina pružatelja javnih identiteta.
- ECDSA (ES256, ES384): asimetrični potpis na eliptičnim krivuljama. Ista logika kao RSA (privatni ključ za potpisivanje, javni ključ za provjeru), ali s ključevima i kompaktniji potpisi za jednaku razinu sigurnosti. Sve rašireniji u moderne arhitekture.
Kako osigurati ključ
Format očekivanog ključa ovisi o algoritmu deklariranom u JWT zaglavlju:
- HS256, HS384, HS512: ključ je tajni niz (string).
Ovo je tajna koja se dijeli s izdavateljem, često pohranjena u varijabli okruženja poput
JWT_SECRET. Nema posebnog oblikovanja, samo neobrađena vrijednost. - RS256, RS384, RS512: ključ je RSA javni ključ u PEM formatu,
koji počinje s
-----BEGIN PUBLIC KEY-----i završava s-----KRAJ JAVNOG KLJUČA-----. Ostavite nove retke onakvima kakvi jesu, inače OpenSSL odbija ga analizirati. - ES256, ES384: ključ je ECDSA javni ključ u PEM formatu, na odgovarajućoj krivulji (P-256 za ES256, P-384 za ES384).
Primjer očekivanog RSA javnog ključa
-----POČETAK JAVNOG KLJUČA-----
MIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx...
...vQIDAQAB
-----KRAJ JAVNOG KLJUČA-----
Kako funkcionira provjera?
Naš poslužitelj točno reproducira radnju koju je izvršio odašiljač:
- Odvaja JWT na zaglavlje, sadržaj i potpis.
- Spaja
base64url(zaglavlje) + "." + base64url(payload). - Za HMAC izračunava HMAC-SHA-256/384/512 s vašim tajnim ključem, zatim uspoređuje s
potpis primljen preko
hash_equals(usporedba konstantnog vremena za izbjegavanje napada vrijeme). - Za RSA, poziva
openssl_verifys vašim javnim ključem u PEM formatu.
Slučajevi upotrebe
- API autentifikacija debug: primite 401, provjerite je li vaš token dobro potpisan s očekivanim ključem.
- Provjera valjanosti tokena primljenog od dobavljača: partner (Auth0, Keycloak, Cognito, Okta) šalje vam JWT-ove potpisane u RS256; želite potvrditi da dolaze iz njega s njegovim javnim ključem.
- Sigurnosna revizija: potvrdite da usluga treće strane ispravno potpisuje svoje tokene s robusnim algoritmom, a ne u HS256 s niskom tajnošću.
- Ručni testovi: provjerite prolazi li JWT generiran vašim kodom provjera s dostavljenim javnim ključem.
- Brza provjera primljenog tokena: tijekom integracije SSO ili Partnerski API, prije nekoliko sekundi provjeri radi li potpis/privjesak ključeva napisati najmanju liniju koda.
Kako koristiti alat
- Zalijepite cijeli JWT (tri dijela odvojena točkama).
- Navedite ključ prilagođen algoritmu zaglavlja:
- Za HS256, HS384 ili HS512, ključ je tajni niz
dijelis odašiljačem. To je slobodan niz, često pohranjen u a
varijabla okruženja kao što je
JWT_SECRET. - Za RS256, RS384 ili RS512, ključ je javni ključ u formatu
PEM, koji počinje s
-----BEGIN PUBLIC KEY-----i završava s-----KRAJ JAVNOG KLJUČA-----.
- Za HS256, HS384 ili HS512, ključ je tajni niz
dijelis odašiljačem. To je slobodan niz, često pohranjen u a
varijabla okruženja kao što je
- Pokrenite provjeru. Alat prikazuje status (važeći ili nevažeći) i dekodirani korisni teret.
Uobičajene zamke koje treba izbjegavati
- Algoritam "none": specifikacija dopušta
alg: none, što znači "ne potpis". Klasična greška sastoji se od izrade tokena s ovim zaglavljem u nadi da će poslužitelj to prihvaća. Naš alat sustavno odbija tokene salg: ništa. - HMAC vs RSA zabuna (zabuna algoritma): napadač mijenja algoritam
RS256doHS256i potpisuje sadržaj upotrijebljenim RSA javnim ključem kao tajna HMAC-a. Ako poslužitelj ne kontrolira algoritam, prihvaća token. Uvijek zaključati očekivani algoritam na strani poslužitelja. - HMAC tajne tvrdo kodirane: renderira se tajna predana u Git repozitorij svo povjerenje u žetone je nestalo. Pohraniti tajne u varijable okoline ili sigurna aplikacija.
- Javni ključ naspram privatnog ključa: da bismo potvrdili JWT potpisan u RSA ili ECDSA, mi daje javni ključ, nikad privatni. Privatni se koristi samo za potpisivanje, a ne nikada ne smije izaći iz odašiljača.
- Istek zanemaren: važeći potpis na tokenu koji je istekao ne bi trebao
nikada biti prihvaćen. Ne zaboravite provjeriti
expinbf. - Nekontrolirana publika: token namijenjen za API A ne bi trebao biti prihvaćen
API B. Provjerite zahtjev
aud.
Vremenska potraživanja: exp i nbf
Osim potpisa, valjani JWT također mora poštovati svoja vremenska ograničenja:
- exp (istek): token više nije valjan nakon ovog datuma.
- nbf (ne prije): token još nije valjan prije ovog datuma.
Naš alat eksplicitno signalizira kada je token istekao ili još nije valjani ako je njegov potpis točan. Ovo je važno: važeći potpis na a Token koji je istekao nikada se ne bi trebao prihvatiti u proizvodnji.
Razlika s našim JWT dekoderom
Naš JWT dekoder samo dekodira zaglavlje i nosivost kako bi ih učinili čitljivima. Ne provodi nikakvu provjeru potpisa i ne traži ključ. Koristite ga za brzi pregled sadržaja tokena. Koristite JWT verifikator (ova stranica) kad god trebate dokazati da je token autentičan. Da biste napravili potpisani JWT za testiranje, koristite naš JWT builder.
Često postavljana pitanja
Zašto RS256 umjesto HS256?
Uz HS256, izdavatelj i verifikator dijele istu tajnu: sve verifikator stoga može izdati tokene. Upravljivo je kada kontrolirate oba kraja. Od da govorimo o jednom pružatelju identiteta s nekoliko korisničkih usluga, mijenjamo se u RS256: odašiljač čuva privatni ključ, mi distribuiramo javni ključ svim API-jima koji mora provjeriti. Nijedan potrošački API ne može krivotvoriti tokene.
Kako mogu dohvatiti javni ključ davatelja identiteta (IdP)?
Većina IdP-ova izlaže standardiziranu krajnju točku JWKS (npr.
https://example.com/.well-known/jwks.json). Ova krajnja točka vraća JSON koji sadrži
aktivne javne ključeve. Možete pretvoriti JWK unos koji odgovara kid
iz zaglavlja vašeg JWT-a u PEM ključ putem naredbe openssl ili putem biblioteke
JWKS s vašeg stoga (npr. jose-jwt, jwks-rsa).
Što učiniti ako provjera ne uspije?
Prvo provjerite algoritam: token potpisan u HS256 ne može se verificirati RSA ključem i
obratno. Zatim provjerite ključ: jedan dodatni bijeli znak, jedan nedostaje novi red
u PEM ključu, ili HMAC tajna malo drugačija od one koju koristi izdavatelj
su dovoljni da padnu na provjeri. Ako je IdP izvršio rotaciju ključa, vaš
kid može pokazati na ključ koji više nemate.
Što je JWKS?
JWKS (JSON Web Key Set, RFC 7517) je JSON format koji opisuje skup
javnih ključeva. Svaki ključ identificira kid (ID ključa) i JWT za provjeru
navodi ovo kid u svom zaglavlju. Mehanizam omogućuje IdP-u da se okreće
ključeve bez razbijanja kontrolnika: oni jednostavno postavljaju upit JWKS krajnjoj točki kako bi dohvatili
ključ koji odgovara kid primljenog tokena.
Kako mogu generirati RSA par ključeva za potpisivanje svojih JWT-ova?
Uz OpenSSL: openssl genrsa -out private.pem 2048 zatim
openssl rsa -in private.pem -pubout -out public.pem. Bočni znak privatnog ključa
Izdavatelj, javni ključ provjerava na strani potrošača. Za nove usluge preferirajte 3072 ili
4096 bita.
Treba li JWT biti šifriran uz potpisivanje (JWE)?
Potpisani JWT (JWS) jamči cjelovitost i autentičnost, ali sadržaj ostaje čitljiv tko god ga ubere. Ako token sadrži osjetljive podatke (interne identifikatore, prava detaljne, osobne podatke), razmislite o formatu JWE (JSON web šifriranje). koji šifrira korisni teret osim što ga potpisuje.
Primjer zahtjeva
curl -X POST https://cdrn.fr/api/v1/tools/jwt-verifier/execute \
-H "Content-Type: application/json" \
-d '{"token":"...","key":"..."}'
Ulazna shema
| Polje | Tip | Obavezno | Zadano |
|---|---|---|---|
token |
text | ✓ | – |
key |
text | ✓ | – |
Krajnje točke
GET https://cdrn.fr/api/v1/tools- ispisuje sve dostupne alateGET https://cdrn.fr/api/v1/tools/jwt-verifier- dohvaća shemu ovog alataPOST https://cdrn.fr/api/v1/tools/jwt-verifier/execute- izvršava ovaj alat s JSON payloadom