Wie schütze ich mein Spiel mit dem CD-Key / der Seriennummer?

25

Daher habe ich beschlossen, Raubkopien meines XNA-Spiels vom Zugriff auf offizielle Spieleserver fernzuhalten (die moderiert sind, damit die Leute, die für das Spiel bezahlt haben, die beste Erfahrung machen), indem sie Clients mit falscher oder generierter, duplizierter oder gesperrter CD trennen Schlüssel (oder Seriennummern, da das Spiel digital ist und es überhaupt keine CDs gibt).

Wie kann ich dieses Schutzsystem für Seriennummern in mein Spiel integrieren (sowohl Clients als auch Hauptauthentifizierungsserver), sodass es nicht einfach zu hacken ist?


Beachten Sie, dass ich keine Erfahrung mit dem Erstellen eines solchen Schutzes für Software habe.

Ich habe das noch nie gemacht, aber ich verstehe die Grundlagen. Ich verstehe, warum ich auf dem Client keine Schlüsselüberprüfung durchführen kann. Daher ist es für mich in Ordnung, die Anmelde- / Pass-Authentifizierung mit einmaliger Schlüsseleingabe zu verwenden.

Derzeit besteht das Ziel dieses Schutzes darin, potenzielle Betrüger und Spieler, die sich störend verhalten, von offiziellen Servern fernzuhalten. Jeder kann mit oder ohne Schlüssel auf privaten Servern spielen, aber die Wahrscheinlichkeit, dass er unerwünschte Erfahrungen mit anderen Spielern sammelt, ist größer. Ich denke, es ist einfach genug, Spieler zu kaufen, da sie online sein müssen, um auf offiziellen Servern zu spielen.

Da das Hacken des Clients zu einfach ist, werde ich nur die anfänglichen Registrierungs- (und möglicherweise serverseitigen) Authentifizierungsverfahren schützen, damit niemand die Schlüssel stehlen kann, während sie übertragen werden.


Siehe auch:

Wie sollen Multiplayer-Spiele mit Authentifizierung umgehen?

user1306322
quelle
Wenn jemand abstimmt, erwarte ich zumindest einen Kommentar darüber, was mit der Frage nicht stimmt. Leute, ich möchte wirklich, dass meine Frage gut ist und mehr Menschen als nur mir hilft.
user1306322
4
Ich vermute, es war eine automatische Reaktion auf das Hinzufügen von DRM. Dieser Typ ist nicht besonders schlecht, aber viele von uns haben schlechte Erfahrungen damit gemacht - zum Beispiel als Spore meine Windows-Installation gemauert hat.
Izkata,
Haben Sie sich überlegt, anstelle eines CD-Schlüssels einen MMO- oder Minecraft-ähnlichen Ansatz zu verwenden, um sich anzumelden und Benutzer zu authentifizieren?
Tetrad
4
Möchten Sie DRM in einer .NET-App !? Mit Tools wie Reflector schlägt dies möglicherweise fehl. Werfen Sie einen Blick auf Terraria. Die Entwicklung wurde aufgrund von Produktpiraterie gestoppt (und viele Einnahmen ...). Ich mag die auf der Authentifizierung basierende Idee von @ Tetrad, da sie verhindert, dass Benutzer nur die Validierungsfunktion patchen müssen. Behalten Sie alle Daten auf Ihrem Server, und geben Sie nach erfolgreicher Anmeldung die Daten ein. Wenn Sie die Daten lokal aufbewahren, können sie die Authentifizierungsfunktion einfach ausbessern.
2
@Anko das war ein Verweis auf das berühmte Zitat "Wir brauchen mehr Mineralien" . Und ich meine Fakten und Fachwissen. Möglicherweise sogar Detail. Ich würde nicht wissen, wann ein wichtiges Problem genug Beachtung gefunden hat, es schien nur, als gäbe es etwas hinzuzufügen, und die Besucher der Site könnten dieses Thema interessant finden (und möglicherweise neue Benutzer werden), also habe ich das Kopfgeld erhöht.
user1306322

Antworten:

24

Grundsätzlich haben Sie drei Anforderungen:

  1. Es sollte nicht einfach sein, denselben Schlüssel für mehrere Client-Instanzen zu verwenden.
  2. Es sollte nicht einfach sein, neue gültige Schlüssel zu generieren
  3. 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.)

Ilmari Karonen
quelle
2
Ein kleiner Punkt - während ein völlig zufälliger Schlüssel den maximalen Schlüsselbereich bietet (und perfekt funktioniert, wenn Sie eine Validierung anhand einer Datenbank mit ausgegebenen Schlüsseln durchführen), ist er nicht benutzerfreundlich. Stecken Sie eine Validierung in den Schlüssel, damit die meisten Fehler erkannt werden, bevor Sie versuchen, auf den Server zuzugreifen.
Loren Pechtel
Ich denke, @LorenPechtel hat einen starken Punkt in Bezug auf die Benutzerfreundlichkeit des Schlüssels. Und der bezahlte Benutzer hat immer die Möglichkeit, versehentlich einen Tippfehler-Schlüssel (Tippfehler) an den Server zu senden.
Vishnu
@Vishnu Ich kenne mich als Benutzer aus, der Schlüssel eintippt. Ich hätte sehr gerne einige Check-Informationen pro Gruppe, auch wenn dies die Eingabe eines längeren Schlüssels bedeutete.
Loren Pechtel
16

