Aller au contenu principal

3. JSON Web Encryption (JWE) Overview (Aperçu de JWE)

JWE représente le contenu chiffré en utilisant des structures de données JSON et l'encodage base64url. Ces structures de données JSON peuvent (MAY) contenir des espaces blancs et/ou des sauts de ligne avant ou après toute valeur JSON ou caractère structurel, conformément à la section 2 de RFC 7159 [RFC7159]. Un JWE représente les valeurs logiques suivantes (chacune étant définie dans la section 2) :

  • JOSE Header (en-tête JOSE)
  • JWE Encrypted Key (clé chiffrée JWE)
  • JWE Initialization Vector (vecteur d'initialisation JWE)
  • JWE AAD
  • JWE Ciphertext (texte chiffré JWE)
  • JWE Authentication Tag (tag d'authentification JWE)

Pour un JWE, les membres de l'en-tête JOSE sont l'union des membres de ces valeurs (chacune étant définie dans la section 2) :

  • JWE Protected Header (en-tête protégé JWE)
  • JWE Shared Unprotected Header (en-tête non protégé partagé JWE)
  • JWE Per-Recipient Unprotected Header (en-tête non protégé par destinataire JWE)

JWE utilise le chiffrement authentifié pour assurer la confidentialité et l'intégrité du texte en clair ainsi que l'intégrité de l'en-tête protégé JWE et du JWE AAD.

Ce document définit deux sérialisations pour les JWE : une sérialisation compacte et sûre pour les URL appelée JWE Compact Serialization (sérialisation compacte JWE) et une sérialisation JSON appelée JWE JSON Serialization (sérialisation JSON JWE). Dans les deux sérialisations, l'en-tête protégé JWE, la clé chiffrée JWE, le vecteur d'initialisation JWE, le texte chiffré JWE et le tag d'authentification JWE sont encodés en base64url, car JSON n'a pas de moyen de représenter directement des séquences d'octets arbitraires. Lorsqu'il est présent, le JWE AAD est également encodé en base64url.

3.1 JWE Compact Serialization Overview (Aperçu de la sérialisation compacte JWE)

Dans la sérialisation compacte JWE, aucun en-tête non protégé partagé JWE ni en-tête non protégé par destinataire JWE n'est utilisé. Dans ce cas, l'en-tête JOSE et l'en-tête protégé JWE sont identiques.

Dans la sérialisation compacte JWE, un JWE est représenté comme la concaténation :

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

Voir la section 7.1 pour plus d'informations sur la sérialisation compacte JWE.

3.2 JWE JSON Serialization Overview (Aperçu de la sérialisation JSON JWE)

Dans la sérialisation JSON JWE, un ou plusieurs des éléments suivants doivent (MUST) être présents : l'en-tête protégé JWE, l'en-tête non protégé partagé JWE et l'en-tête non protégé par destinataire JWE. Dans ce cas, les membres de l'en-tête JOSE sont l'union des membres des valeurs d'en-tête protégé JWE, d'en-tête non protégé partagé JWE et d'en-tête non protégé par destinataire JWE qui sont présents.

Dans la sérialisation JSON JWE, un JWE est représenté comme un objet JSON contenant tout ou partie de ces huit membres :

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

Les six chaînes résultant de l'encodage base64url et les deux valeurs d'objets JSON non protégés sont représentées comme membres d'un objet JSON. L'inclusion de certaines de ces valeurs est optionnelle (OPTIONAL). La sérialisation JSON JWE peut également chiffrer le texte en clair pour plusieurs destinataires. Voir la section 7.2 pour plus d'informations sur la sérialisation JSON JWE.

3.3 Example JWE (Exemple JWE)

Cet exemple chiffre le texte en clair "The true sign of intelligence is not knowledge but imagination." pour le destinataire.

L'en-tête protégé JWE suivant déclare que :

  • La clé de chiffrement de contenu est chiffrée pour le destinataire en utilisant l'algorithme RSAES-OAEP [RFC3447] pour produire la clé chiffrée JWE.
  • Le chiffrement authentifié est effectué sur le texte en clair en utilisant l'algorithme AES GCM [AES] [NIST.800-38D] avec une clé de 256 bits pour produire le texte chiffré et le tag d'authentification.
{"alg":"RSA-OAEP","enc":"A256GCM"}

L'encodage de cet en-tête protégé JWE comme BASE64URL(UTF8(JWE Protected Header)) donne cette valeur :

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ

Les étapes restantes pour terminer la création de ce JWE sont :

  • Générer une clé de chiffrement de contenu (CEK) aléatoire.
  • Chiffrer la CEK avec la clé publique du destinataire en utilisant l'algorithme RSAES-OAEP pour produire la clé chiffrée JWE.
  • Encoder en base64url la clé chiffrée JWE.
  • Générer un vecteur d'initialisation JWE aléatoire.
  • Encoder en base64url le vecteur d'initialisation JWE.
  • Laisser le paramètre de chiffrement de données authentifiées supplémentaires être ASCII(BASE64URL(UTF8(JWE Protected Header))).
  • Effectuer le chiffrement authentifié sur le texte en clair avec l'algorithme AES GCM en utilisant la CEK comme clé de chiffrement, le vecteur d'initialisation JWE et la valeur de données authentifiées supplémentaires, en demandant une sortie de tag d'authentification de 128 bits.
  • Encoder en base64url le texte chiffré.
  • Encoder en base64url le tag d'authentification.
  • Assembler la représentation finale : La sérialisation compacte de ce résultat est la chaîne BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag).

Le résultat final dans cet exemple (avec des sauts de ligne à des fins d'affichage uniquement) est :

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

Voir l'annexe A.1 pour les détails complets du calcul de ce JWE. Voir l'annexe A pour des exemples supplémentaires, y compris des exemples utilisant la sérialisation JSON JWE dans les sections A.4 et A.5.