Ich möchte ein raumbasiertes mehrschichtiges Spielmodell einrichten, in dem Spieler Spiele veranstalten und als Host fungieren können (dh der Server mit autorisierender Leistung). Ich möchte einen Master-Server hosten, der die Gegenstände, den Rang, das Geld, die Erfahrung usw. des Spielers verfolgt.
Wie kann ich in einem solchen Modell verhindern, dass jemand, der ein Spiel hostet (mit einem modifizierten Server), den Master-Server mit ungültigen Übereinstimmungsergebnissen fälscht und so Exp, Geld oder Ranglisten gewinnt?
Vielen Dank. -Cody
networking
multiplayer
Cody Smith
quelle
quelle
Antworten:
Es wurde darauf hingewiesen, dass meine vorherige Antwort möglicherweise auf einem Missverständnis dessen beruhte, was Sie unter "Spoofing" verstanden haben. (Wenn ja, lassen Sie es mich bitte wissen und ich werde es löschen.)
Wenn Sie verhindern möchten, dass die Spieleserver gefälschte Daten an den Master-Server senden, ist dies - wie Jari Komppa feststellt - im Allgemeinen nicht vollständig zu verhindern. Tatsächlich ist es einfach eine Variante des klassischen Problems der Verhinderung von Betrug im Mehrspielermodus , außer dass die Zwischenserver und nicht die Clients des Betrugs verdächtigt werden. Viele der gleichen Techniken, die für die traditionelle Betrugsprävention verwendet werden, könnten auch hier funktionieren, aber wie üblich ist keine von ihnen völlig narrensicher.
Es gibt jedoch einige Dinge, die Sie tun könnten, um Server zu betrügen. Eine davon wäre, dass jeder Spieler in einem Spiel separat den Master-Server kontaktiert und bestätigt, dass er an diesem Spiel teilnimmt. (Sie sollten dies wahrscheinlich tun, bevor das Spiel beginnt, damit Sie sicherstellen können, dass alle zustimmen, wer die Teilnehmer sind, und dass niemand versucht ist, zu behaupten, dass sie nicht an einem verlorenen Spiel teilgenommen haben. Sie können dazu digitale Signaturen verwenden Verschieben Sie dies jedoch. Im Wesentlichen könnte jeder Spieler in einem Spiel eine Nachricht mit der Aufschrift " Ich bin Spieler X und nehme an Spiel M auf Server S zum Zeitpunkt T mit den Spielern Y, Z und W teilnehmen.""und senden Sie es an den Spieleserver, der es später an den Master-Server weiterleiten kann.) Auf diese Weise können Sie zumindest sicherstellen, dass ein Betrugsserver die Rangfolge eines Spielers nicht beeinflusst, der nicht tatsächlich auf diesem Server spielt .
Dies ist besonders nützlich, wenn Sie so etwas wie Elo-Bewertungen verwenden, bei denen die Rangfolge der Spieler hauptsächlich von ihrer relativen Leistung abhängt . Sicher, jemand, der einen gefälschten Server betreibt, könnte immer noch eine Reihe gefälschter Konten erstellen und Ergebnisse einreichen, die besagen, dass sein eigenes Konto die gefälschten übertrifft. Bei einem relativen Ranking-System reicht es jedoch aus, das Konto des Betrügers leicht über den Fälschungen zu platzieren ( was wiederum Tiefstwerte haben wird).
Eine andere naheliegende Maßnahme, um Betrug zu unterbinden, besteht darin, die Spieler ihre Spielergebnisse direkt vom Master-Server aus überprüfen zu lassen. Wenn ein Spieler ein Match auf einem neuen Server gewinnt, die an den Master-Server gesendeten Ergebnisse jedoch besagen, dass er verloren hat (oder wenn die Ergebnisse überhaupt nicht gesendet werden), wird er darüber informiert, dass etwas faul ist. Hoffentlich melden sie zu diesem Zeitpunkt entweder den Server wegen Betrugs oder stimmen zumindest mit den Füßen ab und spielen nie wieder auf diesem Server.
Tatsächlich könnten Sie dies automatisch machen: Lassen Sie die Clients nach jedem Spiel, nachdem die Ergebnisse an den Master-Server gesendet wurden, sie vom Master-Server zurückholen und vergleichen Sie sie mit der Meinung des Clients, dass das Spiel beendet ist. Wenn es eine Nichtübereinstimmung gibt, melden Sie dies sowohl dem Spieler (damit er weiß, dass etwas nicht stimmt) als auch dem Master-Server (damit Sie betrügerische Server erkennen können). Natürlich müssen Sie als Betreiber des Master-Servers dann entscheiden, wer lügt - der Server oder der Player -, aber hoffentlich wird dies in den meisten Fällen anhand des Berichtsmusters ziemlich offensichtlich.
quelle
Hinweis: Diese Antwort kann auf einem Missverständnis der Frage beruhen - siehe Kommentare unten.
Kurze generische Antwort: Verwenden Sie digitale Signaturen .
Insbesondere sollte der Master-Server über einen privaten Schlüssel für ein geeignetes digitales Signaturschema (RSA, DSA, ECDSA usw.) verfügen und seinen öffentlichen Schlüssel irgendwie sicher an alle Clients weiterleiten. Dann kann der Server alle Daten, die er an Clients sendet, mit dem privaten Schlüssel signieren (oder möglicherweise verwenden, um ein gemeinsames Geheimnis auszuhandeln, das zum symmetrischen Verschlüsseln und / oder Authentifizieren der Kommunikation zwischen ihm und diesem bestimmten Client verwendet werden kann), und der Client kann den öffentlichen Schlüssel verwenden Stellen Sie sicher, dass die Signatur vom Server generiert wurde.
Natürlich ist Ihr nächstes Problem mit dem öffentlichen Schlüssel zu verteilen , so dass ein vermeintlicher Server nicht Parodie kann , dass und seinen eigenen öffentlichen Schlüssel ersetzen. Das ist vielleicht nicht so schwer, wenn Sie es im Voraus tun können (z. B. den Schlüssel zusammen mit der ausführbaren Spieldatei verteilen), aber es wird schwierig, wenn Sie es später tun müssen, zum Beispiel, weil die Identität des Master-Servers in nicht bekannt ist voraus. Eine Standardlösung besteht darin, eine andere zu verteilen öffentlichen Schlüssel (dessen entsprechender privater Schlüssel nur Ihnen bekannt ist) im Voraus an alle Clients und dann die Nachricht mit dem öffentlichen Schlüssel des Master-Servers mit diesem anderen Schlüssel zu signieren, bevor Sie ihn senden.
Tatsächlich könnten Sie solche Signaturketten sogar noch weiter erweitern - beispielsweise einen supergeheimen privaten Hauptschlüssel, der irgendwo in einem Safe aufbewahrt wird und dessen öffentlicher Schlüssel allen Clients bekannt ist, und einen anderen privaten Schlüssel für den "täglichen Gebrauch" wird verwendet, um die Serverschlüssel tatsächlich zu signieren, und deren öffentlicher Schlüssel selbst mit dem supergeheimen Hauptschlüssel signiert ist, bevor er im Safe eingeschlossen wird. Dies ist an sich nicht so nützlich, aber es wird möglicherweise sehr nützlich, wenn Sie auch einen Mechanismus zum Widerrufen gefährdeter Schlüssel einschließen, sodass Sie ihn beispielsweise, wenn Ihr Schlüssel für den täglichen Gebrauch durchgesickert ist, einfach widerrufen und einen anderen generieren können.
Was ich oben beschreibe, ist eine rudimentäre Art von Public-Key-Infrastruktur . Eine sichere Implementierung kann ziemlich kompliziert werden, aber zum Glück wurde es schon früher gemacht. Wenn Sie über HTTPS eine Verbindung zu einer Website (wie Wikipedia ) herstellen , ist dies genau das, was Ihr Browser tut: Er empfängt ein Zertifikat mit öffentlichem Schlüssel vom Server und überprüft, ob das Zertifikat mit dem Servernamen in der URL übereinstimmt Wird als widerrufen aufgeführt und von einer bekannten und vertrauenswürdigen Zertifizierungsstelle signiert. Anschließend wird eine temporäre Zertifizierungsstelle ausgehandelt symmetrischer Verschlüsselungsschlüsselnur sich selbst und dem Besitzer des dem Zertifikat entsprechenden privaten Schlüssels bekannt. Dieser symmetrische Schlüssel wird dann verwendet, um alle zwischen dem Client und dem Server gesendeten Daten zu verschlüsseln und zu authentifizieren.
Insbesondere sollten Sie sich unbedingt vorhandene SSL / TLS-Bibliotheken (die normalerweise mit einer X.509- PKI-Implementierung geliefert werden ) oder möglicherweise SPKI ansehen . Diese sind immer noch etwas kompliziert, aber wahrscheinlich einfacher (und sicherer) als der Versuch, Ihre eigenen zu rollen.
quelle
Dies hängt von der Art des Spiels und vom Grund ab, warum Sie die Serverrolle auslagern.
Unter bestimmten Umständen können Sie dies meistens mit kryptografischen Überwachungsprotokollen erreichen. Wenn es sich beispielsweise um ein rundenbasiertes Spiel für zwei Spieler handelt und Sie festlegen können, dass jeder Client einen privaten asymmetrischen Schlüssel für Signaturzwecke hat, können Sie ein Protokoll nach dem Vorbild von erstellen
Am Ende senden beide Clients das Ergebnis an den zentralen Server. Wenn sie nicht einverstanden sind, senden sie die Audit-Trails: (S1, C1, m1), (S2, C2, m2) usw. Da jeder Spieler seine Züge unterschrieben hat, sie sind ihnen verpflichtet.
Es ist immer noch anfällig dafür, dass ein Spieler den anderen DDOS-fähig macht, um zu verhindern, dass er sein Ergebnis übermittelt, aber Sie können wirklich nicht viel dagegen tun.
NB Dies ist nur eine kurze Skizze - ich bin sicher, wenn Sie sie auf crypto.stackexchange.com veröffentlichen, wird jemand massive Löcher hineinstecken - aber ich denke, das Prinzip ist solide. Lassen Sie jedes Schema, das Sie entwerfen, von jemandem überprüfen, der sich auskennt, bevor Sie sich darauf verlassen.
quelle