Autenticazione per una partita multiplayer tramite socket


11

Sto implementando un protocollo binario personalizzato per un nuovo gioco multiplayer su cui sto lavorando. È un gioco di strategia a turni, quindi i tempi non contano davvero. Al momento ho completato la parte di sincronizzazione dei dati di base del sistema e mi chiedevo come il login / logout e la crittografia degli utenti vengano generalmente eseguiti per giochi MMORPG o simili.

  • Potete consigliarmi uno schema per la trasmissione sicura / segreta di password durante l'accesso? (Scambio di chiavi Diffie-Hellman?)
  • Come posso implementare una crittografia avanzata per i pacchetti di dati? (AES 128-bit? .. o qualunque schema si riferisca a questo post come "crittografia più forte di quella che probabilmente si creerà")
  • Esistono schemi di formato di datagrammi che aiutano a rafforzare il server di gioco per riprodurre attacchi, pacchetti di dati non validi e simili?

Risposte:


15

risposte

  • SRP - Secure Remote Password - Si basa su Diffie-Hellman. L'idea è che è possibile effettuare un controllo reciproco della password senza mai trasferire la password o qualsiasi informazione che possa essere utilizzata per ricavarla. Anche se è sicuro via cavo, dovresti comunque eseguire l'hashing e il salt delle tue password poiché il tuo server non deve mai memorizzarle in testo semplice .
  • Il vantaggio di SRP è che una volta completato fornisce anche una chiave di crittografia reciprocamente negoziata che un utente malintenzionato non sarebbe stato in grado di dedurre dati i dati trasferiti. Ciò significa che sei libero di usare un algoritmo di crittografia simmetrica (come AES) una volta che l'utente è autenticato.
  • Supponendo che tu stia utilizzando UDP con la tua implementazione affidabile / ordinata (orientata alla connessione) sopra di essa: crittografa l'intero carico di riproduzione UDP - incluso il tuo 'numero di sequenza di pacchetti'. Se il sistema è progettato correttamente, rifiuterà automaticamente i messaggi riprodotti e un intruso non sarà in grado di modificare il numero di sequenza dei pacchetti perché è crittografato (quindi è possibile un replay - ma verrebbe automaticamente ignorato).

Pensieri

La tua autenticazione dovrebbe essere sicura? Assolutamente. Non scendere a compromessi in termini di sicurezza quando una password è in questione. Quindi dovresti assolutamente prendere in considerazione il primo punto nella mia risposta.

I tuoi dati dovrebbero essere sicuri? Solo se si tratta di un acquisto in-game / micro-transazione - e quindi perché non usare qualcosa di provato e vero come HTTPS. La crittografia del traffico di gioco non è probabilmente una soluzione praticabile per i seguenti motivi:

  • È una paranoia completa.
  • Aggiungerà un sovraccarico di tempo CPU sul server, a meno che non sia possibile acquistare (costosi) moduli di crittografia hardware.
  • Non importa quanta sicurezza offri ai tuoi dati via cavo: qualcuno potrebbe dirottare il processo client e intercettare i messaggi il momento prima che vengano crittografati e inviati. Questa non è solo una possibilità, ma infinitamente più possibile in quanto è sostanzialmente più facile iniettare codice rispetto ai pacchetti intercettanti. Se lo stai facendo per prevenire i cheat, stai sprecando completamente e completamente il tuo tempo.
    • In termini di sicurezza delle password, purtroppo non c'è nulla che si possa ragionevolmente fare su un sistema dirottato, il client è diventato ostile. I dongle Blizzards WoW sono progettati per far fronte a questo, ma non sono sicuro di quanto sia sicuro (specialmente se lo lasci collegato).

Per favore, se stai crittografando per la prevenzione dei cheat, abbandonalo. Stai per venire breve - ti ho dato le informazioni nel caso in cui non lo sei. Ricorda che puoi crittografare selettivamente i pacchetti dal primo byte nell'essere pacchetto e indicatore se il resto è crittografato: anche se, ancora una volta, mi atterrerei a HTTPS se devi fare cose come le transazioni con carta di credito: sono estremamente rare e HTTPS è progettato da esperti, a differenza di qualcosa progettato da te o da me.

Detto questo, Blizzard crittografa effettivamente il proprio traffico WoW. Il motivo principale per cui questo si è rotto è perché qualcuno, che è probabilmente un dilettante completo, ha deciso che avrebbero provato con un algoritmo di crittografia cresciuto in casa; questo è andato benissimo . Anche se usi algoritmi standard del settore, c'è una buona probabilità che qualcuno decodifichi il tuo codice e lo simuli - una volta che il client inserisce la sua password non si può dire che un sistema non supportato è collegato.


