Spring Security 6 ja JWT-todennus · Oppitunti

JWT-tunnisteiden allekirjoittaminen ja vahvistaminen

Oppikaa JWT-allekirjoituksen taustalla olevat kryptografiset periaatteet sekä tunnisteen eheyden ja aitouden vahvistaminen.

Oppitunti 3/411 vaihetta

JWT-tunnisteiden allekirjoittaminen ja vahvistaminen on ilmainen Spring Security 6 ja JWT-todennus-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Spring Security 6 ja JWT-todennus-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Security 6 ja JWT-todennus-kurssilla on yhteensä 4 oppituntia.

Mitä JWT:n allekirjoittaminen tarkoittaa?

JSON Web Tokenit (JWT:t) ovat tehokkaita, mutta miten voimme luottaa niihin? Allekirjoittaminen on vastaus! Se on kryptografinen prosessi, joka varmistaa, ettei tunnistetta ole muutettu ja että se on peräisin luotetusta lähteestä.

  • Eheys: Vahvistaa, ettei tunnisteen sisältöä ole muutettu sen myöntämisen jälkeen.
  • Aitous: Varmistaa, että tunnisteen myönsi odotettu lähettäjä.

Ilman allekirjoitusta kuka tahansa voisi luoda tai muuttaa JWT:n!

Tietoturvan avaimet: salaisuus

Symmetrisissä allekirjoitusalgoritmeissa, kuten HMAC-algoritmissa (esimerkiksi HS256), käytetään yhtä salaisen avaimenä. Avaimen tuntevat vain myöntäjä ja tarkoitetut vahvistajat.

  • Salainen avain on tavuista koostuva merkkijono, jota tarvitaan sekä allekirjoittamiseen että vahvistamiseen.
  • Se on pidettävä erittäin luottamuksellisena.
  • Jos salainen avain vaarantuu, JWT:t eivät enää ole turvallisia!

Algoritmit: HS256 ja RS256

JWT:t käyttävät allekirjoituksen luomiseen kryptografisia algoritmeja. Algoritmin tyyppi määritetään tunnisteen otsakkeessa.

  • HS256 (HMAC SHA-256): Symmetrinen algoritmi. Käyttää samaa salaista avainta sekä allekirjoittamiseen että vahvistamiseen. Helpompi toteuttaa.
  • RS256 (RSA SHA-256): Epäsymmetrinen algoritmi. Käyttää yksityistä avainta allekirjoittamiseen ja julkista avainta vahvistamiseen. Monimutkaisempi, mutta sopii paremmin hajautettuihin järjestelmiin.

Keskitymme esimerkeissä HS256-algoritmiin sen yksinkertaisuuden vuoksi.

Allekirjoituksen luominen (HS256)

Allekirjoitus luodaan yhdistämällä Base64Url-koodattu otsake, Base64Url-koodattu hyötykuorma ja salainen avain valitulla algoritmilla.

  1. Ota Base64Url-koodattu otsake.
  2. Ota Base64Url-koodattu hyötykuorma.
  3. Yhdistä ne pisteellä: encodedHeader + "." + encodedPayload.
  4. Laske yhdistetyn merkkijonon tiiviste HMAC SHA-256 -algoritmilla ja salaisella avaimella.
  5. Koodaa syntyvä tiiviste Base64Url-muotoon saadaksesi lopullisen allekirjoituksen.

Tulos: encodedHeader.encodedPayload.signature

Koodi: HS256-allekirjoituksen luominen

Tässä on Java-esimerkki JWT:n HS256-allekirjoituksen luomiseen. Huomaatte, että salainen avain on olennainen osa tiivisteen laskemista.

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);
    }
}

JWT:n allekirjoituksen vahvistaminen

Vahvistaminen on allekirjoittamisen käänteisprosessi. Kun vastaanotatte JWT:n, teidän on varmistettava, että sen allekirjoitus on kelvollinen.

  1. Erota vastaanotettu JWT kolmeksi osaksi: otsakkeeksi, hyötykuormaksi ja allekirjoitukseksi.
  2. Muodosta uudelleen ”allekirjoitettava data” -merkkijono: encodedHeader + "." + encodedPayload.
  3. Laske tästä datasta uusi allekirjoitus käyttämällä samaa salaista avainta ja algoritmia.
  4. Vertaa laskemaasi uutta allekirjoitusta JWT:ssä olevaan allekirjoitukseen.

Jos ne täsmäävät, tunniste on kelvollinen eikä sitä ole muutettu! Muussa tapauksessa se on virheellinen.

