La complejidad es el enemigo de la seguridad. Entonces es renunciar al control de los bits valiosos, como las teclas, cuando no es necesario.
Como lo entiendo, tu esquema funciona de esta manera:
- El usuario inicia la aplicación de cliente que puede acceder a los archivos locales cifrados
- El usuario ingresa a) nombre de usuario yb) contraseña
- El nombre de usuario y la contraseña se transmiten al servidor
- El servidor autentica al usuario con nombre de usuario y contraseña
- El servidor utiliza un KDF para derivar una clave de cifrado a partir de la contraseña del usuario
- El servidor descifra la clave almacenada del usuario usando la clave derivada
- El servidor transmite la clave descifrada a la aplicación cliente
- La aplicación del cliente descifra los archivos usando la clave
Sin embargo, todo lo que realmente necesita es 1, 2b, 5 y 8. Los pasos 2a, 3, 4, 6 y 7 son innecesarios y simplemente agregan riesgo.
En el modelo más simple:
- El usuario inicia la aplicación de cliente que puede acceder a los archivos locales cifrados
- El usuario ingresa la contraseña
- La aplicación de cliente local utiliza un KDF para derivar una clave de cifrado a partir de la contraseña del usuario
- La aplicación del cliente descifra los archivos usando la clave
En este modelo, no se requiere un almacenamiento de claves persistente, ningún servidor posee un tesoro de claves cifradas y hashes que pueden ser atacados y utilizados para forzar la contraseña, sin transmisión por Internet de datos confidenciales.
Su pregunta no menciona ninguna razón particular para querer o necesita un servidor que almacene claves. A falta de esa necesidad, creo que deberías repensar tu modelo de amenaza, porque el diseño actual no tiene mucho sentido para mí.