2
+1 per dire che la crittografia dei pacchetti di dati per la prevenzione dei cheat è inutile. OP: verifica tutto ciò che ricevi dal cliente, esegui controlli di integrità, ricontrolla se l'azione richiesta dal cliente è possibile, controlla i range di armi, la velocità di movimento ecc. Ma non perdere tempo a proteggere il tuo client in quanto verrà hackerato se il tuo gioco ne vale la pena. Alcune aziende di MMO crittografano e offuscano i loro client / protocolli, ma non per evitare imbrogli, ma per rendere più difficile, ad esempio, i creatori di bot ottenere buoni risultati, e anche questo viene fatto da team dedicati di esperti.
Gilead,

1
Un piccolo cavillo sulla tua terza risposta: la semplice crittografia dei pacchetti potrebbe non essere sufficiente per evitare manomissioni, poiché molti schemi di crittografia sono almeno in qualche modo malleabili . Per proteggere l'integrità dei messaggi, è necessario un MAC o una modalità di crittografia autenticata .
Ilmari Karonen,

+1 Grazie per una risposta molto completa. Analizzare l'implementazione di SRP in questo momento Quali sono i tuoi consigli sulla funzione hash utilizzata per le password? MD5? Come sarebbe il protocollo OTR (Off the Record) per un tale caso d'uso? funzionerebbe bene per auth / crypto invece di SRP? Nel caso in cui utilizzo SRP, dovrei utilizzare una delle seguenti modalità di "crittografia autenticata"? (OCB 2.0, Key Wrap, CCM, EAX, Encrypt-then-MAC e GCM)
Robinicks

1
@Jenko usa la famiglia di algoritmi SHA (probabilmente SHA1) - dovresti evitare MD5 in questi giorni. OTR non è davvero qualcosa che dovresti guardare - non è progettato per essere sicuro / oscuro (in realtà è progettato in modo che qualcuno possa falsificare più facilmente i pacchetti) è anche progettato per la messaggistica istantanea e non per la comunicazione automatica. Nessuna di queste modalità è necessaria, basta usare SRP: una volta che hai una chiave simmetrica reciprocamente negoziata, essere semplicemente in grado di crittografare qualcosa è abbastanza sicuro che stai parlando con la terza parte corretta. Inoltre, rileggi i miei ultimi due paragrafi.
Jonathan Dickinson,

1
In realtà, ho un suggerimento ancora migliore: utilizzare un'implementazione DTLS su UDP esistente e non tentare di implementare il proprio. Ti farà risparmiare tempo e ci sono molti piccoli ma importanti dettagli che possono essere facilmente sbagliati se provi a progettare il tuo livello di crittografia del datagramma.
Ilmari Karonen,

2

Penso che valga la pena espandere il mio ultimo commento alla risposta altrimenti eccellente di Jonathan in una risposta a sé stante:

Se non hai molta esperienza di crittografia, non dovresti provare a progettare il tuo livello di crittografia se puoi evitarlo. Se fare un sacco di esperienza crypto, si dovrebbe sapere meglio di progettare il proprio livello di crittografia se si può evitare.

Invece, prova a trovare una libreria crittografica esistente, standardizzata e ben collaudata che faccia quello che ti serve. Nel tuo caso, consiglierei GnuTLS , che, secondo Wikipedia , fornisce sia l' autenticazione TLS-SRP ( RFC 5054 ) sia la comunicazione UDP sicura con DTLS ( RFC 6347 ). Il primo si occupa del login, mentre il secondo protegge il canale sicuro così formato da attacchi attivi e di intercettazione e può persino proteggerti dagli attacchi di replay .


Sto usando TCP. Questo è un tipo di gioco molto diverso per un cliente specifico. Simile al gioco d'azzardo / scommesse, tutte le informazioni che possono essere utilizzate per dirottare il processo aumentano le possibilità di perdite inutili da parte della casa. Dobbiamo mantenere i dati estremamente sicuri, perché in questo caso le informazioni sono denaro.
Robinicks,

OK, se stai usando TCP, allora è ancora più semplice: puoi usare TLS 1.2 normale invece di DTLS, che ti offre più opzioni tra cui scegliere. Consiglio comunque la libreria GnuTLS.
Ilmari Karonen,

Farò un po 'di ricerca e vedrò se posso fare riferimento al codice sorgente TLS sia sul lato client che sul lato server e basare il mio protocollo su ciò che fa. Sarebbe abbastanza forte? Essenzialmente è solo la crittografia dei pacchetti con qualche cifra / modalità, giusto?
Robinicks,

No, c'è molto di più nel protocollo TLS di quello. Ecco perché vuoi usare una libreria standard che la implementa, invece di creare la tua.
Ilmari Karonen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.