Sto implementando un servizio REST che richiede l'autenticazione. Non riesco a memorizzare nessuno stato per utente (come un token generato casualmente) perché il mio servizio non ha accesso diretto a un database, ma solo a un altro servizio di back-end.
La soluzione che mi è venuta in mente è la creazione di un token Web JSON ( JWT ) quando l'utente si autentica. Il set di attestazioni JWT contiene l'ID utente nel campo Oggetto ("sub"). Il server quindi crittografa il set di attestazioni direttamente ("alg": "dir") utilizzando AES GCM con chiave a 256 bit ("enc": "A256GCM") creando un JWE . La chiave viene generata una volta all'avvio del servizio e memorizzata in memoria.
Per autenticare, il client invia il nome utente / password e il server risponde con il token descritto sopra. Il client invia quindi quel token con ogni richiesta successiva.
Quando il client invia il token con richieste successive, il server lo decripta usando la chiave e assume che l'ID utente nel campo "sub" sia l'ID dell'utente corrente, senza ulteriori controlli di autenticazione. la scadenza del token viene gestita dal campo "exp" nel set di attestazioni JWT.
La connessione tra il client e il server utilizzerà SSL / TLS, quindi il token non perderà.
Sto usando questa libreria per creare e leggere i JWT perché non mi fido di scrivere codice di crittografia corretto .
Le mie domande:
- L'approccio sopra è sicuro? Un utente malintenzionato può impersonare un altro utente manipolando il token?
- L'approccio è troppo complicato? L'utilizzo del MAC (in altre parole: JWS ) al posto della crittografia ha la stessa sicurezza? (o forse di più, dal momento che è più semplice e c'è meno possibilità di commettere un errore). Non c'è nulla di particolarmente segreto nel set di attestazioni di JWT e l'utente che conosce il proprio ID non ha importanza.
- La scelta dell'algoritmo e della crittografia JWE è appropriata?
- Per JWE "alg", la libreria che sto utilizzando supporta la crittografia diretta (utilizzando la chiave direttamente per crittografare il set di attestazioni) e RSA (generando una nuova chiave per crittografare il set di attestazioni per ciascun token e crittografando il generato chiave con una chiave pubblica RSA). Ho scelto il primo perché è più semplice generare una chiave simmetrica rispetto a una chiave RSA.
- Per JWE "enc", la libreria supporta AES GCM e AES CBC HMAC SHA2 (con varie lunghezze di bit). Ho scelto GCM arbitrariamente.