Fondo
Estoy tratando de diseñar una aplicación web segura y sostenible para mensajería. El propósito es aprender cómo crear una aplicación web segura.
Se supone que la aplicación está escrita en Javascript para clientes basados en web y PHP para servidor.
Los clientes que utilicen la aplicación web iniciarán sesión para poder utilizar el servicio en una amplia variedad de dispositivos.
Los clientes pueden enviar mensajes a otros usuarios, de forma segura, sin que nadie pueda leer el mensaje en texto claro. Tampoco quiero que el servidor pueda leer los mensajes, por lo que el cifrado principal tendrá que ocurrir en el lado del cliente.
Pensamientos
- SSL / TLS: asegura una comunicación válida con el servidor
- RSA - cifrado asimétrico - para cifrar claves de cifrado
- AES: para cifrar una cantidad desconocida de datos, generalmente texto simple
Obviamente, la aplicación completa se construirá utilizando SSL / TLS para permitir una comunicación segura y validada entre el cliente y el servidor.
Para garantizar que solo las partes interesadas tengan acceso a los datos enviados, se utiliza el cifrado asimétrico. Cada cliente tiene sus propias claves privadas almacenadas en el lado del cliente y sus claves públicas almacenadas en el servidor en una base de datos.
Cuando Alice quiere escribir un mensaje a Bob, encripta los datos con una clave AES fuerte, ya que RSA solo puede manejar un tamaño de datos finitos. Para asegurarse de que solo Bob pueda leer el mensaje, recupera la clave pública de Bob de la base de datos y encripta con ella la clave AES generada. El mensaje cifrado se envía al servidor, junto con la clave utilizada, cifrada con la clave pública de Bob.
Bob recupera este mensaje / par de claves del servidor. Como Bob tiene la clave privada relacionada con la clave pública utilizada para cifrar la clave del mensaje de Alice, él y solo él puede recuperar la clave utilizada en texto sin formato. Usando esta clave no cifrada, puede descifrar el mensaje principal y leerlo como texto simple.
Preocupaciones
El par de claves pública y privada debe generarse en el lado del servidor. Esto obliga a que la clave privada se envíe al usuario para su uso. ¿Cómo se puede hacer esto seguro, ya que cualquier intermediario puede recuperar la clave privada para utilizarla más a fondo para descifrar todos los mensajes de Alice?
Para asegurarse de que el servidor no sepa qué mensajes envían los usuarios, no puede tener acceso / almacenar las claves privadas. Esto obliga a que las claves se almacenen en el lado del cliente: el uso de Javascript, un idioma y una plataforma rara vez asociados a la seguridad o la persistencia segura de los datos. Dado que la seguridad es mi principal preocupación, el no almacenar las claves privadas de manera adecuada es un problema importante.
Digamos que el usuario desea iniciar sesión y usar la aplicación desde otro dispositivo, entonces la clave privada también debe aparecer "mágicamente" allí. Obligando al servidor a almacenar las claves privadas de todos modos. ¿Hay alguna otra forma de realizar este cifrado / gestión de claves?
Preguntas aclaratorias
Si los temas anteriores son demasiado largos para leer, son confusos o si solo tienes prisa, a continuación hay preguntas simplificadas.
¿Cómo puedo asegurar que los mensajes que se envían solo puedan ser leídos por esas dos partes?
¿Cómo puedo asegurar a mis usuarios que yo / el servidor o cualquier otra persona puede leer sus mensajes?
Si es una forma de almacenar las claves privadas de forma segura del lado del cliente, ¿qué tan mala es?