Ich habe an einer P2P-Architektur für sicheres Spielen gearbeitet und das Problem in fünf Unterprobleme unterteilt:
- Unzulässige Änderung des gesendeten Spielstatus
- Lass Betrüger genau fallen
- Einigung auf einen Spielstand
- Vermeiden Sie "Look Ahead" -Betrug
- Versteckt sensible Informationen vor Gegnern
Die ersten vier habe ich so ziemlich alle gelöst, aber es ist die letzte, mit der ich Probleme habe.
Bevor ich auf Details eingehe, möchte ich nur fragen, ob in meiner Liste etwas verpasst wurde, um ein "betrugsicheres" p2p-Netzwerk zu erstellen. Ich interessiere mich nicht für Cheats wie die Verwendung von Aimbots, sondern nur dafür, das p2p-Netzwerk so sicher wie einen zentralen Server zu machen.
In meinen bisherigen Bemühungen, vertrauliche Informationen zu verbergen, habe ich mich auf die Position der Spieler in einem Spiel konzentriert, bei dem die Position Ihres Gegners nicht immer bekannt sein sollte. Das Problem wird dann, wie Sie bestimmen, ob Sie Ihre Position an Ihren Gegner senden sollten, ohne die Position Ihres Gegners zu kennen.
Ich habe Methoden wie das Senden mehrerer falscher Positionen durch den Gegner ausgeschlossen, damit Sie auch Ihre vergleichen können, da Ihr Gegner ein solches System leicht missbrauchen kann, da er Ihre Position erhält, wenn eine der falschen Positionen von Ihrer Position aus "sichtbar" ist.
Ich habe mich auf eine Methode konzentriert, bei der Sie ein "Gesichtsfeld" von Ihrem Gegner erhalten und dadurch bestimmen können, ob Sie Ihre Position senden sollen oder nicht. Dies ist jedoch ein Problem in Spielen wie League of Legends, in denen das Sichtfeld Ihres Gegners auch hochsensible Informationen enthält. Ich habe versucht, dieses Problem zu lösen, indem ich das Gesichtsfeld mithilfe einer singulären Matrix transformierte. Das bedeutet, dass Sie nicht von der transformierten Version des Gesichtsfelds zur ursprünglichen Version zurückkehren können. Da es sich jedoch um eine lineare Transformation handelt, können Sie immer noch herausfinden, ob sich Ihre Position innerhalb befindet das Gesichtsfeld oder nicht.
Dies funktioniert jedoch nicht perfekt, das genaue Gesichtsfeld kann nach der Transformation nicht wiederhergestellt werden, sondern es können Informationen über die "Steigungen" im Gesichtsfeld (das Gesichtsfeld besteht aus mehreren Linien, und die Steigung jeder Linie kann bestimmt werden) restauriert und damit das ursprüngliche Gesichtsfeld relativ kostengünstig rekonstruiert werden kann.
Im Wesentlichen benötige ich eine Funktion, die bestimmen kann, ob eine Position "sichtbar" ist oder nicht, und die Rekonstruktion dieser Funktion / dieses Gesichtsfelds muss so rechenintensiv sein, dass sie nach Abschluss der Rekonstruktion für das Gesichtsfeld nicht mehr relevant ist das spiel in aktion. Gibt es eine super kluge Person, die zufällig eine solche Methode kennt?
Die Leute sind irgendwie verwirrt über das gesamte "Sichtfeld", daher möchte ich hier eine detailliertere Erklärung geben. Das Sichtfeld besteht aus Gruppen von Linien. Sie können leicht überprüfen, ob sich eine Position innerhalb einer dieser Gruppen befindet, indem Sie nur überprüfen, auf welcher Seite der Linie sich Ihre Position befindet. Wenn sich alle Linien in dieser Gruppe, die Sie kennen, auf derselben Seite befinden Es befindet sich in dieser Gruppe und damit im Sichtfeld.
Bei den gesendeten Informationen handelt es sich jedoch nicht um diese Zeile, sondern um eine Transformation der Zeile und der Transformation (2 × 2-Singular einer Matrix). Sie können weiterhin überprüfen, auf welcher Seite der Zeile sich Ihre Position befindet, indem Sie sie zuerst mithilfe der erhaltenen Transformation transformieren und Vergleichen dieses Wertes mit der transformierten Linie. Der Schlüssel hier ist, dass die Transformation singulär ist, was bedeutet, dass es unmöglich ist, eine Inverse zu finden, um zur ursprünglichen Zeile zurückzukehren. Es ist jedoch möglich, die Neigung der Linie zu bestimmen, die die Rekonstruktion der Linie ermöglicht, indem nur überprüft wird, auf welcher Seite der transformierten Linie viele Punkte liegen, bis Sie den Ursprung der Linie viel rechnerisch billiger lokalisiert haben, als wenn Sie es nicht wüssten die Steigung der Linie.
Was ich suche, ist eine Methode zum Bestimmen, ob sich ein Punkt innerhalb eines Bereichs befindet, wobei das Rekonstruieren des Bereichs aus der Methode entweder unmöglich (was ich bezweifle, da Sie es immer brutal erzwingen können) oder sehr rechenintensiv ist.
quelle
Antworten:
Ich denke, selbst wenn Sie einen irreversiblen Algorithmus für ein Sichtfeld hätten, könnten die Menschen immer noch Vorteile daraus ziehen, wenn sie berechnen, ob nahegelegene Punkte zu einer Kreuzung dieses Ortes führen und sich das Sichtfeld eines Gegners schneidet. In einem schlechten Fall (bei einem ausreichend großen Verhältnis von Sichtfeld zu Karte) könnten Sie durch Ausschalten den genauen Punkt Ihres Feindes berechnen.
Ich denke, stattdessen sollten vielleicht alle verbundenen Peers angeben, in welchem Teil der Karte sie sich befinden, um festzustellen, ob es möglich ist, ob sie sich sehen können oder nicht. Teilen Sie die Karte zuerst in 2x2 oder 2x2x2 auf, wenn die 3. Dimension wichtig ist. Dann sagen sich alle, ob sie in 1,0 1,1 0,1 oder 0,0 sind. Befinden sie sich nicht im selben Quadranten, ist ihre Konversation bis zur nächsten Überprüfung beendet. Dies schützt ihren genauen Standort. Wenn sie im selben Quadranten existieren, teilen sie diesen Raum in 4 neue Quadrate auf und fahren fort, bis sie feststellen, dass sie nah genug sind, um voneinander gesehen zu werden.
Natürlich gibt es Probleme mit den Rändern der Quadranten, aber es sollte durch zusätzliche Anfragen an benachbarte Quadranten lösbar sein.
quelle
Nehmen Sie dies nicht als endgültige Antwort, das Thema ist wirklich weit gefasst (ich bin nicht überrascht, wenn jemand Ihre Frage infakt meldet).
Sie können es lösen, indem Sie einige Spieler als Server verwenden. Wenn ein Spieler als Server verwendet wird, kann er nicht am Spiel der Spieler teilnehmen, die diesen Server tatsächlich spielen .
Wenn Ihr Spiel nicht zu anspruchsvoll ist, können Sie auch mehrere Server auf demselben Player-Computer ausführen (dies ist natürlich hilfreich, da aufgrund von NAT-Problemen nicht alle Player als Server ausgeführt werden können, danke IPv6 !!).
Das Hauptproblem dabei ist, dass ein zufälliger Spieler als Server verwendet wird und es daher eine geringe Wahrscheinlichkeit gibt, dass es sich um einen "kompromittierten" Spieler handelt oder dass die Simulation an einen "kompromittierten" Spieler weitergegeben wird, sodass vertrauliche Informationen weitergegeben werden können ( Nun, in Wirklichkeit könnte der Server zu diesem Zeitpunkt beliebige Daten senden und den Gewinn trotzdem erzwingen.
Wenn Sie einen zentralen Server zum Überprüfen von Berechtigungen und Anmeldungen verwenden, können Sie Spiele besser organisieren und Spieler einfach sperren (dies wäre jedoch kein reines P2P-Netzwerk mehr).
Sie können die Welt auch in Slices unterteilen und einen Hash der sichtbaren Slices berechnen. Dies kann jedoch leicht ausgetrickst werden. Mit den am häufigsten verwendeten sichtbaren Slices können Sie schnell eine Tabelle mit Hashes erstellen.
Für mich ist Ihre Frage wie der Versuch, nach einer kryptografischen Funktion zu suchen. Der Test sollte schnell sein, aber die rohe Kraft sollte langsam sein.
Das Einfachste, was mir (auch im Zusammenhang mit meiner Arbeit) einfällt, ist die Verwendung eines Algorithmus zur schnellen Erkennung des Sehvermögens (Augmented Reality-like).
Wenn es Ihnen gelingt, einen schnellen "Schnappschuss" Ihres Standorts zu machen (ähnlich wie bei Slices), dann können Sie ihn nur erkennen, wenn Sie ihn um etwas Sichtbares platzieren. Insbesondere, wenn die Karte zeitgesteuerte Elemente enthält, mit denen sich Erkennungsmuster schnell entfernen lassen.
Selbst wenn solche Algorithmen selbst auf Mobilgeräten ziemlich schnell werden, sind sie meiner Meinung nach nicht schnell genug für einen Ego-Shooter.
Auch wenn Sie sie zu schnell machen, werden Sie gefälschte Positive haben! Und ein Spieler kann trotzdem ein Spiel erstellen, das einige "Common Visuals" ausprobiert, so dass eines der Visuals mit dem Algorithmus zur Merkmalerkennung übereinstimmt.
Ich bin nicht überrascht, dass die einzig mögliche Lösung für Ihr Problem in Quantum Computing möglich ist, und in einigen Jahren veröffentlicht jemand ein Papier, das diese intrinsische Grenze in P2P-Netzwerken bestätigt.
quelle
Wenn Sie sagen, dass Sie vertrauliche Informationen vor Gegnern verbergen, möchten Sie verhindern, dass Personen mit Paketschnüfflern Ihren Datenverkehr abhören und Informationen über Ihr Spiel erhalten?
Wenn ja, gibt es eine einfache Antwort darauf; Die meisten AAA-Spiele (und sicherlich auch Konsolenspiele) verwenden Verschlüsselung. Tatsächlich ist es so häufig, dass in vielen der in Spielen verwendeten Netzwerk-Middlewares bereits eine Paketverschlüsselung integriert ist.
Normalerweise funktioniert es so: Wenn Sie eine Verbindung zu einem anderen Computer herstellen, bevor der Socket aktiv wird, findet ein Schlüsselaustausch statt. Ich weiß, dass es sich bei XBox um einen Diffie-Hellman-Schlüsselaustausch handelte. Ich habe keine Ahnung, ob sie es jetzt noch verwenden. Sobald Sie Ihre Schlüssel haben, werden alle gesendeten Daten mit den Schlüsseln verschlüsselt und beim Empfang unverschlüsselt. Wenn jemand einen Schnüffler benutzt, um Ihre Pakete zu lesen, sieht er wie Kauderwelsch aus und es ist unwahrscheinlich, dass er sie entschlüsseln kann, da er nicht über die Schlüssel verfügt. (Fortgeschrittene Hacker können möglicherweise auf sie zugreifen, indem sie auf den Prozessspeicher des laufenden Spiels zugreifen. Dies ist jedoch selten und unwahrscheinlich.)
Die einzige Ausnahme von der Verschlüsselungsregel sind VoiceChat-Daten. Laut Gesetz in den USA muss der Voice-Chat unmissverständlich gesendet werden, damit die CIA mithören kann, wenn sie dies möchte. Konsolen bieten normalerweise die Möglichkeit, Sprachdaten zu kennzeichnen, damit sie nicht verschlüsselt werden.
quelle