Sto lavorando a un gioco web basato su round in cui solo un cliente / giocatore alla volta può eseguire un'azione. Durante il gioco ogni giocatore avrà una connessione web-socket al server. Il client invierà semplici messaggi JSON come
{
"action":"kick_in_the_face"
}
I miei requisiti sono questi.
- Nessuno (giocatore, attaccante, man-in-the-middle) deve essere in grado di simulare azioni di altri giocatori.
- Idealmente funziona senza nome utente / password utente
- Idealmente funziona per gli utenti non registrati.
Alcune idee che ho avuto fino ad ora.
Metodo 1: Lascia che il server invii un hash difficile da indovinare solo al giocatore autorizzato e lascia che il client lo risponda nel messaggio in questo modo
{
"hash":"c99dd3c7c0bb5ed272c3683b1946a95d22a0abfe57284b4ba33592e478e64269"
"action":"kick_in_the_face"
}
Quindi, se il server riceve un messaggio con l'hash corretto, deve essere stata un'azione da parte del giocatore autorizzato. Un nuovo hash verrà calcolato per ogni messaggio.
Metodo 2: ho pensato che il metodo 1 non sarebbe abbastanza sicuro. C'è ancora una possibilità che un altro giocatore possa indovinare l'hash. Quindi pensavo di poterlo implementare in questo modo
- All'inizio del gioco il server e il client saranno d'accordo su una chiave sicura (come nello scambio di chiavi Diffie-Hellman)
- Il server crea l'hash e lo crittografa utilizzando ad esempio AES e la chiave e lo invierà solo al client autorizzato.
- Il client autorizzato decrittografa l'hash, aggiunge l'azione, crittografa il messaggio JSON e invia al server.
-
Il server decodifica il messaggio e controlla l'hash con l'hash originale inviato.
Anche se non sono sicuro che il metodo 2 sia effettivamente più sicuro del metodo 1 e preverrà l'ipotesi selvaggia. Inoltre mi sentirò a disagio nell'implementare un metodo per scambiare le chiavi in modo sicuro.
Metodo 3: Ignora tutto e lascia che il server segua la connessione websocket autorizzata. Il server seguirà quindi la connessione web socket del player attualmente autorizzato e ignorerà i messaggi da tutte le altre connessioni. Questo è sicuro contro l'uomo nel mezzo di attacchi o altri attacchi? È garantito che la connessione web socket non sia dirottata? Come potrei proteggerlo?
Quale metodo è più sicuro? C'è un altro metodo che dovrei prendere in considerazione? È sicuro contro gli attacchi centrali o altri attacchi?