Signere og verifisere JWT-er
Lær de kryptografiske prinsippene bak signering av JWT-er, og hvordan du verifiserer et tokens integritet og ekthet.
Signere og verifisere JWT-er er en gratis leksjon i Spring Security 6 og JWT-autentisering på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Spring Security 6 og JWT-autentisering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Spring Security 6 og JWT-autentisering inneholder totalt 4 leksjoner.
Hva er JWT-signering?
JSON Web Tokens (JWT-er) er kraftige, men hvordan kan vi stole på dem? Signering er svaret! Det er en kryptografisk prosess som sikrer at et token ikke har blitt endret, og at det kommer fra en betrodd kilde.
- Integritet: Bekrefter at innholdet i tokenet ikke har blitt endret siden det ble utstedt.
- Autentisitet: Verifiserer at tokenet ble utstedt av den forventede avsenderen.
Uten en signatur kunne hvem som helst opprette eller endre en JWT!
Sikkerhetens nøkler: Den hemmelige nøkkelen
For symmetriske signeringsalgoritmer som HMAC (for eksempel HS256) brukes én enkelt hemmelig nøkkel. Denne nøkkelen er bare kjent for utstederen og den eller de tiltenkte verifikatorene.
- Den hemmelige nøkkelen er en streng med byte og er avgjørende både for signering og verifisering.
- Den må holdes strengt konfidensiell.
- Hvis den hemmelige nøkkelen blir kompromittert, er JWT-ene dine ikke lenger sikre!
Algoritmer: HS256 og RS256
JWT-er bruker kryptografiske algoritmer til å opprette signaturen. Algoritmetypen er angitt i tokenets header.
- HS256 (HMAC SHA-256): En symmetrisk algoritme. Bruker én enkelt hemmelig nøkkel til både signering og verifisering. Enklere å implementere.
- RS256 (RSA SHA-256): En asymmetrisk algoritme. Bruker en privat nøkkel til signering og en offentlig nøkkel til verifisering. Mer kompleks, men bedre egnet for distribuerte systemer.
Vi fokuserer på HS256 i eksemplene våre fordi den er enkel.
Opprette signaturen (HS256)
Signaturen opprettes ved å kombinere den Base64Url-kodede headeren, den Base64Url-kodede payloaden og den hemmelige nøkkelen din ved hjelp av den valgte algoritmen.
- Ta den Base64Url-kodede headeren.
- Ta den Base64Url-kodede payloaden.
- Sett dem sammen med et punktum:
encodedHeader + "." + encodedPayload. - Hash den kombinerte strengen ved hjelp av HMAC SHA-256 og den hemmelige nøkkelen din.
- Kod den resulterende hashen med Base64Url for å få den endelige signaturen.
Resultat: encodedHeader.encodedPayload.signature
Kode: Generere en HS256-signatur
Her er et Java-eksempel som genererer en HS256-signatur for en JWT. Legg merke til hvor avgjørende den hemmelige nøkkelen er for hash-prosessen.
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class JwtSigner {
public static void main(String[] args) throws Exception {
String encodedHeader = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"; // {"alg":"HS256","typ":"JWT"}
String encodedPayload = "eyJpZCI6MSwicm9sZSI6InVzZXIifQ"; // {"id":1,"role":"user"}
String secret = "coddykit-secret-lesson-key-1234567890";
String dataToSign = encodedHeader + "." + encodedPayload;
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
hmacSha256.init(secretKey);
byte[] signatureBytes = hmacSha256.doFinal(dataToSign.getBytes("UTF-8"));
String encodedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(signatureBytes);
System.out.println("Data to Sign: " + dataToSign);
System.out.println("Generated Signature: " + encodedSignature);
System.out.println("Full JWT: " + dataToSign + "." + encodedSignature);
}
}Verifisere signaturen til en JWT
Verifisering er den omvendte prosessen av signering. Når du mottar en JWT, må du kontrollere at signaturen er gyldig.
- Del den mottatte JWT-en i de tre delene: header, payload og signatur.
- Bygg opp strengen med «dataene som skal signeres» på nytt:
encodedHeader + "." + encodedPayload. - Bruk den samme hemmelige nøkkelen og algoritmen til å beregne en ny signatur fra disse dataene.
- Sammenlign den nylig beregnede signaturen med signaturen som følger med JWT-en.
Hvis de er like, er tokenet gyldig og ikke endret! Hvis ikke, er det ugyldig.
Sikker håndtering av nøkler
Sikkerheten til JWT-ene dine avhenger i stor grad av hvor godt du håndterer signeringsnøklene. En kompromittert nøkkel gjør all sikkerhetsinnsatsen din ugyldig!
- Konfidensialitet: Hold hemmelige nøkler private. Legg dem aldri direkte inn i klientkode.
- Rotasjon: Bytt nøkler regelmessig for å begrense konsekvensene av et mulig kompromiss.
- Styrke: Bruk sterke, tilfeldige og tilstrekkelig lange nøkler.
- Oppbevar nøkler i sikre miljøer, for eksempel som miljøvariabler eller i dedikerte tjenester for nøkkelhåndtering.
Kode: Verifisere en HS256-signatur
Dette eksempelet viser hvordan du verifiserer signaturen til en JWT. Vi bruker den samme hemmelige nøkkelen til å beregne signaturen på nytt og sammenligne den med signaturen i tokenet.
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class JwtVerifier {
public static void main(String[] args) throws Exception {
String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6InVzZXIifQ.qS6pQ_6_q-P_5_o-O_6_n-N_7_m-M_8_l-L_9_k-K_0_j-J_1_i-I_2_h-H_3_g-G_4_f-F_5_e-E_6_d-D_7_c-C_8_b-B_9_a-A";
String secret = "coddykit-secret-lesson-key-1234567890";
String[] parts = jwt.split("\\.");
String encodedHeader = parts[0];
String encodedPayload = parts[1];
String receivedSignature = parts[2];
String dataToSign = encodedHeader + "." + encodedPayload;
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256");
hmacSha256.init(secretKey);
byte[] calculatedSignatureBytes = hmacSha256.doFinal(dataToSign.getBytes("UTF-8"));
String calculatedSignature = Base64.getUrlEncoder().withoutPadding().encodeToString(calculatedSignatureBytes);
if (calculatedSignature.equals(receivedSignature)) {
System.out.println("Signature is VALID!");
} else {
System.out.println("Signature is INVALID!");
System.out.println("Received: " + receivedSignature);
System.out.println("Calculated: " + calculatedSignature);
}
}
}Symmetrisk og asymmetrisk signering
Mens HS256 (HMAC SHA-256) bruker en delt hemmelighet, bruker RS256 (RSA SHA-256) og ES256 (ECDSA SHA-256) nøkkelpar.
- Symmetrisk (f.eks. HS256): Samme nøkkel brukes til signering og verifisering. Best egnet for applikasjoner med én tjeneste, eller når verifikatoren også er utstederen.
- Asymmetrisk (f.eks. RS256, ES256): Privat nøkkel brukes til signering, og offentlig nøkkel brukes til verifisering. Ideelt for distribuerte systemer der flere tjenester må verifisere token utstedt av en sentral autoritet. Den offentlige nøkkelen kan deles bredt uten at sikkerheten kompromitteres.
Hurtigsjekk: JWT-sikkerhet
Du har lært om signering og verifisering av JWT-er. La oss teste forståelsen din.
Oppsummering: Sikre JWT-er
Godt jobbet! Vi har gjort det tydelig hvordan JWT-er sikres gjennom signering og verifisering.
- Signering sikrer integriteten og autentisiteten til en JWT ved hjelp av en kryptografisk algoritme og en hemmelig nøkkel.
- HS256 (HMAC SHA-256) er en symmetrisk algoritme som bruker én delt hemmelighet.
- Verifisering innebærer å beregne signaturen på nytt og sammenligne den med den mottatte signaturen.
- Sikker nøkkelhåndtering er avgjørende for JWT-sikkerheten.
- Asymmetriske algoritmer som RS256 bruker nøkkelpar for distribuert verifisering.
Deretter skal vi se hvordan JWT-er integreres med Spring Security!
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Signere og verifisere JWT-er» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Spring Security 6 og JWT-autentisering, inkludert «Signere og verifisere JWT-er», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Spring Security 6 og JWT-autentisering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Signere og verifisere JWT-er»?
Lær de kryptografiske prinsippene bak signering av JWT-er, og hvordan du verifiserer et tokens integritet og ekthet. Du øver på Spring Security 6 og JWT-autentisering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Spring Security 6 og JWT-autentisering?
Ingen tidligere erfaring er nødvendig. Spring Security 6 og JWT-autentisering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Signere og verifisere JWT-er»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Spring Security 6 og JWT-autentisering-leksjonen?
Ja. Alle Spring Security 6 og JWT-autentisering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Forstå JSON Web Tokens
- JWT-struktur og claims
- Signere og verifisere JWT-er
- Regler for JWT-utløp og validering