La crittografia di un JWT firmato si dimostra valida per proteggere il carico utile delle richieste?

8

Sto lavorando su un'applicazione web client-server, e come schema di autenticazione, sto emettendo token web json codificati base64. Considera il seguente token ...

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Decodificato come tale ...

{
  "alg": "HS256",        // header
  "typ": "JWT"
},
{
  "sub": "1234567890",   // payload
  "name": "John Doe",
  "admin": true
},
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 'secret') // signature 

La mia preoccupazione è con la porzione payload di questo token, in cui desidero fornire rivendicazioni definite ad es. %codice%. La mia preoccupazione è che questi valori siano visibili e manomessi dall'utente finale una volta emessi. Se modifichi questa porzione, non invaliderà il controllo della firma. Non desidero persistere alcun dato sul server per ricontrollare / confrontare i token emessi - Vorrei mantenere il server completamente stateless .

Ho pensato di firmare il token, crittografandolo tramite AES 256 e utilizzarlo come mio "token". Il flusso verrebbe riassunto come tale ...

  1. genera e firma token codificato base64
  2. codifica lato server token tramite AES 256
  3. Invia token crittografato al client

  4. richiesta richiesta, token crittografato fornito

  5. decrypt token server side
  6. convalidare la firma del token codificato con originale base64 (ora in grado di garantire che le attestazioni non siano state alterate)

I miei pensieri sono, le richieste (carico utile) non saranno viste, e qualsiasi manomissione di questo valore cifrato ovviamente non decifrerà come previsto dal lato server. La mia domanda è - questo è possibile? Non sono riuscito a trovare molto sul web per crittografare interi token. C'è un modo migliore ?

    
posta scniro 20.05.2016 - 23:08
fonte

1 risposta

10

Credo che tu stia facendo due domande:

  1. la modifica del carico utile annulla la firma: TL; DR: sì
  2. l'aggiunta della crittografia su JWT ti dà autenticità del contenuto: TL; DR: non crittografare te stesso, usa JWE!

Ecco le risposte in modo più dettagliato:

(1) Secondo le specifiche, link

la firma di un JWT (JWS) firmato viene calcolata sull'intestazione protetta e sul payload:

(vedere la sezione 5.1. Firma del messaggio o calcolo MAC)

Compute the JWS Signature in the manner defined for the
       particular algorithm being used over the JWS Signing Input
       ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' ||
       BASE64URL(JWS Payload)). 

Quindi la modifica del carico utile dovrebbe invalidare la firma.

(2) NON cifrare il tuo JWT !! Esiste una specifica effettiva che definisce come crittografare i JWT (chiamati JWE): link

JWE utilizza la crittografia autenticata, il che significa che il testo in chiaro viene prima crittografato e quindi viene prodotto un controllo di integrità sul testo cifrato. Puoi ottenere maggiori informazioni su come appare il testo in chiaro dalla Sezione 5.1 delle specifiche di cui sopra.

È possibile memorizzare in modo sicuro i criteri di accesso nel payload del JWT se si utilizzano formati crittografati o firmati. Si consiglia di utilizzare la crittografia se non si desidera che il client o altre parti abbiano alcuna conoscenza dei dati della politica. Se non ti interessa chi può leggerlo e ti interessa solo chi può modificare i valori, usa solo le firme.

Ricorda però che maggiore è la sicurezza che aggiungi, maggiore è l'impatto sulle prestazioni, quindi utilizza il tuo giudizio su ciò che è necessario.

Nota finale: la chiave di gestione delle chiavi di firma e crittografia diventa anche un problema importante da tenere in considerazione, perché alla fine della giornata, chiunque abbia accesso alle chiavi può decifrare il tuo JWE o modificare la firma del tuo JWS. Quindi assicurati di utilizzare le buone pratiche di sicurezza in cui memorizzi le chiavi effettive, chi ha accesso a queste e in che modo vengono utilizzate e conservate in memoria.

    
risposta data 20.06.2017 - 18:12
fonte

Leggi altre domande sui tag