Estoy desarrollando un juego en red, y este juego requerirá que los jugadores se autentiquen en el servidor. Tanto el cliente como el servidor están escritos en Java. Estoy tratando de encontrar un método de transmisión de contraseña eficiente.
Recuerdo que miré SRP-6 hace unos años y leí que era lo que Blizzard usaba para World of Warcraft, y pensé que quizás podría funcionar.
Luego, un amigo mío me dijo que la forma en que maneja la transmisión es pedirle al servidor de inicio de sesión su clave pública, luego enviar el nombre de usuario, la contraseña y la clave pública del cliente (donde se genera el par de llaves cada vez que el usuario abre el cliente) encriptado al servidor. Esto me parece un poco pesado en términos del uso del procesador y la red requerida.
Una vez que el usuario se ha autenticado, el servidor de inicio de sesión envía al cliente un token de inicio de sesión único, que se puede considerar como un ID de sesión. Una vez que se haya completado la autenticación, el resto de los paquetes del juego se descifran entre el cliente y el servidor del juego.
Otra cosa a tener en cuenta es que este juego se lanzará al público, de manera similar a Minecraft, donde los usuarios pueden descargar el servidor, iniciarlo y permitir que los usuarios se conecten a él. Este bit fue algo que me disuadió de usar SSL / TLS entre el cliente y el servidor, ya que no quiero cargar al usuario con certificados.
¿Hay alguna razón para preferir el cifrado asimétrico en lugar de SRP? ¿Hay algo más que se haya demostrado que es seguro para transferir solo datos de nombre de usuario / contraseña?