Caso de uso
Me gustaría cifrar los datos en una base de datos para una aplicación web. Existen los siguientes requisitos:
- El descifrado solo debe ser posible cuando un usuario proporciona una frase de contraseña
- El cifrado siempre debería ser posible
Por lo tanto, uso cifrado asimétrico usando claves públicas y privadas. La aplicación web puede anular una operación de cifrado en cualquier momento, pero la aplicación web solo se puede descifrar cuando el usuario proporciona una frase de contraseña.
Problema
Todo esto funciona bien, pero el problema que tengo es que cada vez que el usuario desea descifrar los datos, debe proporcionar una frase de contraseña. Me gustaría proporcionar al usuario la opción de "permanecer autenticado" para una sesión, después de que ingrese la contraseña una vez.
Aquí es donde estoy teniendo problemas. Si decido que la clave es un hash de la contraseña en la sesión, el servidor técnicamente podrá descifrar los datos sin la entrada del usuario. Recordar un hash de frase de contraseña en una cookie tampoco es una opción.
¿Qué opciones comunes tengo? ¿Es posible que mi enfoque general sea incorrecto?
¿Posible solución?
Después de pensar, planeo implementar lo siguiente:
- El usuario envía la frase de contraseña al servidor
- El servidor crea una clave aleatoria de 128 bits
- El servidor codifica la contraseña y la cifra con la nueva clave aleatoria usando AES
- El hash cifrado se almacena en la sesión en el servidor
- Los usuarios almacenan en su cookie: ID de sesión y clave de cifrado
- Solo cuando ambos reciben una solicitud, el servidor puede descifrar los datos
- La sesión dejará de ser válida después de un cierto período de tiempo
¿Es este un enfoque seguro?
Los datos solo se pueden descifrar si:
- Se recuperan los datos cifrados
- Se recupera la clave privada
- Los datos de la sesión se recuperan
- Se recuperan las cookies de usuario
Notas :
-
Los datos en sí no están cifrados con la clave pública, pero se genera una clave aleatoria y se utiliza para cifrar los datos mediante AES. Esta clave se encripta con la clave pública, lo que permite algún tipo de gestión de usuarios.
-
Todo se ejecuta en HTTPS
-
La clave privada está cifrada con un hash de la frase de contraseña, no la frase de contraseña en sí misma
Gracias de antemano