Así que estoy creando un sistema cliente / servidor que es similar a la idea de correo electrónico donde los clientes intercambian mensajes a través del servidor con los siguientes requisitos principales (tenga en cuenta que los clientes están registrados previamente en el servidor y tienen que autenticarse antes de cualquier transmisión de mensajes):
- Cada mensaje debe estar cifrado y nadie puede leerlo, excepto el remitente y el destinatario.
- El tiempo de encriptación no debería tomar mucho tiempo
- El mensaje debe almacenarse cifrado tanto en el lado del cliente como en el servidor (mensaje cifrado una vez creado, incluso si el cliente elige almacenarlo y enviarlo más tarde: Cifrado en la capa de aplicación ).
Propuse tres soluciones para lograr eso y todavía estoy estudiando los pros y los contras de cada solución si no te importa ayudarme:
A: uso del cifrado de clave simétrica con el servidor Cada cliente tiene una clave secreta compartida con el servidor El remitente A cifra su mensaje con su clave secreta compartida KA > el servidor descifra el mensaje con KA y lo vuelve a cifrar con la clave secreta compartida del receptor B KB > el receptor B descifra el mensaje con su clave compartida KB
El desafío en esta solución es que el servidor debe descifrar y luego volver a cifrar el mensaje. ¿Es seguro o no? ¿por qué?
B: uso de cifrado híbrido de clave simétrica y asimétrica con el servidor
El servidor almacena 2 tipos diferentes de clave para cada cliente registrado
- Clave compartida entre el servidor y el cliente
- Clave pública del cliente
• Cuando el remitente A desea cifrar un mensaje al receptor B
- A se comunica con el servidor y obtiene B clave pública Bpk usando el secreto compartido del servidor Ka-s
- A genera un secreto compartido para él y B y cifra el mensaje con él Ka-b (mensaje)
- A encripta el secreto compartido generado con la clave pública B y lo agrega al mensaje encriptado Ka-b (mensaje), Bpk (Ka-b)
• Cuando B recibe un mensaje cifrado
- B obtiene Ka-b al descifrarlo con su clave privada Bpri (Bpri (Ka-b))
- B descifra el mensaje usando el secreto compartido Ka-b
El desafío en esta solución es la sobrecarga para cifrar el mensaje donde el remitente tiene que generar una clave cada vez que quiere enviar un mensaje.
C: uso simétrico sin participación del servidor:
Cada cliente registrado tiene una clave compartida con cualquier otro cliente registrado. Si A quiere enviar un mensaje a B, puede obtener la clave compartida almacenada de Ka-b y cifrar el mensaje con ella y luego subirla al servidor.
En esta solución, el servidor no podrá leer el mensaje, por lo que se requiere menos seguridad en el servidor.
El desafío aquí es almacenar todas las claves en cada aplicación cliente y administrarlas (sincronización entre dos clientes al renovar una clave compartida vencida)
¿Hay mejores soluciones para cumplir ambos requisitos con alta seguridad?