Provjeriti potpis JSON Web Token (JWT)

provjerava potpis JWT-a (HS256, HS384, HS512, RS256, RS384, RS512) iz tajne ili javnog ključa, i inspektira njegove claims
Za HS256 / HS384 / HS512: tajni niz. Za RS256 / RS384 / RS512: javni ključ u PEM formatu.

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č:

  1. Odvaja JWT na zaglavlje, sadržaj i potpis.
  2. Spaja base64url(zaglavlje) + "." + base64url(payload).
  3. 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).
  4. Za RSA, poziva openssl_verify s 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

  1. Zalijepite cijeli JWT (tri dijela odvojena točkama).
  2. 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-----.
  3. 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 s alg: ništa.
  • HMAC vs RSA zabuna (zabuna algoritma): napadač mijenja algoritam RS256 do HS256 i 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 exp i nbf.
  • 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 alate
  • GET https://cdrn.fr/api/v1/tools/jwt-verifier - dohvaća shemu ovog alata
  • POST https://cdrn.fr/api/v1/tools/jwt-verifier/execute - izvršava ovaj alat s JSON payloadom