Sto costruendo un sistema di sessioni di lunga durata che richiede che gli utenti verifichino la loro autenticazione prima di eseguire operazioni "pericolose", come cambiare le impostazioni critiche, cancellare il loro account, ecc. Questo requisito è analogo a Facebook che richiede di rientrare la tua password prima di cambiare il tuo indirizzo email, per esempio. Vorrei consentire all'utente di apportare modifiche pericolose entro un certo periodo di tempo T
dopo aver verificato la password.
Il sistema si ridimensiona orizzontalmente, quindi non è possibile ricordare "chi ha convalidato quando" in memoria e vorrei evitare di memorizzare le informazioni nel database e cercarlo in ogni azione "pericolosa". Credo che le foglie generino un certo fattore di sicurezza% time-sensitive come la mia migliore alternativa.
Ecco il mio approccio per generare e verificare questo token, per favore fatemi sapere se pensate che abbia trascurato qualcosa, o sto facendo un errore di sicurezza insensato. Tutte le comunicazioni client-server sono su TLS / SSL.
1. Alice wants to perform some "dangerous" operation (client side).
2. Alice is presented with a "verify password" modal or similar UI element
where she enters her password.
3. The client-side system sends the password to the server.
4. The server checks if the password matches Alice's stored password.
5. If the passwords match, a token is generated as follows:
a. Let 'id' be Alice's user ID (UUID), 't' be a fixed length
string representation of the current timestamp, and 'secret'
be a secret key appropriately protected on the server.
b. Generate the secure part as 'k = (string) HMAC(secret, id + t)'
(Assume 'k' to be typecasted or converted to a string representation.)
c. Finally, let 'token = k + t' where '+' is the string concatenation
operator
6. Send the token to Alice.
7. For each "dangerous" operation, Alice includes 'token' with the request.
8. The server can verify the 'token' by splitting 'k' and 't' and
validating 'k' as in step 5.b above, and verify that time 'T' hasn't
elapsed since Alice verified her password.
Credo che questo approccio risolva il problema. Suggerimenti? Mi manca qualcosa?