Invece di persistere in un token generato casualmente ho visto una strategia di persistenza dell'output di HMAC-SHA256 usando invece il token e una chiave privata.
La ragione per utilizzare una funzione di hash con una chiave privata è che un utente malintenzionato abbia bisogno della chiave per iniettare i token appropriati nel DB?
Ci sono altri vantaggi o svantaggi di questo metodo?
L'adozione di questa metodologia funzionerebbe nel seguente scenario di gestione delle sessioni:
Requisiti:
- L'utente dovrebbe essere in grado di revocare tutte o singole sessioni
- La revoca dovrebbe essere istantanea
Emissione:
- L'utente accede con e-mail e password
- Crea un ID di sessione 128 bit casuale
- Crea una firma taggando l'id della sessione con una chiave privata usando HMAC-SHA256
- Archivia un'associazione tra firma e id utente in DB
- Emettere un token di sessione al client: "{ID sessione} - {firma}"
convalida:
- Ricevi token di sessione "{ID sessione} - {firma}"
- Verifica la firma calcolando HMAC con la chiave privata e l'ID di sessione ricevuti. Scarta preventivamente la richiesta se non valida.
- Il token è valido, recupera l'ID utente dal DB utilizzando la firma.
O tutto questo è solo over-engineering rispetto all'utilizzo di un ID di sessione a 128 bit, hash senza chiave privata e mappa per l'id utente? (cioè, i vantaggi non sono abbastanza significativi e gli attacchi possono ancora essere fatti)
Grazie!