Preveriti podpis JSON Web Token (JWT)

preveri podpis JWT-ja (HS256, HS384, HS512, RS256, RS384, RS512) iz skrivnosti ali javnega ključa in pregleda njegove claims
Za HS256 / HS384 / HS512: skrivni niz. Za RS256 / RS384 / RS512: javni ključ v formatu PEM.

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:

  1. JWT ločuje na glavo, obremenitev in podpis.
  2. Združuje base64url(header) + "." + base64url(tovor).
  3. 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).
  4. Za RSA pokliče openssl_verify z 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

  1. Prilepite celoten JWT (trije deli, ločeni s pikami).
  2. 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-----.
  3. 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 z alg: brez.
  • Zmeda HMAC proti RSA (zmeda algoritma): napadalec spremeni algoritem RS256 v HS256 in 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 exp in nbf.
  • 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 orodja
  • GET https://cdrn.fr/api/v1/tools/jwt-verifier - pridobi shemo tega orodja
  • POST https://cdrn.fr/api/v1/tools/jwt-verifier/execute - izvede to orodje s JSON payloadom