Johdatus JSON Web Encryptioniin: toiminta ja käyttötarkoitus

Tämä on johdanto JSON Web Encryption -standardiin, joka on suunniteltu pitämään tiedot luottamuksellisina.
Jos termit kuten "JSON Web Token" ja "JSON Web Signature" ovat sinulle uusia, kannattaa aloittaa muista artikkeleistamme:
Muussa tapauksessa sukelletaan sisään!
Mikä on JWE?
JSON Web Encryption (JWE ) on IETF-standardi salatun sisällön esittämiseen JSON-muodossa. Se on osa laajempaa JOSE-kehystä (JSON Object Signing and Encryption), johon kuuluvat myös JSON Web Token (JWT) ja JSON Web Signature (JWS).
JWE suojaa tietoja ja varmistaa niiden luottamuksellisuuden. JWE:n taustalla oleva salaus mahdollistaa sen, että vain valtuutetut osapuolet, joilla on oikea purkuavain, voivat lukea salattua tietoa.
JWE:n avulla voidaan salata mitä tahansa sisältöä, myös yksinkertainen lause. Sen yleisin sovellus on kuitenkin JWT:n salaus. Kun JWT on sekä allekirjoitettu (JWS:llä) että salattu (JWE:llä), siitä käytetään usein nimitystä Nested JWT. Nested JWT:tä voidaan käyttää todennusskenaarioissa OAuth 2.0:n ja OpenID Connectin kanssa, kun arkaluonteisten tietojen suojaamiseen tarvitaan ylimääräinen suojaustaso.
Tässä blogikirjoituksessa keskitymme yleisimpään käyttötapaukseen: Nested JWT. Käsittelemme myös vain Compact Serialization -formaattia, toisin kuin vähemmän suosittua JSON Serialization -formaattia.
Miksi käyttää JWE:tä?
Tietoturva on suuri haaste nykyaikaisille sovelluksille, erityisesti kun käsitellään ja siirretään arkaluonteisia tietoja, kuten taloudellisia tietoja, henkilötietoja tai kirjautumistietoja internetin kautta. JWE on korvaamaton, kun on kyse seuraavista asioista:
- Tietojen luottamuksellisuuden varmistaminen: JWE pitää arkaluonteiset tiedot luottamuksellisina. Vaikka JWE-suojattu viesti siepattaisiinkin, sen sisältö pysyy lukukelvottomana ilman oikeaa purkuavainta.
- Säädösten noudattaminen: Terveydenhuollon ja rahoitusalan kaltaisilla toimialoilla noudatetaan tiukkoja säännöksiä, jotka edellyttävät, että asiakastiedot suojataan salauksen avulla. JWE auttaa organisaatioita noudattamaan näitä vaatimuksia.
JWE:n yleiset käyttötapaukset
JWE:llä on useita käytännön sovelluksia.
- API-rajapintojen suojaaminen: API:t käsittelevät usein arkaluonteisten tietojen vaihtoa asiakkaiden ja palvelimien välillä. JWE:n käyttäminen API-pyyntöjen ja -vastausten salaamiseen pitää tämän tietovirran yksityisenä. Valtuutuspalvelin voi esimerkiksi käyttää JWE:tä tokenin ja käyttäjätiedon loppupisteen vastausten salaamiseen, mikä lisää turvakerroksen OAuth 2.0 -pohjaiseen todennusvirtaan.
- Tietojen suojaaminen siirron aikana: JWE on erityisen hyödyllinen, kun tietoja siirretään mahdollisesti turvattomien verkkojen kautta.
- Salattujen tietojen tallentaminen tietokantoihin: Sovelluksissa, jotka tallentavat JWT-koodeja tietokantoihin todennusta tai istunnonhallintaa varten, näiden tunnisteiden salaaminen JWE:llä estää arkaluonteisten tietojen paljastumisen tietokantamurron yhteydessä.
JWT:n, JWS:n ja JWE:n välinen ero
JSON-verkkotunnisteet tarjoavat standardoidun tavan välittää tietoja. JWT:t hyödyntävät kahta toisiinsa liittyvää määrittelyä:
- JSON Web Signature (JWS) tietojen eheyttä ja aitoutta varten.
- JSON Web Encryption (JWE) luottamuksellisuuden varmistamiseksi.
Tutustutaanpa tarkemmin kumpaankin:
JSON Web Token (JWT).
JWT on tiivis, URL-turvallinen tapa esittää kahden osapuolen välillä siirrettäviä väitteitä. Se on laajalti hyväksytty todentamisen ja valtuuttamisen standardi, joka usein välittää tietoja todennetusta käyttäjästä (kuten OpenID Connectissa) tai asiakassovellukselle myönnetyistä oikeuksista (kuten OAuth 2.0:ssa).
JWT:
- Määritellään laajasti RFC 7519:ssä tavaksi esittää kahden osapuolen välillä siirrettäviä väitteitä. Se voi olla allekirjoitettu (JWS:n avulla) tai salattu (JWE:n avulla) tai jopa suojaamaton ("alg": "none").
- Käytännössä ja kaikissa turvallisissa käyttötapauksissa JWT on käytännössä aina allekirjoitettu salakirjoituksella käyttäen JSON Web Signaturea (JWS). Allekirjoitus varmistaa JWT:n sisältämän tiedon eheyden ja aitouden.
- Allekirjoitettu JWT koostuu kolmesta osasta: otsikosta, hyötykuormasta (väittämät) ja allekirjoituksesta.
- Allekirjoitettu JWT takaa, että sen sisältämiä tietoja ei ole peukaloitu, mutta se ei takaa luottamuksellisuutta - kuka tahansa, jolla on tunniste, voi lukea sen sisällön.
JSON Web Signature (JWS)
JWS on määrittely JSON-tietojen digitaaliseen allekirjoittamiseen, joka:
- Takaa tietojen eheyden ja aitouden ja varmistaa, että allekirjoitettuja tietoja ei ole peukaloitu kuljetuksen aikana. Vastaanottaja voi varmistaa, että tietoja ei ole muutettu, vahvistamalla allekirjoituksen.
- Jättää tiedot näkyviin mutta ei voi väärentää niitä.
- Se on JWT:iden allekirjoittamisen vakiomekanismi.
JSON-verkkosalaus (JWE)
JWE on määrittely salatun ja eheyssuojatun viestin esittämiseen.
JWE:
- Salaa tiedot luottamuksellisuuden varmistamiseksi.
- Perustuu salausalgoritmien luokkaan nimeltä Authenticated Encryption with Associated Data (AEAD). Nämä algoritmit sekä salaavat tiedot että tarkistavat niiden eheyden.
- Käytetään yleisesti JWT-salaukseen todennusta ja valtuutusta varten arkaluonteisissa ympäristöissä (esim. rahoitus- tai terveydenhuoltoalalla). Allekirjoitettuja ja salattuja JWT:itä kutsutaan nimellä Nested JWT.
- Nested JWT:t ovat yleisiä, mutta JWE mahdollistaa minkä tahansa mielivaltaisen arvon salaamisen. JWE:llä salatun selkotekstin ei tarvitse olla täydellinen, muodollisesti jäsennelty JWT. Se voi olla yksinkertaisesti JSON-objekti, joka sisältää suoraan salattuja väitteitä (esim. {"user_id": "123", "role": "admin"}) ilman JWT-otsikkoa ja allekirjoitusta.
- Koostuu viidestä osasta: otsikosta, salatusta avaimesta, alustusvektorista, salaustekstistä ja todennustunnisteesta.
JWE:n rakenne
Varsinainen JWE voi näyttää jotakuinkin tältä:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
eyJpc3MiOiJqb2UiLCJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyNDA5MjIsImF1ZCI6WyJodHRwOi8vbG9jYWxob3N0OjUwMDAiXSwianRpIjoiMTIzNDU2Nzg5MCJ9.
cZVhpnL47MivTYV7GfhHduRzUhHsxMSAwdpP4I4aFnk.
48V1_ALb6US04U3b.
5eym8TW_c8SuKKS-fv54EyXp10aJpE8rvCvIkDx9dXw
(Huomautus: Varsinainen JWE on yksi yhtenäinen merkkijono; uusia rivejä on lisätty vain luettavuuden vuoksi).
Tässä esimerkissä salataan vastaanottajalle selkoteksti "Älykkyyden todellinen merkki ei ole tieto vaan mielikuvitus." Vastaanottajalle. Huomaa, että se koostuu viidestä osasta, joista jokainen on base64url-koodattu ja erotettu pisteillä. Jokaisella JWE:n osalla on tietty rooli salaus- ja purkuprosessissa.
Tämä on esimerkki JWE Compact Serialization -muodosta, joka on JWE:n yleisin muoto. Toinen vaihtoehto, jota emme käsittele tässä blogikirjoituksessa, on JWE JSON Serialization.
JWE:n viisi osaa ovat:
JOSE-otsikko
JOSE Header sisältää tietoja salausprosessista ja itse JWE:stä. Se määrittää sekä avainten hallintaan että sisällön salaukseen käytetyt algoritmit sekä valinnaisia lisäominaisuuksia. Sen on sisällettävä seuraavat parametrit:
- alg (Algorithm): Määrittää avaimenhallinta-algoritmin, jota käytetään salaukseen tai sisällön salausavaimen (Content Encryption Key, CEK) arvon määrittämiseen. Yleisiä algoritmeja ovat RSA1_5, RSA-OAEP, A128KW, A256KW jne.
- enc (Encryption Algorithm): Määrittää AEAD-algoritmin (Authenticated Encryption with Associated Data), jota käytetään suorittamaan varsinainen selkotekstin salaus. Tällä algoritmilla on oltava määritetty avaimen pituus, ja se tarjoaa luonnostaan sekä salauksen että eheyden suojauksen. Esimerkkejä ovat A128GCM, A256GCM (AES GCM), A128CBC-HS256 jne.
Mukaan voidaan sisällyttää valinnaisia otsikkoparametreja, kuten x5u (X.509 URL), kid (Key ID), cty (Content Type) jne.
Tyypillinen JWE-otsake voi näyttää seuraavalta:
{
"alg": "RSA-OAEP",
"enc": "A256GCM"
}
Tämä otsake määrittää, että sisällön salausavain salataan vastaanottajalle käyttäen RSA-OAEP-algoritmia ja että selkotekstin todennettu salaus suoritetaan käyttämällä AES GCM:ää 256-bittisellä avaimella.
Salattu avain
Tämä osio sisältää sisällön salausavaimen (Content Encryption Key, CEK), , joka on symmetrinen avain, jota käytetään JWE:n varsinaisen sisällön salaamiseen. JOSE-otsikon alg-parametri määrittää, miten tämä CEK salataan tai miten siitä sovitaan.
Seuraavassa on esimerkkejä siitä, miten CEK:tä hallitaan alg-arvon perusteella:
- Jos alg on RSA-OAEP, sisällön salausavain salataan RSA-OAEP-algoritmilla vastaanottajan julkisella avaimella.
- Jos alg on A128KW tai A256KW (AES Key Wrap), CEK kääritään (salataan) symmetrisesti käyttäen ennalta jaettua symmetristä avainta.
- Algoritmeissa, kuten ECDH-ES (Elliptic-curve Diffie-Hellman), jaettu salaisuus johdetaan avainsopimuksen avulla. Tätä johdettua salaisuutta käytetään sitten yleensä CEK:n käärimiseen (ECDH-ES yhdistetään usein A128KW:hen), vaikka se voi toimia myös suoraan CEK:nä.
Kun CEK:tä ei lähetetä JWE:n sisällä, kuten suorassa salauksessa tai kun ECDH-ES:stä johdettu avain toimii suoraan CEK:nä, tämä kohta on tyhjä. Tämä johtuu siitä, että CEK on luotu muulla tavoin (ennalta jaettu tai johdettu).
Lisätietoja on JSON Web Algorithms (JWA) RFC:n kohdassa Cryptographic Algorithms for Key Management.
Aloitusvektori
Aloitusvektori on satunnaisarvo, jota käytetään selkotekstiä salattaessa (jos salausalgoritmi käyttää sitä). Se parantaa turvallisuutta varmistamalla, että sama selkoteksti salataan joka kerta eri tavalla. Jos symmetrinen salausalgoritmi ei vaadi alustusvektoria, tämä kohta on tyhjä.
Salausteksti
Salausteksti on alkuperäisen selkotekstin salattu muoto. Se tuotetaan suorittamalla todennettu salaus käyttäen sisällön salausavainta (Content Encryption Key, CEK), salausalgoritmia (määritetty enc-otsikkoparametrilla ) ja todennettuja lisätietoja. Salausteksti on JWE:n keskeinen osa, koska se sisältää suojatut tiedot.
Todennustunniste
Tämä osio sisältää todennustunnisteen, joka on luotu suorittamalla todennettu salaus. Sen tarkoituksena on varmistaa salatun viestin eheys havaitsemalla mahdolliset luvattomat muutokset. Jos jotakin JWE:n osaa muutetaan salauksen jälkeen, salauksen purku havaitsee manipuloinnin, koska Authentication Tag ei vastaa sitä. Tämä kohta jää tyhjäksi, jos symmetrinen salausalgoritmi ei käytä todennustunnistetta.
Salaus- ja purkuprosessi
JWE toimii yhdistämällä erilaisia salaustekniikoita: Se käyttää avaintenhallintaprosessia sisällön salausavaimen suojaamiseen, jota käytetään sitten varsinaisen selväkielisen tekstin symmetriseen salaukseen. Näin se toimii:
Avaimen luominen ja hallinta
- JWE-otsikon alg-parametri määrää, miten sisällön salausavain (Content Encryption Key, CEK) salataan, luodaan tai johdetaan.
- Lähettäjä luo satunnaisen symmetrisen CEK:n.
- Tämä CEK suojataan (salataan) tai johdetaan valitun algoritmin (alg) perusteella.
Viestin salaaminen
- Lähettäjä valmistelee salattavan tekstin.
- Lähettäjä luo JWE-otsikon, jossa määritetään käytettävä salausalgoritmi(enc) ja avaimenhallinta-algoritmi(alg).
- Lähettäjä luo satunnaisen JWE Initialization Vector -vektorin.
- JWE-otsikon base64url-koodattua muotoa käytetään AAD-tietona (Additional Authenticated Data).
- Todennettu salaus suoritetaan selkotekstille käyttämällä enc-parametrin määrittelemää algoritmia, jossa CEK on salausavain, Initialization Vector ja AAD. Prosessi tuottaa salaustekstin (salatun sisällön) ja todennustunnisteen.
- Tuloksena olevat komponentit koodataan base64url-koodilla ja ketjutetaan pisteillä (.), jolloin muodostuu lopullinen JWE (Compact Serialization):
BASE64URL(UTF8(JWE Protected Header)). || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag).
Viestin salauksen purkaminen
- Vastaanottaja tarkistaa alg-parametrin. Tämän algoritmin perusteella hän käyttää yksityistä avaintaan (jos CEK oli epäsymmetrisesti salattu) tai ennalta jaettua symmetristä avainta (jos avaimen käärimistä käytettiin) tai suorittaa avainsopimuksen saadakseen CEK:n.
- Purettua CEK:tä ja JWE:n alustusvektoria käytetään salaustekstin purkamiseen.
- Vastaanottaja tarkistaa tietojen eheyden käyttämällä Authentication Tagia ja AAD:tä. Jos tunniste ei täsmää, se osoittaa, että viestiä on peukaloitu, ja salauksen purkuyritys epäonnistuu.
Johtopäätös
JSON-verkkosalaus auttaa pitämään tiedot turvassa nykyaikaisissa verkkosovelluksissa. Kun tiedät, miten se toimii ja mitä se tekee, voit päättää, milloin ja miten sitä käytetään.
Nyt kun tunnet JWE:n perusteet, tutustutaan sen käytännön sovelluksiin. Seuraavassa artikkelissa käsittelemme, miten JWE:tä voidaan käyttää käyttäjätietojen ja tunnisteiden vastausten salaamiseen todennusvirroissa.