Lavoro come professionista IT Security (IT Auditor), quindi posso rispondere per esperienza.
In primo luogo, definirò un token sicuro. Affinché il token di accesso sia sicuro: dovresti soddisfare quanto segue:
- Il token scade a un certo punto
- Il token non può essere modificato in transito tra client e server.
- L'utente non può modificare il token.
Token expires at some point
Questo requisito è il più semplice. Si specifica una data in cui questo token non sarà più valido, sul lato server. Se la data del login > data di scadenza del token, quindi rifiuta il token come scaduto.
Token cannot be modified in transit between client and server
Dato che stai utilizzando TLS, (auspicabilmente versione 1.2 e aggiornamento a 1.3 quando finalizzato) questo problema dovrebbe essere risolto già. TLS fornisce riservatezza , assicurando che il token di accesso non sia divulgato senza autorizzazione a una terza parte.
User cannot modify the token
Questo requisito è il più difficile. Per accompagnarlo, è necessario utilizzare una firma digitale con PKI. Non utilizzare SHA 1 come funzione di hashing perché questo algoritmo è INSECURE. Applicando la funzione di hashing ai risultati del token di accesso in un digest di messaggi. Il digest del messaggio viene quindi crittografato utilizzando la chiave privata che solo l'utente conosce. Una volta decifrate le credenziali sul server utilizzando la chiave pubblica dell'utente, se il messaggio risultante corrisponde alle credenziali sul server, allora è garantito che nessuna modifica del token di accesso da parte dell'utente ha avuto luogo.
Il metodo di cui sopra garantisce la riservatezza C e I - Requisiti di integrità della triade della CIA di sicurezza. Il non disconoscimento (l'utente non può negare che siano le sue credenziali) è garantito anche perché la chiave pubblica dell'utente è in grado di decifrare il messaggio crittografato ricevuto.
Per rispondere ad alcune delle tue altre domande:
Should I encrypt the access token locally when stored?
Sì, dovresti. Quanto sopra riguarda i dati in transito, ma non a riposo . Se un hacker dovesse compromettere la macchina client locale, lui o lei può facilmente rubare un token di testo in chiaro e quindi impersonare il legittimo proprietario.
How should I encrypt?
Dovresti utilizzare un algoritmo di crittografia strong come AES o RSA. Scegli una lunghezza lunga della chiave (es: 256) per massimizzare la sicurezza.