Avainten turvallinen hallinta

JWT-tunnisteiden turvallisuus riippuu ratkaisevasti siitä, kuinka hyvin hallitsette allekirjoitusavaimia. Vaarantunut avain mitätöi kaikki tietoturvatoimenne!

  • Luottamuksellisuus: Pitäkää salaiset avaimet yksityisinä. Älkää koskaan kirjoittako niitä suoraan asiakaspuolen koodiin.
  • Kierrätys: Vaihtakaa avaimet säännöllisesti mahdollisen tietomurron vaikutusten rajoittamiseksi.
  • Vahvuus: Käyttäkää vahvoja, satunnaisia ja riittävän pitkiä avaimia.
  • Tallentakaa avaimet turvallisiin ympäristöihin, kuten ympäristömuuttujiin tai erillisiin avaintenhallintapalveluihin.

Koodi: HS256-allekirjoituksen vahvistaminen

Tässä esimerkissä näytetään, miten JWT:n allekirjoitus vahvistetaan. Käytämme samaa salaista avainta allekirjoituksen laskemiseen uudelleen ja vertaamme sitä tunnisteessa olevaan allekirjoitukseen.

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);
        }
    }
}

Symmetrinen ja epäsymmetrinen allekirjoittaminen

HS256 (HMAC SHA-256) käyttää jaettua salaista avainta, kun taas RS256 (RSA SHA-256) ja ES256 (ECDSA SHA-256) käyttävät avainpareja.

  • Symmetrinen (esim. HS256): Sama avain allekirjoittamiseen ja allekirjoituksen tarkistamiseen. Sopii parhaiten yhden palvelun sovelluksiin tai tilanteisiin, joissa tarkistaja on myös myöntäjä.
  • Asymmetrinen (esim. RS256, ES256): Yksityinen avain allekirjoittamiseen ja julkinen avain tarkistamiseen. Ihanteellinen hajautettuihin järjestelmiin, joissa useiden palvelujen on voitava tarkistaa keskitetyn tahon myöntämät tokenit. Julkinen avain voidaan jakaa laajasti vaarantamatta tietoturvaa.

Pikatesti: JWT:n tietoturva

Olette oppineet JWT:n allekirjoittamisesta ja tarkistamisesta. Testataan seuraavaksi ymmärrystänne.

Kertaus: suojatut JWT:t

Hienoa työtä! Olemme selventäneet, miten JWT:t suojataan allekirjoittamisen ja tarkistamisen avulla.

  • Allekirjoittaminen varmistaa JWT:n eheyden ja aitouden kryptografisen algoritmin ja salaisen avaimen avulla.
  • HS256 (HMAC SHA-256) on symmetrinen algoritmi, joka käyttää yhtä jaettua salaista avainta.
  • Tarkistaminen tarkoittaa allekirjoituksen laskemista uudelleen ja sen vertaamista vastaanotettuun allekirjoitukseen.
  • Avainten turvallinen hallinta on ensiarvoisen tärkeää JWT:n tietoturvan kannalta.
  • RS256:n kaltaiset asymmetriset algoritmit käyttävät avainpareja hajautettuun tarkistamiseen.

Seuraavaksi näemme, miten JWT:t integroidaan Spring Securityyn!

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”JWT-tunnisteiden allekirjoittaminen ja vahvistaminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Spring Security 6 ja JWT-todennus-oppimispolun 3 oppituntia, myös oppitunnin “JWT-tunnisteiden allekirjoittaminen ja vahvistaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Spring Security 6 ja JWT-todennus-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”JWT-tunnisteiden allekirjoittaminen ja vahvistaminen”?

Oppikaa JWT-allekirjoituksen taustalla olevat kryptografiset periaatteet sekä tunnisteen eheyden ja aitouden vahvistaminen. Harjoittelet Spring Security 6 ja JWT-todennus-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Spring Security 6 ja JWT-todennus-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Security 6 ja JWT-todennus-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”JWT-tunnisteiden allekirjoittaminen ja vahvistaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Spring Security 6 ja JWT-todennus-oppitunnilla?

Kyllä. Jokainen Spring Security 6 ja JWT-todennus-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. JSON Web Tokenien ymmärtäminen
  2. JWT:n rakenne ja claimit
  3. JWT-tunnisteiden allekirjoittaminen ja vahvistaminen
  4. JWT:n vanhenemis- ja vahvistussäännöt
← Takaisin: Spring Security 6 ja JWT-todennus