Estoy creando un sistema de sesión de larga duración que requiere que los usuarios verifiquen su autenticación antes de realizar operaciones "peligrosas", como cambiar la configuración crítica, eliminar su cuenta, etc. Este requisito es análogo a Facebook que requiere que vuelvas a ingresar su contraseña antes de cambiar su dirección de correo electrónico, por ejemplo. Me gustaría permitir que el usuario realice cambios peligrosos dentro de un período de tiempo T
después de verificar su contraseña.
El sistema se escalará horizontalmente, por lo que recordar "quién validó cuándo" en la memoria no es posible y me gustaría evitar almacenar la información en la base de datos, y buscarla en cada acción "peligrosa". Creo que eso deja la generación de algunos token
seguros sensibles al tiempo como mi mejor alternativa.
Este es mi enfoque para generar y verificar este token. Por favor, avíseme si cree que he pasado por alto algo o si estoy cometiendo un error de seguridad tonto. Toda la comunicación cliente-servidor se realiza a través de 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.
Creo que este enfoque resuelve el problema. Sugerencias? ¿Me estoy perdiendo algo?