Actualmente estoy implementando SRP en un juego que estoy desarrollando. Sin embargo, distribuiré este servidor de juegos y este cliente, por lo que me gustaría que el registro se permita sobre la marcha, sin requerir que el anfitrión use algún tipo de foro o comunicación por correo electrónico para preinscribir la cuenta antes del primer inicio de sesión. Repasaré el flujo básico de SRP y luego mi registro cambiará.
Documentación SRP: Encontrado aquí
- El usuario ingresa su nombre de usuario y contraseña en el cliente.
- El cliente envía el nombre de usuario y un valor generado aleatoriamente al servidor.
- El servidor obtiene el verificador de sal y contraseña (que es el resultado de una función en la contraseña, ambas almacenadas externamente) del usuario y envía el valor de sal y otro generado aleatoriamente al cliente.
- Cada lado ahora, de forma independiente, calcula una clave de sesión compartida sólida, y prueba esa clave entre sí.
- Si ambas pruebas coinciden, el usuario se ha autenticado correctamente.
Para agregar la funcionalidad de registro, aquí están mis cambios propuestos.
- El usuario ingresa su nombre de usuario y contraseña en el cliente.
- El cliente envía el nombre de usuario al servidor.
- El servidor comprueba si existe actualmente un usuario con el nombre de usuario enviado por el cliente.
- Si no existe ningún usuario, el servidor envía la clave pública RSA al cliente, solicitando al cliente que genere un salt y un verificador.
- El cliente envía la sal, el valor efímero público y el verificador al servidor, y lo codifica con la clave pública.
- El servidor decodifica el salt y el verificador con la clave privada.
- Cada lado ahora, de forma independiente, calcula una clave de sesión compartida sólida, y prueba esa clave entre sí.
- Si ambas pruebas coinciden, el usuario se ha autenticado correctamente.
- Si el usuario se ha autenticado correctamente, la sal y el verificador se guardan en la base de datos o archivo para el usuario.
¿Sería esta una forma aceptable y segura de registro en vuelo? ¿O hay algunas cosas que no he considerado?
Editar: Parece que no he proporcionado toda la información necesaria. La forma en la que estoy modelando mi juego es similar a los servidores de Minecraft, donde los usuarios pueden descargar el cliente y conectarse a cualquier número de servidores disponibles alojados por el usuario, o ellos mismos pueden hospedar el servidor. Sin embargo, la diferencia es que las cuentas de usuario de Minecraft se crean una vez, cuando se registran para la cuenta y cuando inician el cliente, el cliente se autentica con los servidores oficiales de Minecraft. Quiero dejar la administración de la base de usuarios a la gente que hospeda los servidores; de esa manera, las únicas cuentas de usuario que conocen, son las que se han registrado en su servidor.