2 Stimmen

Betrug bei gespeicherten Daten auf dem iPhone verhindern

Wir können sqlite, nsuserdefaults oder das normale Dateisystem zum Speichern von Spieldaten auf dem iPhone verwenden. Diese Daten werden normalerweise im Documents-Verzeichnis gespeichert, aber Dateien unter dem Documents-Verzeichnis können ohne JailBreak leicht verändert werden. (Tatsächlich wurden einige gemogelte Spielstände bereits auf dem Server gepostet)

Es gibt einige Ideen, die ich in Betracht gezogen habe, um Betrug durch Änderung der Speicherdaten zu verhindern.


Datei verschlüsseln

Verschlüsseln Sie einfach die Datei und entschlüsseln Sie sie beim Lesen. Es scheint sicher, aber die Leistung wird geopfert werden, wenn das Spiel gamedata häufig aktualisieren müssen.

SQLite-Verschlüsselung

Es gibt einige verschlüsselte Erweiterungsbibliotheken für Sqlite. Das Problem sind die Kosten und die Lizenzen.

Prüfer / Prüfsumme

Speichern Sie die Prüfsumme der gespeicherten Daten und erkennen Sie Betrug anhand dieser Prüfsumme. Es kann zu einem FALSCH POSITIVEN Ergebnis führen, wenn das Speichern der Prüfsumme aus irgendeinem Grund fehlgeschlagen ist.

Schlüsselanhänger

Daten im Schlüsselbund speichern. Aber wir können nicht Sqlite verwenden. Und ist es in Ordnung, große Daten im Schlüsselbund zu speichern?


Jede Idee hat einen Makel. Können Sie mir eine Idee geben?

3voto

gwood Punkte 176

Eine Schwachstelle des Konzepts scheint darin zu bestehen, dass Sie sich auf die lokalen Daten verlassen. Ich würde stattdessen empfehlen, die lokalen Daten als unsichere Benutzerdaten zu behandeln. Auf diese Weise kann ein Benutzer sie nach Belieben manipulieren, aber Sie werden sie niemals zur Veröffentlichung an Ihren Server senden.

Wenn ein Benutzer ein Spiel abschließt, soll das Spiel den Spielstand sofort an den Server senden. Wenn Sie möchten, kann Ihr Server eine signierte (gehashte) Kopie zurücksenden, die Sie in einem beliebigen Format speichern können. In Ihrem Spiel könnten Sie ein kleines Abzeichen "Verifizierter Spielstand" neben den Spielständen einfügen, die erzielt wurden, während sie online waren. Wenn der verifizierte Spielstand manipuliert wird, funktioniert der Hash nicht, und der Spieler verliert (zumindest lokal) seinen Spielstand.

Wenn Ihr Nutzer offline ist, kann sein Ergebnis nicht überprüft werden. Sie können ihn trotzdem lokal mit allen signierten Ergebnissen speichern, müssen sich aber keine Gedanken über die Synchronisierung von fehlerhaften Daten machen. Senden Sie einfach niemals Daten an Ihren Server, die aus dem lokalen Dateisystem gelesen wurden.

Aus Sicht der Benutzerfreundlichkeit ist dies vielleicht nicht ideal, aber Sie können es einrahmen, indem Sie Ihren Benutzern sagen: "Wenn Sie mit dem Internet verbunden sind, wenn Sie eine hohe Punktzahl erreichen, wird Ihre Punktzahl überprüft und in der globalen Topliste veröffentlicht" oder etwas in dieser Art. Ich bin sicher, dass Sie eine Lösung finden werden.

2voto

Feloneous Cat Punkte 895

Es gibt einige sehr leichte, wenn auch nahezu unknackbare Chiffren für die Verschlüsselung, wenn Sie diesen Weg gehen wollen. Ich habe in der Vergangenheit eine Variante der Substitutions-Chiffre verwendet, bei der ich die Werte mit Zufallszahlen XOR-verknüpft habe. Diese Chiffren können nahezu unknackbar sein (vor allem, wenn man sie jedes Mal ändert - es gibt nichts Frustrierenderes für einen Hacker, als jedes Mal andere Ergebnisse zu erhalten :)

Je kleiner die Daten sind, desto leichter ist es, sie zu hacken. Es gibt nichts Frustrierenderes, als in ein Netzwerk zu schnüffeln und festzustellen, dass 10 Ziffern in einem 4096-stelligen Block von Zufallszahlen verschlüsselt sind.

Je nach der Größe Ihrer Daten könnten Sie verschiedene Teile mit unterschiedlichen Chiffren verschlüsseln - das wäre zwar leicht zu ver- und entschlüsseln, aber mühsam zu hacken.

-1voto

jaminguy Punkte 25730

Sie können die Daten in einem Unterordner von NSLibraryDirectory anstelle von NSDocumentsDirectory speichern. Benutzer können das NSLibraryDirectory nicht über iTunes sehen oder bearbeiten.

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