Authentifizierung für ein Multiplayer-Spiel über Sockets
11
Ich implementiere ein benutzerdefiniertes Binärprotokoll für ein neues Multiplayer-Spiel, an dem ich arbeite. Es ist ein rundenbasiertes Strategiespiel, also spielt das Timing keine Rolle. Ich habe derzeit den grundlegenden Teil der Datensynchronisierung des Systems abgeschlossen und mich gefragt, wie die Benutzeranmeldung / -abmeldung und -verschlüsselung normalerweise für MMORPG-Spiele oder ähnliches durchgeführt wird.
Können Sie ein Schema für die sichere / geheime Passwortübertragung während der Anmeldung empfehlen? (Diffie-Hellman-Schlüsselaustausch?)
Wie implementiere ich eine starke Verschlüsselung für Datenpakete? (AES 128-Bit? .. oder welches Schema auch immer in diesem Beitrag als "Verschlüsselung stärker als Sie wahrscheinlich knacken" bezeichnet wird)
Gibt es Datagramm-Formatschemata, die dazu beitragen, den Spieleserver für die Wiedergabe von Angriffen, ungültigen Datenpaketen und dergleichen zu sichern?
SRP - Secure Remote Password - Dies basiert auf Diffie-Hellman. Die Idee ist, dass Sie eine gegenseitige Kennwortprüfung durchführen können, ohne jemals das Kennwort oder Informationen zu übertragen, die zur Ableitung verwendet werden können. Auch wenn es über das Kabel sicher ist, sollten Sie Ihre Passwörter dennoch hashen und salzen da Ihr Server sie niemals im Klartext speichern darf .
Der Vorteil von SRP besteht darin, dass Sie nach Abschluss des Vorgangs auch einen gemeinsam ausgehandelten Verschlüsselungsschlüssel erhalten, den ein Angreifer aufgrund der von Ihnen übertragenen Daten nicht hätte ableiten können. Dies bedeutet, dass Sie nach der Authentifizierung des Benutzers einen symmetrischen Verschlüsselungsalgorithmus (wie AES) verwenden können.
Angenommen, Sie verwenden UDP mit Ihrer eigenen zuverlässigen / geordneten (verbindungsorientierten) Implementierung: Verschlüsseln Sie die gesamte UDP-Wiedergabe - einschließlich Ihrer 'Paketsequenznummer'. Wenn Ihr System richtig ausgelegt ist, lehnt es wiedergegebene Nachrichten automatisch ab und ein Eindringling kann die Paketsequenznummer nicht ändern, da sie verschlüsselt ist (daher ist eine Wiedergabe möglich - sie wird jedoch automatisch ignoriert).
Gedanken
Sollte Ihre Authentifizierung sicher sein? Absolut. Machen Sie keine Kompromisse in Bezug auf die Sicherheit, wenn ein Passwort in Frage kommt. Daher sollten Sie auf jeden Fall die erste Kugel in meiner Antwort in Betracht ziehen.
Sollten Ihre Daten sicher sein? Nur wenn es sich um einen Kauf im Spiel / eine Mikrotransaktion handelt - und warum dann nicht einfach etwas Bewährtes wie HTTPS verwenden? Das Verschlüsseln Ihres Spielverkehrs ist aus folgenden Gründen wahrscheinlich keine praktikable Lösung:
Es ist völlige Paranoia.
Dies erhöht den CPU-Zeitaufwand auf Ihrem Server, sofern Sie keine (teuren) Hardware-Verschlüsselungsmodule erwerben können.
Es spielt keine Rolle, wie viel Sicherheit Sie für Ihre Daten über das Kabel bereitstellen - jemand könnte den Client-Prozess entführen und Nachrichten abfangen, sobald sie verschlüsselt und gesendet werden. Dies ist nicht nur eine Möglichkeit, sondern wesentlich besser möglich das Einfügen von Code im Vergleich zum Abfangen von Paketen einfacher ist. Wenn Sie dies zur Verhinderung von Betrug tun, verschwenden Sie Ihre Zeit vollständig und vollständig.
In Bezug auf die Passwortsicherheit gibt es leider nichts, was Sie vernünftigerweise gegen ein entführtes System tun können. Der Client ist feindselig geworden. Blizzards WoW-Dongles sind dafür ausgelegt - aber ich bin mir nicht sicher, wie sicher das ist (besonders wenn Sie es angeschlossen lassen).
Bitte, wenn Sie zur Cheat-Verhinderung verschlüsseln, geben Sie es auf. Sie werden zu kurz kommen - ich habe Ihnen die Informationen gegeben, falls Sie es nicht sind. Denken Sie daran, dass Sie Pakete selektiv nach dem ersten Byte im Paket verschlüsseln können und angeben, ob der Rest verschlüsselt ist. Auch hier würde ich mich an HTTPS halten, wenn Sie beispielsweise Kreditkartentransaktionen durchführen müssen: Sie sind äußerst selten und HTTPS wird von Experten entwickelt - im Gegensatz zu etwas, das Sie oder ich entworfen haben.
Trotzdem verschlüsselt Blizzard tatsächlich den WoW-Verkehr. Der Hauptgrund dafür ist, dass jemand, der wahrscheinlich ein kompletter Amateur ist, beschlossen hat, sich an einem selbst entwickelten Verschlüsselungsalgorithmus zu versuchen. das hat wirklich gut geklappt . Selbst wenn Sie branchenübliche Algorithmen verwenden, besteht eine gute Chance, dass jemand Ihren Code zurückentwickelt und simuliert. Sobald der Client sein Kennwort eingibt, ist nicht mehr zu erkennen, dass ein nicht unterstütztes System angeschlossen ist.
+1 für die Aussage, dass das Verschlüsseln von Datenpaketen zur Verhinderung von Betrug nutzlos ist. OP: Überprüfen Sie alles , was Sie vom Client erhalten, führen Sie Sanity Checks durch, überprüfen Sie noch einmal, ob die vom Client angeforderte Aktion möglich ist, überprüfen Sie die Waffenreichweite, die Bewegungsgeschwindigkeit usw., aber verschwenden Sie keine Zeit damit, Ihren Client zu sichern, da er gehackt wird , wenn Ihr Spiel ist es wert. Einige MMO-Unternehmen verschlüsseln und verschleiern ihre Clients / Protokolle, aber dies soll nicht das Betrügen verhindern , sondern es beispielsweise Bot-Erstellern erschweren, gute Ergebnisse zu erzielen, und selbst dies wird von engagierten Expertenteams durchgeführt.
Gilead
1
Ein kleiner Streitpunkt über Ihre dritte Antwort: Nur die Verschlüsselung der Pakete reicht möglicherweise nicht aus, um Manipulationen zu verhindern, da viele Verschlüsselungsschemata zumindest etwas formbar sind . Zum Schutz der Nachrichtenintegrität benötigen Sie entweder einen MAC oder einen authentifizierten Verschlüsselungsmodus .
Ilmari Karonen
+1 Vielen Dank für eine sehr vollständige Antwort. Wir prüfen derzeit die Implementierung von SRP. Was empfehlen Sie zur Hash-Funktion für Passwörter? MD5? Wie wäre das OTR-Protokoll (Off the Record) für einen solchen Anwendungsfall? würde es gut für auth / crypto anstelle von SRP funktionieren? Wenn ich SRP verwende, muss ich einen der folgenden "authentifizierten Verschlüsselungsmodi" verwenden? (OCB 2.0, Key Wrap, CCM, EAX, Encrypt-then-MAC und GCM)
Robinicks
1
@Jenko verwendet die SHA-Familie von Algorithmen (wahrscheinlich SHA1) - Sie sollten MD5 heutzutage vermeiden. OTR ist wirklich nicht etwas , das Sie suchen soll - es ist nicht sicher sein / verschleiern soll (in der Tat seine so konzipiert, dass jemand kann mehr leicht Pakete schmiedet) es auch für Instant Messaging konzipiert ist und nicht die Maschine - Kommunikation. Keiner dieser Modi wird benötigt, verwenden Sie einfach SRP: Sobald Sie einen gemeinsam ausgehandelten symmetrischen Schlüssel haben, ist es garantiert genug, dass Sie mit dem richtigen Dritten sprechen können, wenn Sie einfach etwas verschlüsseln können. Lesen Sie auch noch einmal meine letzten beiden Absätze.
Jonathan Dickinson
1
Eigentlich habe ich einen noch besseren Vorschlag: Verwenden Sie eine vorhandene DTLS-über-UDP- Implementierung und versuchen Sie nicht, Ihre eigene zu rollen. Sie sparen Zeit und es gibt viele kleine, aber wichtige Details, die leicht falsch sind, wenn Sie versuchen, Ihre eigene Datagramm-Verschlüsselungsschicht zu entwerfen.
Ilmari Karonen
2
Ich denke mein letzter Kommentar zu Jonathans ansonsten ausgezeichneter Antwort ist es wert, zu einer eigenen Antwort erweitert zu werden:
Wenn Sie nicht viel Erfahrung mit Kryptografie haben, sollten Sie nicht versuchen, eine eigene Verschlüsselungsschicht zu entwerfen, wenn Sie dies vermeiden können. Wenn du das tust eine Menge Krypto Erfahrung haben, sollten Sie wissen besser als die eigene Verschlüsselungsschicht zu entwerfen , wenn Sie es vermeiden können.
Versuchen Sie stattdessen, eine vorhandene, standardisierte und gut getestete Kryptobibliothek zu finden, die genau das tut, was Sie benötigen. In Ihrem Fall würde ich GnuTLS empfehlen , das laut Wikipedia sowohl TLS-SRP- Authentifizierung ( RFC 5054 ) als auch sichere UDP-Kommunikation mit DTLS ( RFC 6347 ) bietet . Ersteres kümmert sich um die Anmeldung, während letzteres den so gebildeten sicheren Kanal sowohl vor Abhör- als auch vor aktiven Angriffen schützt und Sie sogar vor Wiederholungsangriffen schützen kann .
Ich benutze TCP. Dies ist eine ganz andere Art von Spiel für einen bestimmten Kunden. Ähnlich wie beim Spielen / Wetten erhöhen alle Informationen, die zur Entführung des Prozesses verwendet werden können, die Wahrscheinlichkeit unnötiger Verluste durch das Haus. Wir müssen die Daten äußerst sicher aufbewahren, da Informationen in diesem Fall Geld sind.
Robinicks
OK, wenn Sie TCP verwenden, ist es noch einfacher: Sie können normales TLS 1.2 anstelle von DTLS verwenden, wodurch Sie mehr Optionen zur Auswahl haben. Ich würde die GnuTLS-Bibliothek trotzdem empfehlen.
Ilmari Karonen
Ich werde ein bisschen recherchieren und herausfinden, ob ich sowohl auf der Client- als auch auf der Serverseite auf den TLS-Quellcode verweisen und mein Protokoll auf dessen Funktionsweise aufbauen kann. Wäre das stark genug? Im Wesentlichen ist es nur Paketverschlüsselung mit einer Verschlüsselung / Modus, richtig?
Robinicks
Nein, das TLS-Protokoll bietet noch viel mehr . Aus diesem Grund möchten Sie eine Standardbibliothek verwenden, die diese implementiert, anstatt Ihre eigene zu rollen.
Ich denke mein letzter Kommentar zu Jonathans ansonsten ausgezeichneter Antwort ist es wert, zu einer eigenen Antwort erweitert zu werden:
Wenn Sie nicht viel Erfahrung mit Kryptografie haben, sollten Sie nicht versuchen, eine eigene Verschlüsselungsschicht zu entwerfen, wenn Sie dies vermeiden können. Wenn du das tust eine Menge Krypto Erfahrung haben, sollten Sie wissen besser als die eigene Verschlüsselungsschicht zu entwerfen , wenn Sie es vermeiden können.
Versuchen Sie stattdessen, eine vorhandene, standardisierte und gut getestete Kryptobibliothek zu finden, die genau das tut, was Sie benötigen. In Ihrem Fall würde ich GnuTLS empfehlen , das laut Wikipedia sowohl TLS-SRP- Authentifizierung ( RFC 5054 ) als auch sichere UDP-Kommunikation mit DTLS ( RFC 6347 ) bietet . Ersteres kümmert sich um die Anmeldung, während letzteres den so gebildeten sicheren Kanal sowohl vor Abhör- als auch vor aktiven Angriffen schützt und Sie sogar vor Wiederholungsangriffen schützen kann .
quelle