Passa al contenuto principale

7. Serializations (Serializzazioni)

I JWE utilizzano una di due serializzazioni: la serializzazione compatta JWE o la serializzazione JSON JWE. Le applicazioni che utilizzano questa specifica devono specificare quale serializzazione e quali funzionalità di serializzazione vengono utilizzate per quell'applicazione. Ad esempio, le applicazioni potrebbero specificare che viene utilizzata solo la serializzazione JSON JWE, che viene utilizzato solo il supporto della serializzazione JSON JWE per un singolo destinatario o che viene utilizzato il supporto per più destinatari. Le implementazioni JWE devono implementare solo le funzionalità necessarie per le applicazioni che sono progettate per supportare.

7.1 JWE Compact Serialization (Serializzazione compatta JWE)

La serializzazione compatta JWE rappresenta il contenuto crittografato come una stringa compatta e sicura per gli URL. Questa stringa è:

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

Solo un destinatario è supportato dalla serializzazione compatta JWE e non fornisce alcuna sintassi per rappresentare i valori di intestazione non protetta condivisa JWE, intestazione non protetta per destinatario JWE o JWE AAD.

7.2 JWE JSON Serialization (Serializzazione JSON JWE)

La serializzazione JSON JWE rappresenta il contenuto crittografato come un oggetto JSON. Questa rappresentazione non è ottimizzata né per la compattezza né è sicura per gli URL.

Per la serializzazione JSON JWE sono definite due sintassi strettamente correlate: una sintassi completamente generale, con cui il contenuto può essere crittografato per più di un destinatario, e una sintassi appiattita, che è ottimizzata per il caso di un singolo destinatario.

7.2.1 General JWE JSON Serialization Syntax (Sintassi di serializzazione JSON JWE generale)

I seguenti membri sono definiti per l'uso negli oggetti JSON di livello superiore utilizzati per la sintassi di serializzazione JSON JWE completamente generale:

protected : Il membro "protected" deve (MUST) essere presente e contenere il valore BASE64URL(UTF8(JWE Protected Header)) quando il valore dell'intestazione protetta JWE non è vuoto; altrimenti, deve (MUST) essere assente. Questi valori di parametri di intestazione sono protetti dall'integrità.

unprotected : Il membro "unprotected" deve (MUST) essere presente e contenere il valore dell'intestazione non protetta condivisa JWE quando il valore dell'intestazione non protetta condivisa JWE non è vuoto; altrimenti, deve (MUST) essere assente. Questo valore è rappresentato come un oggetto JSON non codificato, piuttosto che come una stringa. Questi valori di parametri di intestazione non sono protetti dall'integrità.

iv : Il membro "iv" deve (MUST) essere presente e contenere il valore BASE64URL(JWE Initialization Vector) quando il valore del vettore di inizializzazione JWE non è vuoto; altrimenti, deve (MUST) essere assente.

aad : Il membro "aad" deve (MUST) essere presente e contenere il valore BASE64URL(JWE AAD) quando il valore JWE AAD non è vuoto; altrimenti, deve (MUST) essere assente. Un valore JWE AAD può essere incluso per fornire un valore codificato in base64url che è protetto dall'integrità ma non crittografato.

ciphertext : Il membro "ciphertext" deve (MUST) essere presente e contenere il valore BASE64URL(JWE Ciphertext).

tag : Il membro "tag" deve (MUST) essere presente e contenere il valore BASE64URL(JWE Authentication Tag) quando il valore del tag di autenticazione JWE non è vuoto; altrimenti, deve (MUST) essere assente.

recipients : Il valore del membro "recipients" deve (MUST) essere un array di oggetti JSON. Ogni oggetto contiene informazioni specifiche per un singolo destinatario. Questo membro deve (MUST) essere presente con esattamente un elemento di array per destinatario, anche se alcuni o tutti i valori degli elementi dell'array sono l'oggetto JSON vuoto "" (il che può accadere quando tutti i valori dei parametri di intestazione sono condivisi tra tutti i destinatari e non viene utilizzata alcuna chiave crittografata, come quando si esegue la crittografia diretta).

I seguenti membri sono definiti per l'uso negli oggetti JSON che sono elementi dell'array "recipients":

header : Il membro "header" deve (MUST) essere presente e contenere il valore dell'intestazione non protetta per destinatario JWE quando il valore dell'intestazione non protetta per destinatario JWE non è vuoto; altrimenti, deve (MUST) essere assente. Questo valore è rappresentato come un oggetto JSON non codificato, piuttosto che come una stringa. Questi valori di parametri di intestazione non sono protetti dall'integrità.

encrypted_key : Il membro "encrypted_key" deve (MUST) essere presente e contenere il valore BASE64URL(JWE Encrypted Key) quando il valore della chiave crittografata JWE non è vuoto; altrimenti, deve (MUST) essere assente.

Almeno uno dei membri "header", "protected" e "unprotected" deve (MUST) essere presente in modo che i valori dei parametri di intestazione "alg" e "enc" siano trasmessi per ogni calcolo del destinatario.

