Grundsätzlich haben Sie drei Anforderungen:
- Es sollte nicht einfach sein, denselben Schlüssel für mehrere Client-Instanzen zu verwenden.
- Es sollte nicht einfach sein, neue gültige Schlüssel zu generieren
- Es sollte nicht einfach sein, den Schlüssel eines legitimen Kunden zu stehlen.
Der erste Teil sollte ziemlich einfach sein: Lassen Sie nur nicht zu, dass sich zwei Spieler gleichzeitig mit demselben Schlüssel auf demselben Server anmelden. Sie können die Server auch Informationen über angemeldete Benutzer austauschen lassen oder sich an einen freigegebenen Authentifizierungsserver wenden, sodass selbst die gleichzeitige Verwendung desselben Schlüssels für verschiedene Player auf verschiedenen Servern fehlschlägt. Möglicherweise möchten Sie auch nach verdächtigen Schlüsselverwendungsmustern suchen und, wenn Sie feststellen, dass ein Schlüssel durchgesickert ist, ihn einer Liste verbotener Schlüssel hinzufügen.
Für den zweiten Teil besteht eine Möglichkeit darin, einfach eine Datenbank aller gültigen ausgegebenen Schlüssel zu verwalten. Solange die Schlüssel lang genug sind (beispielsweise 128 Bit oder mehr) und zufällig ausgewählt werden (unter Verwendung eines sicheren RNG), ist die Wahrscheinlichkeit, dass jemand einen gültigen Schlüssel erraten kann, im Wesentlichen Null. (Selbst viel kürzere Schlüssel können sicher sein, wenn Sie bei fehlgeschlagenen Anmeldeversuchen eine Art Ratenbeschränkung verwenden, um Versuche zu stoppen, gültige Schlüssel mit brachialer Gewalt zu finden.)
Alternativ können Sie Schlüssel generieren, indem Sie eine eindeutige Kennung verwenden und einen Nachrichtenauthentifizierungscode (z. B. HMAC ) hinzufügen , der mit einem geheimen Hauptschlüssel berechnet wird. Solange der MAC lang genug ist, ist die Wahrscheinlichkeit, dass jemand, der den Hauptschlüssel nicht kennt, in der Lage ist, einen gültigen MAC für eine ID zu erraten, vernachlässigbar. Ein Vorteil dieser Methode besteht nicht nur darin, dass keine Schlüsseldatenbank erforderlich ist, sondern dass der Bezeichner eine beliebige eindeutige Zeichenfolge sein und Informationen über den Client codieren kann, für den der Schlüssel ausgegeben wurde.
Ein Problem bei der Verwendung von MACs besteht darin, dass die offiziellen Spieleserver (oder zumindest der Authentifizierungsserver) den Hauptschlüssel kennen müssen, um den MAC zu überprüfen. Wenn die Server gehackt werden, kann dies zu einem Verlust des Hauptschlüssels führen. Eine Möglichkeit, dieses Risiko zu mindern, besteht darin, für jede ID mehrere MACs mit unterschiedlichen Hauptschlüsseln zu berechnen, aber nur einen der Hauptschlüssel auf den Spielservern zu speichern. Auf diese Weise können Sie den Master-Schlüssel widerrufen und zu einem anderen Master-Schlüssel wechseln, falls er jemals durchgesickert ist und zum Generieren gefälschter IDs verwendet wird. Alternativ können Sie die MACs durch digitale Signaturen ersetzen , die nur mit der öffentlichen Hälfte des Hauptschlüssels überprüft werden können.
Für den dritten Teil besteht ein Ansatz darin, sicherzustellen, dass der Client seinen Schlüssel nicht an jemanden sendet, ohne zu überprüfen, ob der Empfänger wirklich ein legitimer offizieller Server ist. Sie könnten beispielsweise SSL / TLS (oder DTLS ) für den Anmeldevorgang verwenden, benutzerdefinierte Zertifikate für Ihre Spieleserver ausstellen und nur die Client-Vertrauenszertifikate von Ihnen ausstellen lassen. Die Verwendung von TLS schützt in geeigneter Weise auch die Client-Schlüssel (und alle anderen Authentifizierungsdaten) vor Abhörern, z. B. in öffentlichen WLANs.
Bei diesem Ansatz können Server von Drittanbietern leider keine Clientschlüssel überprüfen, selbst wenn sie dies möchten. Sie können dies umgehen, indem Sie einen offiziellen Authentifizierungsserver einrichten, von dem Spiele-Server von Drittanbietern Gebrauch machen können, z. B. indem sich der Client beim Authentifizierungsserver anmeldet und ein zufälliges einmaliges Token erhält, mit dem er sich beim anmelden kann Spieleserver (der dann das Token an den Authentifizierungsserver sendet, um es zu überprüfen).
Alternativ können Sie Ihren Kunden tatsächliche Client-Zertifikate oder ähnliches ausstellen. Sie können entweder ein vorhandenes Protokoll (wie TLS) verwenden, das die Authentifizierung von Client-Zertifikaten unterstützt (empfohlen), oder ein eigenes implementieren, z.
- Das Client-Zertifikat besteht aus einer beliebigen ID-Zeichenfolge, einem öffentlichen / privaten Schlüsselpaar und einer digitalen Signatur der ID und des öffentlichen Schlüssels unter Verwendung des Hauptschlüssels.
- Zur Anmeldung sendet der Client seine ID, seinen öffentlichen Schlüssel und seine Signatur. Der Server antwortet mit einer eindeutigen Abfragezeichenfolge (vorzugsweise mit einer Server-ID und einem Zeitstempel, die der Client überprüfen sollte), die der Client mit dem privaten Schlüssel signiert (um zu beweisen, dass er den Schlüssel kennt) und die Signatur an den Server sendet.
- Der Server überprüft beide Signaturen und beweist, dass die ID + der öffentliche Schlüssel einen legitimen Client-Schlüssel bilden (da sie mit dem Hauptschlüssel signiert wurden) und dass der Client-Schlüssel tatsächlich dem Client gehört (da der Client die Herausforderung des Servers mit dem privaten Schlüssel signieren könnte) Schlüssel).
(Dieses Protokoll könnte weiter vereinfacht werden, indem der Client die aus einer Server-ID und einem Zeitstempel bestehende "Abfrage" generiert und signiert. Dann muss der Server natürlich überprüfen, ob die ID und der Zeitstempel gültig sind. Beachten Sie auch, dass Dieses einfache Protokoll allein hindert einen Mittelsmann-Angreifer nicht daran, die Sitzung des Clients zu hijacken, verhindert jedoch, dass er den privaten Schlüssel des Clients erhält, der für zukünftige Anmeldungen benötigt wird.)