Actualmente estoy desarrollando una aplicación web que implementa un servicio de archivado de mensajes. Se requiere que los mensajes no sean legibles por el desarrollador / sysadmins, y sería bueno que los mensajes estuvieran encriptados de extremo a extremo. Los mensajes deben ser legibles por todas las personas en un "negocio". Los mensajes que deben archivarse provienen de fuentes externas, como las API o el correo electrónico. Estos mensajes externos entrantes deben considerarse clasificados. los usuarios deben poder iniciar sesión desde cualquier navegador.
En mi implementación de prueba actual al crear una 'empresa' se generará un RSA Keypair. La clave pública se guardará en la base de datos asociada al "negocio", y la clave privada se cifrará mediante un hash derivado de la contraseña del usuario y se almacenará asociado al usuario. Cuando otros usuarios se agregan a la empresa, la clave privada descifrada del usuario registrado se cifrará utilizando el hash derivado de la contraseña del nuevo usuario y se almacenará con el nuevo usuario.
Los mensajes entrantes serán cifrados por la empresa a través de su clave pública.
Al consultar los mensajes, estos serán descifrados por la clave privada del usuario (la clave privada será la misma para todos los usuarios de la empresa, excepto que están cifradas con un hash derivado de contraseña diferente). Entonces, cuando un usuario inicie sesión, la contraseña se utilizará para obtener el hash derivado, descifrar la clave pública y almacenarla en una sesión del lado del servidor. A partir de ese momento, los mensajes se pueden descifrar y servir.
El único problema es: al leer los archivos de sesión, los administradores de sistemas aún pueden descifrar los mensajes de los usuarios registrados. ¿Hay algún protocolo para resolver esto?
También he pensado en el descifrado del lado del cliente (al enviar a los usuarios la clave privada cifrada al navegador, derivar la clave de la contraseña en el lado del cliente, descifrar la clave privada con eso y guardar la clave privada descifrada temporalmente en localstorage y descifre los mensajes de la API utilizando esa clave privada descifrada en el lado del cliente, pero ¿está seguro el almacenamiento de una clave privada descifrada en el navegador?