Possono essere presenti membri aggiuntivi in entrambi gli oggetti JSON definiti sopra; se non sono compresi dalle implementazioni che li incontrano, devono (MUST) essere ignorati.

Alcuni parametri di intestazione, incluso il parametro "alg", possono essere condivisi tra tutti i calcoli dei destinatari. I valori dei parametri di intestazione nell'intestazione protetta JWE e nei valori dell'intestazione non protetta condivisa JWE sono condivisi tra tutti i destinatari.

I valori dei parametri di intestazione utilizzati durante la creazione o la validazione dei valori di testo cifrato e tag di autenticazione per destinatario sono l'unione dei tre insiemi di valori di parametri di intestazione che possono essere presenti: (1) l'intestazione protetta JWE rappresentata nel membro "protected", (2) l'intestazione non protetta condivisa JWE rappresentata nel membro "unprotected", e (3) l'intestazione non protetta per destinatario JWE rappresentata nel membro "header" dell'elemento dell'array del destinatario. L'unione di questi insiemi di parametri di intestazione comprende l'intestazione JOSE. I nomi dei parametri di intestazione nei tre luoghi devono (MUST) essere disgiunti.

Ogni valore di chiave crittografata JWE è calcolato utilizzando i parametri del valore di intestazione JOSE corrispondente nello stesso modo della serializzazione compatta JWE. Questo ha la proprietà desiderabile che ogni valore di chiave crittografata JWE nell'array "recipients" è identico al valore che sarebbe stato calcolato per gli stessi parametri in una serializzazione compatta JWE. Allo stesso modo, i valori di testo cifrato JWE e tag di autenticazione JWE corrispondono a quelli prodotti per la serializzazione compatta JWE, a condizione che il valore dell'intestazione protetta JWE (che rappresenta i valori dei parametri di intestazione protetti dall'integrità) corrisponda a quello utilizzato nella serializzazione compatta JWE.

Tutti i destinatari utilizzano gli stessi valori di intestazione protetta JWE, vettore di inizializzazione JWE, testo cifrato JWE e tag di autenticazione JWE, quando presenti, con conseguenti risparmi di spazio potenzialmente significativi se il messaggio è grande. Pertanto, tutti i parametri di intestazione che specificano il trattamento del valore di testo in chiaro devono (MUST) essere gli stessi per tutti i destinatari. Questo significa principalmente che il valore del parametro di intestazione "enc" (algoritmo di crittografia) nell'intestazione JOSE per ogni destinatario e tutti i parametri di quell'algoritmo devono (MUST) essere gli stessi.

In sintesi, la sintassi di un JWE utilizzando la serializzazione JSON JWE generale è la seguente:

{
"protected":"<integrity-protected shared header contents>",
"unprotected":<non-integrity-protected shared header contents>,
"recipients":[
{"header":<per-recipient unprotected header 1 contents>,
"encrypted_key":"<encrypted key 1 contents>"},
...
{"header":<per-recipient unprotected header N contents>,
"encrypted_key":"<encrypted key N contents>"}],
"aad":"<additional authenticated data contents>",
"iv":"<initialization vector contents>",
"ciphertext":"<ciphertext contents>",
"tag":"<authentication tag contents>"
}

Vedere l'appendice A.4 per un esempio di JWE utilizzando la sintassi di serializzazione JSON JWE generale.

7.2.2 Flattened JWE JSON Serialization Syntax (Sintassi di serializzazione JSON JWE appiattita)

La sintassi di serializzazione JSON JWE appiattita si basa sulla sintassi generale ma la appiattisce, ottimizzandola per il caso di un singolo destinatario. La appiattisce rimuovendo il membro "recipients" e invece posizionando quei membri definiti per l'uso nell'array "recipients" (i membri "header" e "encrypted_key") nell'oggetto JSON di livello superiore (allo stesso livello del membro "ciphertext").

Il membro "recipients" non deve (MUST NOT) essere presente quando si utilizza questa sintassi. A parte questa differenza di sintassi, gli oggetti di serializzazione JSON JWE che utilizzano la sintassi appiattita vengono elaborati in modo identico a quelli che utilizzano la sintassi generale.

In sintesi, la sintassi di un JWE utilizzando la serializzazione JSON JWE appiattita è la seguente:

{
"protected":"<integrity-protected header contents>",
"unprotected":<non-integrity-protected header contents>,
"header":<more non-integrity-protected header contents>,
"encrypted_key":"<encrypted key contents>",
"aad":"<additional authenticated data contents>",
"iv":"<initialization vector contents>",
"ciphertext":"<ciphertext contents>",
"tag":"<authentication tag contents>"
}

Si noti che quando si utilizza la sintassi appiattita, proprio come quando si utilizza la sintassi generale, tutti i valori dei parametri di intestazione non protetti possono risiedere nel membro "unprotected" o nel membro "header", o in entrambi.

Vedere l'appendice A.5 per un esempio di JWE utilizzando la sintassi di serializzazione JSON JWE appiattita.