Aller au contenu principal

5. Producing and Consuming JWSs (Production et consommation des JWS)

5.1 Message Signature or MAC Computation (Calcul de la signature ou du MAC du message)

Pour créer un JWS, les étapes suivantes doivent (MUST) être effectuées. L'ordre des étapes n'est pas significatif dans les cas où il n'y a pas de dépendances entre les entrées et les sorties des étapes.

  1. Créez le contenu du JWS Payload.

  2. Calculez la représentation encodée du JWS Payload comme ASCII(BASE64URL(JWS Payload)).

  3. Créez le JWS Protected Header. Notez que la longueur de l'espace blanc entre les valeurs JSON dans l'objet JSON du JWS Protected Header doit être égale à zéro et qu'il ne doit pas y avoir de caractères de nouvelle ligne.

  4. Calculez la représentation encodée du JWS Protected Header comme BASE64URL(UTF8(JWS Protected Header)).

  5. Calculez l'entrée de signature JWS (JWS Signing Input) comme :

    ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload))

    Notez que le caractère '.' (point) est un séparateur entre les deux parties.

  6. Calculez la JWS Signature de la manière définie pour l'algorithme particulier utilisé sur l'entrée de signature JWS. Les détails de l'algorithme sont définis dans [JWA].

  7. Calculez la représentation encodée de la JWS Signature comme BASE64URL(JWS Signature).

  8. Si vous produisez une sérialisation compacte JWS, la sortie finale est :

    BASE64URL(UTF8(JWS Protected Header)) || '.' ||
    BASE64URL(JWS Payload) || '.' ||
    BASE64URL(JWS Signature)
  9. Si vous produisez une sérialisation JSON JWS, créez un objet JSON approprié comme décrit dans la section 7.2.

5.2 Message Signature or MAC Validation (Validation de la signature ou du MAC du message)

Lors de la validation d'un JWS, les étapes suivantes doivent (MUST) être effectuées. L'ordre des étapes n'est pas significatif dans les cas où il n'y a pas de dépendances entre les entrées et les sorties des étapes. Si l'une de ces étapes échoue, la validation du JWS échoue.

  1. Analysez la sérialisation compacte JWS ou la sérialisation JSON JWS pour extraire les valeurs encodées suivantes :

    • Le JWS Protected Header encodé
    • Le JWS Payload encodé
    • La JWS Signature encodée
  2. Décodez en base64url le JWS Protected Header encodé après la conversion en une séquence d'octets ASCII.

  3. Vérifiez que la représentation résultante d'octets est un objet JSON entièrement valide UTF-8 et encodé comme spécifié par RFC 7159 [RFC7159].

  4. Vérifiez que le JWS Protected Header résultant ne contient pas de noms de membres en double.

  5. Déterminez l'algorithme de signature ou MAC à utiliser :

    • Si vous utilisez la sérialisation compacte JWS, l'algorithme est spécifié par la valeur du paramètre d'en-tête « alg » dans le JWS Protected Header.
    • Si vous utilisez la sérialisation JSON JWS, l'algorithme est spécifié par la valeur du paramètre d'en-tête « alg » dans l'en-tête JOSE pour la signature/MAC en cours de vérification.
  6. Vérifiez que la valeur « alg » est un algorithme pris en charge par l'implémentation et que cet algorithme est acceptable selon la politique de sécurité de l'application. Voir la section 10.6 pour les considérations de sécurité.

  7. Décodez en base64url le JWS Payload encodé et la JWS Signature encodée.

  8. Déterminez la clé à utiliser pour vérifier la signature/MAC. Cela peut être fait en utilisant l'une des méthodes décrites dans la section 6 (Key Identification).

  9. Calculez l'entrée de signature JWS comme décrit dans la section 5.1, étape 5.

  10. Validez la JWS Signature (ou MAC) par rapport à l'entrée de signature JWS de la manière définie pour l'algorithme particulier utilisé. Les détails de l'algorithme sont définis dans [JWA].

  11. Si la validation réussit, le JWS est valide et la charge utile peut être utilisée par l'application. Si la validation échoue, le JWS doit (MUST) être rejeté.

5.3 String Comparison Rules (Règles de comparaison de chaînes)

Le traitement d'un JWS implique nécessairement la comparaison de valeurs de chaînes connues avec des membres et des valeurs dans les objets JSON et les URI. Par exemple, pour déterminer quel algorithme utiliser, les noms et valeurs des paramètres d'en-tête doivent être comparés aux noms et valeurs enregistrés.

Les noms de paramètres d'en-tête JSON et les valeurs de chaîne JSON doivent (MUST) être comparés en utilisant la comparaison de chaînes de valeurs Unicode. Cela signifie que :

  • Les noms de paramètres d'en-tête et les valeurs doivent correspondre exactement, caractère par caractère
  • La comparaison est sensible à la casse
  • Aucune normalisation Unicode ne doit être effectuée avant la comparaison
  • Les caractères doivent être comparés en utilisant leurs valeurs de points de code

Les URI utilisés dans les paramètres d'en-tête doivent (MUST) être comparés en utilisant la méthode de comparaison Simple String Comparison définie dans la section 6.2.1 de RFC 3986 [RFC3986].

Les implémentations doivent être conscientes que les comparaisons de chaînes effectuées de manière incorrecte peuvent conduire à des vulnérabilités de sécurité. Voir la section 10.13 pour plus d'informations sur les problèmes de sécurité de comparaison Unicode.