Es gibt keine 100% ige Sicherheit, aber Sie könnten mit einem ziemlich einfachen Ansatz beginnen:

  • Sie benötigen eine Möglichkeit, die generierten Schlüssel zu überprüfen, z. B. eingeschlossene Prüfsummen. Natürlich darf dies nicht zu leicht herauszufinden sein.

  • Optional (aber empfohlen) würde es eine serverseitige Datenbank geben, die die Schlüssel mit einer Datenbank aller ausgegebenen Schlüssel überprüft, sodass Sie keine Schlüssel generieren können, selbst wenn Sie den Algorithmus haben (ignorieren wir das bruteforcen).

Von da an kann man zwei verschiedene Ansätze verfolgen, aber in jedem Fall ist etwas sehr wichtig:

  • Überprüfen Sie nicht den Schlüssel auf der Clientseite. Dies ist sehr wichtig, da es eigentlich ziemlich einfach ist, in .net / XNA geschriebene Dateien zu dekompilieren. Wenn Sie nach dem Schlüssel fragen oder ihn weitergeben müssen (Login oder Registrierung), müssen Sie den Schlüssel mit einem Hash (mit Salz usw.) versehen und an den Server senden.

Wie für die tatsächlichen Pfade:

  • Der Hash-Schlüssel (siehe oben) muss während des Authentifizierungs- / Anmeldevorgangs gesendet werden.

  • Als Alternative (IMO die bessere, obwohl viele diese Art von "DRM" nicht mögen): Verwenden Sie den Schlüssel im Client überhaupt nicht. Erfordern Sie stattdessen, dass sich der Benutzer bei einem Konto anmeldet und einen gültigen CD-Schlüssel benötigt (hierfür ist die oben genannte Datenbank erforderlich), um Konten zu erstellen. So gehen moderne Spiele, zB jedes Pay-to-Play-MMORPG, damit um.

Persönlich würde ich mich aus einem einfachen Grund für den Account-Ansatz entscheiden: Letztendlich kann man nicht verhindern, dass Leute CD-Schlüssel stehlen (Bruteforcing, Reverse Engineering oder Betrug). Als solches könnten die Leute einfach einen neuen Schlüssel erstellen, um weiterzuspielen oder andere vom Spiel auszuschließen. Mit Account-gebundenen Schlüsseln kann niemand etwas mit einem bereits verwendeten Schlüssel anfangen. Falls jemand einen Schlüssel gekauft hat, den ein anderer generiert hat, können Sie den Kontoinhaber trotzdem übertragen, vorausgesetzt, es gibt genügend Beweise dafür.

Mario
quelle
2
Anstelle von Standardprüfsummen sollten Sie einen kryptografisch sicheren Hashing-Algorithmus verwenden. Sie können den privaten Schlüssel auf dem Server belassen und dem Client den öffentlichen Schlüssel geben, und dann wissen Sie, dass das System ohne Zugriff auf den Server sicher ist.
Adam
@Adam: Durch die Verwendung eines kryptografisch sicheren Hashing-Algorithmus wird sichergestellt, dass Angreifer keine gültigen Schlüssel generieren können. Das Problem kann jedoch auch von der für die Weitergabe legitimer Schlüssel zuständigen Behörde nicht gelöst werden. Während eine einfache Prüfsumme nicht sehr sicher ist, sind Einwegfunktionen in diesem Zusammenhang nicht realisierbar.
Marcks Thomas
Nun, Sie können beide kombinieren, z. B. indem Sie den ersten Teil des Schlüssels zu einer zufälligen Kombination von Zeichen machen und die zweite Hälfte des Hashs. Jeder, der das Spiel verkauft, kann sowieso keinen Keygen verwenden (es sei denn, es gibt eine Möglichkeit, um sicherzustellen, dass keine Kollisionen / Konflikte auftreten, wie z. B. eine "Hersteller-ID" als Teil des Schlüssels).
Mario
1

Pangaea Software - Entwickler mehrerer Mac-Spiele - hat ein Thema zum Kopierschutz in sein (jetzt kostenloses) Spieleentwicklungsbuch aufgenommen. Das Buch erklärt auch, wie mit Raubkopien und anderen Hacks umgegangen wird. Das Buch konzentriert sich auf die Entwicklung von Mac-Spielen, aber die Ideen könnten auch für andere Plattformen nützlich sein. Im Buch ist für jedes Kapitel ein Quellcode enthalten, der im folgenden Download enthalten ist. Es gibt auch Quellcode (geschrieben in C), der sich auf den Kopierschutz bezieht.

Das Buch kann hier heruntergeladen werden .

Wolfgang Schreurs
quelle
Ich konnte in diesen Büchern nichts Nützliches finden.
user1306322
Persönlich hatte ich aber in Kapitel 16 ein paar nette Tipps, aber YMMV.
Wolfgang Schreurs