Para cifrar las comunicaciones de nuestro cliente (personalizado) a nuestros servidores (personalizados), nuestro esquema actual es un poco como este:
- El cliente utiliza la clave pública A empaquetada para cifrar algún material de clave aleatorio.
- El servidor de lobby lo descifra con la clave privada, utiliza el material de clave cifrado para configurar un canal cifrado con cifrado simétrico.
- El cliente obtiene otra clave pública B1 del servidor de lobby para iniciar sesión en el servidor de juegos 1, a través del canal cifrado. (Game Server 2 tendría una clave pública B2, etc., cada una de estas se genera al reiniciar el servidor)
- El cliente se conecta al servidor de juegos y sigue el mismo esquema que el 1-2 para asegurar las comunicaciones.
Dejando de lado cómo se genera y utiliza el material clave, si hubiera algún cambio en la seguridad, lo cambiaremos a:
- El cliente utiliza la clave pública A incluida para cifrar el material clave
- El servidor de lobby descifra con clave privada, usa el material de clave encriptado para configurar un canal encriptado con encriptación simétrica.
- El cliente se conecta al servidor de juegos y sigue el mismo esquema que el 1-2 para asegurar las comunicaciones con LA MISMA CLAVE PÚBLICA "A" que utilizó el lobby (por lo tanto, los servidores del lobby y del juego usan la misma clave privada)
En otras palabras, ¿obtenemos alguna seguridad mejorada al usar solo la clave pública incluida para el inicio de sesión en el lobby?
Una alternativa final sería con un servidor de inicio de sesión separado:
- Creamos un servidor de inicio de sesión con el que el cliente se conecta de la manera que lo hace 1-2
- El cliente recibe una nueva clave simétrica C y un número de identificación D
- El cliente se conecta al servidor de lobby, presenta el número D en texto sin formato.
- El lobby y el cliente ahora continúan la comunicación usando la tecla (suponiendo que C está en una base de datos compartida o similar) C
- El cliente se conecta al servidor del juego, de nuevo sigue 3-4 para configurar un canal encriptado.
¿Alguno de estos esquemas es significativamente peor o mejor que el otro? No veo ninguna gran diferencia.