Estoy tratando de diseñar un sistema que permita que los miembros del personal de nuestra pequeña empresa compartan de forma segura la información confidencial del cliente (texto) y los vean en una página web junto con las comunicaciones menos sensibles. Tengo la intención de usar PHP porque es lo que mejor conozco.
El principal desafío es que los datos deben almacenarse en el servidor, pero deben consumir mucho tiempo para que sean útiles si el servidor se ve comprometido.
Mi idea es la siguiente:
-
Cuando se crea un usuario del personal, eligen una contraseña segura y se procesa utilizando bcrypt (12) y se almacena en nuestra base de datos. La contraseña simple también se usa para crear un par de claves RSA de 4096 bits utilizando OpenSSL. Ambas claves se almacenan en el servidor.
-
Cuando se crea una nota segura, se cifra con la clave pública de cada miembro del personal y cada copia se almacena en la base de datos.
-
Cuando un miembro del personal inicia sesión, su contraseña simple se compara con el hash para ver si coinciden. Si lo hacen, la contraseña simple, la IP del cliente y la ID de usuario se serializan y se cifran simétricamente utilizando mcrypt. La clave utilizada para cifrar la cadena se almacena en el sistema de archivos del servidor. El cipertexto se envía como una cookie al cliente.
-
Cuando un miembro del personal accede a otra página, el servidor descifra la cookie y usa la contraseña simple y la clave privada del usuario para descifrar cualquier información confidencial en esa solicitud y envía la información confidencial al navegador del usuario.
Todo será sobre HTTPS con cifrados seguros.
Soy consciente de que esto es probablemente muy difícil de hacer completamente seguro, pero me gustaría saber si alguien puede detectar algún defecto evidente en esta configuración que pueda mejorarse razonablemente. En general, también sería útil saber cuán útil es una clave privada sin la contraseña segura asociada.