Estoy trabajando en un juego web basado en una ronda donde solo un cliente / jugador puede realizar una acción a la vez. A lo largo del juego, cada jugador tendrá una conexión de websocket al servidor. El cliente enviará mensajes JSON simples como
{
"action":"kick_in_the_face"
}
Mis requisitos son estos.
- Nadie (jugador, atacante, hombre en el medio) debe ser capaz de falsificar las acciones de otros jugadores.
- Idealmente, funciona sin el nombre de usuario / contraseña del usuario.
- Lo ideal es que funcione para usuarios no registrados.
Algunas ideas que tenía hasta ahora.
Método 1: Deje que el servidor envíe un hash difícil de adivinar solo al jugador autorizado y deje que el cliente lo envíe de vuelta en el mensaje como este
{
"hash":"c99dd3c7c0bb5ed272c3683b1946a95d22a0abfe57284b4ba33592e478e64269"
"action":"kick_in_the_face"
}
Entonces, si el servidor recibe un mensaje con el hash correcto, debe haber sido una acción del jugador autorizado. Se calculará un nuevo hash para cada mensaje.
Método 2: pensé que el método 1 no será lo suficientemente seguro. Todavía hay una posibilidad de que otro jugador adivine el hash. Así que pensé que podría implementarlo de esta manera
- Al inicio del juego, el servidor y el cliente acordarán una clave segura (como en el intercambio de claves Diffie-Hellman)
- El servidor crea un hash y lo cifra utilizando, por ejemplo, AES y la clave, y lo enviará solo al cliente autorizado.
- El cliente autorizado descifrará el hash, agregará la acción, cifrará el mensaje JSON y lo enviará al servidor.
-
El servidor descifrará el mensaje y verificará el hash con el hash original que envió.
Aunque no estoy seguro de si el método 2 es realmente más seguro que el método 1 y evitará las adivinanzas. Además, me sentiré incómodo al implementar un método para intercambiar claves de forma segura.
Método 3: ignora todo eso y deja que el servidor realice un seguimiento de la conexión de socket web autorizada. El servidor rastreará la conexión websocket del jugador actualmente autorizado e ignorará los mensajes de todas las demás conexiones. ¿Es esto seguro contra el hombre en los ataques medios u otros ataques? ¿Está garantizado que la conexión websocket no es secuestrada? ¿Cómo podría protegerme contra eso?
¿Qué método es el más seguro? ¿Hay otro método que debería considerar? ¿Es esto seguro contra el hombre en los ataques medios u otros ataques?