Passa al contenuto principale

5. Producing and Consuming JWSs (Produzione e consumo di JWS)

5.1 Message Signature or MAC Computation (Calcolo della firma o del MAC del messaggio)

Per creare un JWS, devono (MUST) essere eseguiti i seguenti passaggi. L'ordine dei passaggi non è significativo nei casi in cui non vi siano dipendenze tra gli input e gli output dei passaggi.

  1. Creare il contenuto del JWS Payload.

  2. Calcolare la rappresentazione codificata del JWS Payload come ASCII(BASE64URL(JWS Payload)).

  3. Creare il JWS Protected Header. Si noti che la quantità di spazio bianco tra i valori nell'oggetto JSON del JWS Protected Header deve essere zero e non devono essere presenti caratteri di interruzione di riga.

  4. Calcolare la rappresentazione codificata del JWS Protected Header come BASE64URL(UTF8(JWS Protected Header)).

  5. Calcolare l'input di firma JWS (JWS Signing Input) come:

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

    Si noti che il carattere '.' (punto) è un separatore tra le due parti.

  6. Calcolare la JWS Signature nel modo definito per il particolare algoritmo utilizzato sull'input di firma JWS. I dettagli dell'algoritmo sono definiti in [JWA].

  7. Calcolare la rappresentazione codificata della JWS Signature come BASE64URL(JWS Signature).

  8. Se si sta producendo una JWS Compact Serialization, l'output finale è:

    BASE64URL(UTF8(JWS Protected Header)) || '.' ||
    BASE64URL(JWS Payload) || '.' ||
    BASE64URL(JWS Signature)
  9. Se si sta producendo una JWS JSON Serialization, creare un oggetto JSON appropriato come descritto nella sezione 7.2.

5.2 Message Signature or MAC Validation (Validazione della firma o del MAC del messaggio)

Durante la validazione di un JWS, devono (MUST) essere eseguiti i seguenti passaggi. L'ordine dei passaggi non è significativo nei casi in cui non vi siano dipendenze tra gli input e gli output dei passaggi. Se uno di questi passaggi fallisce, la validazione del JWS fallisce.

  1. Analizzare la JWS Compact Serialization o la JWS JSON Serialization per estrarre i seguenti valori codificati:

    • Il JWS Protected Header codificato
    • Il JWS Payload codificato
    • La JWS Signature codificata
  2. Decodificare in base64url il JWS Protected Header codificato dopo la conversione in una sequenza di ottetti ASCII.

  3. Verificare che la rappresentazione di ottetti risultante sia un oggetto JSON completamente valido, codificato UTF-8 e come specificato da RFC 7159 [RFC7159].

  4. Verificare che il JWS Protected Header risultante non contenga nomi di membri duplicati.

  5. Determinare l'algoritmo di firma o MAC da utilizzare:

    • Se si utilizza la JWS Compact Serialization, l'algoritmo è specificato dal valore del parametro header "alg" nel JWS Protected Header.
    • Se si utilizza la JWS JSON Serialization, l'algoritmo è specificato dal valore del parametro header "alg" nell'header JOSE per la firma/MAC in fase di verifica.
  6. Verificare che il valore "alg" sia un algoritmo supportato dall'implementazione e che questo algoritmo sia accettabile secondo la politica di sicurezza dell'applicazione. Vedere la sezione 10.6 per considerazioni sulla sicurezza.

  7. Decodificare in base64url il JWS Payload codificato e la JWS Signature codificata.

  8. Determinare la chiave da utilizzare per verificare la firma/MAC. Ciò può essere fatto utilizzando uno dei metodi descritti nella sezione 6 (Key Identification, Identificazione delle chiavi).

  9. Calcolare l'input di firma JWS come descritto nella sezione 5.1, passaggio 5.

  10. Validare la JWS Signature (o MAC) rispetto all'input di firma JWS nel modo definito per il particolare algoritmo utilizzato. I dettagli dell'algoritmo sono definiti in [JWA].

  11. Se la validazione ha successo, il JWS è valido e il payload può essere utilizzato dall'applicazione. Se la validazione fallisce, il JWS deve (MUST) essere rifiutato.

5.3 String Comparison Rules (Regole di confronto delle stringhe)

L'elaborazione di un JWS comporta necessariamente il confronto di valori di stringa noti con membri e valori negli oggetti JSON e negli URI. Ad esempio, per determinare quale algoritmo utilizzare, i nomi e i valori dei parametri header devono essere confrontati con nomi e valori registrati.

I nomi dei parametri header JSON e i valori delle stringhe JSON devono (MUST) essere confrontati utilizzando il confronto dei valori delle stringhe Unicode. Ciò significa che:

  • I nomi e i valori dei parametri header devono corrispondere esattamente, carattere per carattere
  • Il confronto è case-sensitive
  • Non deve essere eseguita alcuna normalizzazione Unicode prima del confronto
  • I caratteri devono essere confrontati utilizzando i loro valori di code point

Gli URI utilizzati nei parametri header devono (MUST) essere confrontati utilizzando il metodo Simple String Comparison definito nella sezione 6.2.1 di RFC 3986 [RFC3986].

Le implementazioni devono essere consapevoli che i confronti di stringhe eseguiti in modo errato possono portare a vulnerabilità di sicurezza. Vedere la sezione 10.13 per ulteriori informazioni sui problemi di sicurezza del confronto Unicode.