Passa al contenuto principale

3. JSON Web Encryption (JWE) Overview (Panoramica JWE)

JWE rappresenta il contenuto crittografato utilizzando strutture dati JSON e codifica base64url. Queste strutture dati JSON possono (MAY) contenere spazi bianchi e/o interruzioni di riga prima o dopo qualsiasi valore JSON o carattere strutturale, in accordo con la sezione 2 di RFC 7159 [RFC7159]. Un JWE rappresenta i seguenti valori logici (ciascuno dei quali è definito nella sezione 2):

  • JOSE Header (intestazione JOSE)
  • JWE Encrypted Key (chiave crittografata JWE)
  • JWE Initialization Vector (vettore di inizializzazione JWE)
  • JWE AAD
  • JWE Ciphertext (testo cifrato JWE)
  • JWE Authentication Tag (tag di autenticazione JWE)

Per un JWE, i membri dell'intestazione JOSE sono l'unione dei membri di questi valori (ciascuno dei quali è definito nella sezione 2):

  • JWE Protected Header (intestazione protetta JWE)
  • JWE Shared Unprotected Header (intestazione non protetta condivisa JWE)
  • JWE Per-Recipient Unprotected Header (intestazione non protetta per destinatario JWE)

JWE utilizza la crittografia autenticata per garantire la riservatezza e l'integrità del testo in chiaro e l'integrità dell'intestazione protetta JWE e del JWE AAD.

Questo documento definisce due serializzazioni per i JWE: una serializzazione compatta e sicura per URL chiamata JWE Compact Serialization (serializzazione compatta JWE) e una serializzazione JSON chiamata JWE JSON Serialization (serializzazione JSON JWE). In entrambe le serializzazioni, l'intestazione protetta JWE, la chiave crittografata JWE, il vettore di inizializzazione JWE, il testo cifrato JWE e il tag di autenticazione JWE sono codificati in base64url, poiché JSON non dispone di un modo per rappresentare direttamente sequenze arbitrarie di ottetti. Quando presente, anche il JWE AAD è codificato in base64url.

3.1 JWE Compact Serialization Overview (Panoramica della serializzazione compatta JWE)

Nella serializzazione compatta JWE, non vengono utilizzate intestazioni non protette condivise JWE né intestazioni non protette per destinatario JWE. In questo caso, l'intestazione JOSE e l'intestazione protetta JWE sono identiche.

Nella serializzazione compatta JWE, un JWE è rappresentato come la concatenazione:

BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)

Vedere la sezione 7.1 per ulteriori informazioni sulla serializzazione compatta JWE.

3.2 JWE JSON Serialization Overview (Panoramica della serializzazione JSON JWE)

Nella serializzazione JSON JWE, uno o più dei seguenti elementi devono (MUST) essere presenti: intestazione protetta JWE, intestazione non protetta condivisa JWE e intestazione non protetta per destinatario JWE. In questo caso, i membri dell'intestazione JOSE sono l'unione dei membri dei valori di intestazione protetta JWE, intestazione non protetta condivisa JWE e intestazione non protetta per destinatario JWE che sono presenti.

Nella serializzazione JSON JWE, un JWE è rappresentato come un oggetto JSON contenente alcuni o tutti questi otto membri:

  • "protected", con il valore BASE64URL(UTF8(JWE Protected Header))
  • "unprotected", con il valore JWE Shared Unprotected Header
  • "header", con il valore JWE Per-Recipient Unprotected Header
  • "encrypted_key", con il valore BASE64URL(JWE Encrypted Key)
  • "iv", con il valore BASE64URL(JWE Initialization Vector)
  • "ciphertext", con il valore BASE64URL(JWE Ciphertext)
  • "tag", con il valore BASE64URL(JWE Authentication Tag)
  • "aad", con il valore BASE64URL(JWE AAD)

Le sei stringhe risultanti dalla codifica base64url e i due valori di oggetti JSON non protetti sono rappresentati come membri all'interno di un oggetto JSON. L'inclusione di alcuni di questi valori è opzionale (OPTIONAL). La serializzazione JSON JWE può anche crittografare il testo in chiaro per più destinatari. Vedere la sezione 7.2 per ulteriori informazioni sulla serializzazione JSON JWE.

3.3 Example JWE (Esempio JWE)

Questo esempio crittografa il testo in chiaro "The true sign of intelligence is not knowledge but imagination." per il destinatario.

La seguente intestazione protetta JWE di esempio dichiara che:

  • La chiave di crittografia del contenuto è crittografata per il destinatario utilizzando l'algoritmo RSAES-OAEP [RFC3447] per produrre la chiave crittografata JWE.
  • La crittografia autenticata viene eseguita sul testo in chiaro utilizzando l'algoritmo AES GCM [AES] [NIST.800-38D] con una chiave a 256 bit per produrre il testo cifrato e il tag di autenticazione.
{"alg":"RSA-OAEP","enc":"A256GCM"}

La codifica di questa intestazione protetta JWE come BASE64URL(UTF8(JWE Protected Header)) fornisce questo valore:

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ

I passaggi rimanenti per completare la creazione di questo JWE sono:

  • Generare una chiave di crittografia del contenuto (CEK) casuale.
  • Crittografare la CEK con la chiave pubblica del destinatario utilizzando l'algoritmo RSAES-OAEP per produrre la chiave crittografata JWE.
  • Codificare in base64url la chiave crittografata JWE.
  • Generare un vettore di inizializzazione JWE casuale.
  • Codificare in base64url il vettore di inizializzazione JWE.
  • Lasciare che il parametro di crittografia dei dati autenticati aggiuntivi sia ASCII(BASE64URL(UTF8(JWE Protected Header))).
  • Eseguire la crittografia autenticata sul testo in chiaro con l'algoritmo AES GCM utilizzando la CEK come chiave di crittografia, il vettore di inizializzazione JWE e il valore dei dati autenticati aggiuntivi, richiedendo un output di tag di autenticazione di 128 bit.
  • Codificare in base64url il testo cifrato.
  • Codificare in base64url il tag di autenticazione.
  • Assemblare la rappresentazione finale: la serializzazione compatta di questo risultato è la stringa BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag).

Il risultato finale in questo esempio (con interruzioni di riga solo per scopi di visualizzazione) è:

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
SdiwkIr3ajwQzaBtQD_A.
XFBoMYUZodetZdvTiFvSkQ

Vedere l'appendice A.1 per i dettagli completi del calcolo di questo JWE. Vedere l'appendice A per esempi aggiuntivi, inclusi esempi che utilizzano la serializzazione JSON JWE nelle sezioni A.4 e A.5.