Qual è un buon modo per autorizzare un cliente alla volta a eseguire un'azione tramite websocket?

0

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?

    
posta Surprised Coconut 14.11.2018 - 15:39
fonte

1 risposta

1

Utilizza il Metodo 3 e assicurati di utilizzare il TLS ( protocollo WSS ).

Se un utente = una connessione web-socket, questo è sufficiente.

Se vuoi gestire la riconnessione o vuoi autenticare alcuni utenti, genera un ID casuale per ciascun utente e trasmetti questo utilizzando https. Il client websocket invia l'id alla connessione per identificarsi.

TLS protegge dagli attacchi man in the middle per HTTPS e WSS.

    
risposta data 14.11.2018 - 16:06
fonte

Leggi altre domande sui tag