3 Stimmen

Wie kann ich eine Nachricht in einem verteilten Programm, von dem ich weiß, dass es zurückentwickelt werden kann, digital signieren und ihr vertrauen?

Das Problem in Kürze: Ich entwickle eine Anwendung (z.B. ein Spiel), die in binärer Form verteilt wird. Das Spiel ruft zu Hause an und sendet den Highscore des Benutzers als Nachricht an einen Online-Spieleserver.

Ich möchte die Nachricht digital verschlüsseln und signieren, damit ich sicher sein kann, dass sie nicht manipuliert wurde.

Die Kryptographie mit öffentlichem Schlüssel beruht darauf, dass beide Gesprächspartner ein Geheimnis haben, aber ich kann mich nicht darauf verlassen, dass meine Software nicht zurückentwickelt und der private Schlüssel entdeckt wird.

Gibt es einen sicheren oder ausreichend sicheren Weg, eine Nachricht aus meiner verteilten Binäranwendung digital zu signieren (der Verschlüsselungsteil ist in diesem Fall nicht notwendig), wenn ich weiß, dass sie zurückentwickelt werden kann?

3voto

jerryjvl Punkte 18807

Kurz gesagt: Nein, es gibt keine narrensichere Lösung dafür. Das Problem ist, dass die Anwendung, die Ihnen die Highscores sendet, unter der Kontrolle der Person läuft, der Sie bei dieser Transaktion nicht "vertrauen". Wenn sie den Code zurückentwickeln können, können sie den Inhalt jeder Nachricht ändern, bevor sie signiert wird.

1voto

sharptooth Punkte 162790

Sobald der Code (egal ob Quellcode, Zwischensprache oder Maschinencode) Ihres Programms in den Händen einer anderen Person liegt, kann diese tun, was sie will, und Sie können nicht sicher sein, dass sie ihn nicht missbraucht. Um den Missbrauch zu erschweren, können Sie alle möglichen Wege nutzen, um das Reverse Engineering zu erschweren, aber das ist keine Garantie gegen Missbrauch.

1voto

drdaeman Punkte 10565

Das geht einfach nicht. Es gibt keine wirkliche Lösung für dieses Problem, nur immer mehr Verschleierungen und Manipulationsprüfungen (IMHO ist das reine Zeitverschwendung). Hypothetisch gesehen kann jedes Programm zurückentwickelt, emuliert und manipuliert werden. Dagegen kann man nichts tun.

Die einzige Möglichkeit, die ich mir vorstellen kann, um die Spielergebnisse vor Manipulationen zu schützen, besteht darin, eine Art Spielaufzeichnung zu senden, die abgespielt und deren Ergebnis überprüft werden kann. Dies schützt Ihr Spiel jedoch nicht davor, dass es von einem Roboter gespielt wird. Und das gilt nur, wenn die Welt Ihres Spiels vollständig deterministisch ist.

0voto

Matthew Flaschen Punkte 266507

Nein. Damit die Client-Software sie digital signieren kann, muss sie den privaten Schlüssel besitzen. Und wenn die Software den privaten Schlüssel hat, kann der Benutzer ihn entdecken (und möglicherweise missbrauchen).

0voto

Ivan Prodanov Punkte 33160

Verwenden Sie einen bekannten Algorithmus, in meinen Anwendungen verwende ich Blowfish, aber das macht es nicht sicher.

Der Server sendet ein Paket, das Werte und einen verschlüsselten (der Client weiß, wie man ihn entschlüsselt) Blowfish-Schlüssel enthält. Der vom Server empfangene Blowfish-Schlüssel ist bei jeder Verbindung zufällig.

Der nächste Teil ist die Verschlüsselung einer berechneten ganzen Zahl auf der Grundlage der bei der Verbindung erhaltenen Werte (die zufällig sind) und dann die Verschlüsselung mit Blowfish.

Wenn der Server dieses Paket empfängt, sendet er das gleiche Paket, das mit dem neuen (endgültigen) Blowfish-Schlüssel verschlüsselt ist. Der Client muss diesen Schlüssel herausfinden, indem er ihn mit dem alten Blowfish-Schlüssel entschlüsselt und dann Berechnungen mit den Werten aus dem ersten Paket durchführt.

Dies ist der Handshake-Prozess, nach dessen Beendigung Sie Ihren Spielstand nach demselben Prinzip senden können (oder ihn vielleicht in den Handshake einbauen und ein gefälschtes Paket senden, nachdem der Handshake beendet ist, um Umkehrer zu täuschen).

Es ist zu viel zu tun, aber es ist auch zu viel für einen Umkehrer.

Eine andere Möglichkeit, Ihr Problem zu lösen, ist das Hinzufügen eines Zwei-Byte-Sicherheitswertes (CRC) auf der Grundlage des Paketinhalts mit Ihrer eigenen Berechnung. der Server überprüft diesen Wert und wenn er ungültig ist, wird die Verbindung unterbrochen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X