Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

imakemygame

Treue Seele

  • »imakemygame« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

1

31.10.2013, 15:16

Speichern des Spielstandes mit JSON - aber wie sichern gegen "Cheater"?

Hallo,
ich bin langsam an dem Punkt, wo ich mich mit dem Speichern beschäftige. Eigentlich wollte ich das ganze mit einem Plugin/Asset lösen, da ich Unity 3D als Engine verwende. Jedoch habe ich mich dazu entschieden, das Speichern und Laden selbst zu implementieren.

Nachdem ich mich nun mit Json beschäftigt und es ansatzweise kapiert habe, folgt sogleich auch das erste Dilemma:

Da JSON Files ja direkt im Klartext als z.B. txt abgespeichert werden, kann diese ja auch jeder einfach lesen und bearbeiten.

Wie zum Geier kann man damit leben? Soll ich die Datei verschlüsseln? Wie arbeitet man normalerweise mit JSON in diesem Zusammenhang?

Oder habe ich komplett alles falsch verstanden was JSON angeht?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

31.10.2013, 15:24

Du kannst es verschlüsseln, warum nicht. Allerdings sollte sich jeder fragen, wie viel Spaß er überhaupt hat, wenn er einen Spielstand manipuliert. Daher sehe ich das bei Savegames als relativ unkritisch an. Kritisch ist es erst bei Multiplayer oder Highscores.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

imakemygame

Treue Seele

  • »imakemygame« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

3

31.10.2013, 15:34

Naja, den Highscore hast du ja schon erwähnt. Den wollte ich auf jeden Fall einbauen. Außerdem wollte ich gerne noch andere Sachen darin speichern. Unter anderem, ob der Spieler per AppInPurchase bereits gewisse Sachen erworben hat. Dort wäre es umso bedauerlicher, wenn das ganze manipuliert werden kann.

Auch soll jeder Spieler später über ein Auktionshaus Items tauschen können. Das wäre auch ein Super-GAU.

Gut dann schaue ich mir das Verschlüsseln mal an. Danke

4

31.10.2013, 16:04

Du könntest auch mal einen Blick auf BSON (Binary JSON) werfen. Damit wird dein JSON zwar nicht verschlüsselt, aber für den "Otto Normalspieler" ausreichend obfuskiert.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

31.10.2013, 16:04

Wenn Items getauscht werden sollen, dann sollte das Spielgeschehen und/oder Inventar ohnehin online synchronisiert werden. Wenn Highscores online gespeichert werden, können diese zwar nicht direkt manipuliert werden, dafür aber durch die Manipulation eines Spielstands indirekt oder durch "gefälschte Serveranfragen", die eine Highscore übermitteln, die nicht wirklich durch das Spielen erreicht wurde.
Es gab schon diverse Male Themen bezüglich der Sicherheit von Kommunikation (Client <-> Server), der Verschlüsselung usw.
Meiner Meinung nach gibt es nur "Security by Obscurity", da sich alles irgendwie knacken lässt (ggf. mit hohem Zeitaufwand).

Man muss sich nur überlegen, wie viel Zeit man investieren will, um sein System "sicher" zu machen. Würde ich in einem reinen Singleplayer (Multiplayer mit Spielständen wäre bspw. Dungeon Defenders) Spielstände haben wollen, würde ich diese sehr wahrscheinlich auch nur minimal obfuscaten (bestehenden, symmetrischen Verschlüsselungsalgorithmus und beim Lesen/Schreiben mit irgendeinem Schlüssel drüberlaufen lassen), wenn überhaupt. Denn, wie BlueCobold schon meinte: die Spieler, die sowas machen, müssen selbst wissen, ob sie sich dadurch tatsächlich zu mehr Spielspaß verhelfen, solange sie keinem anderen Spieler den Spaß rauben können, besteht aber kein Problem.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

imakemygame

Treue Seele

  • »imakemygame« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

6

31.10.2013, 16:53

Also mal angenommen das Spiel ist so kinderleicht zu knacken, dass es jeder Depp hinbekommt - dann könnte ich mir die AppInPurchases auch sparen. Deshalb ist es schon sehr wichtig für mich das ganze abzusichern. Desweiteren ist zum Beispiel ein Onlinehandel von Items zwar mit einer Server-Client Kommunikation verbunden, nicht jedoch das reine Spiel. Denn für das normale Spiel möchte ich nicht, dass ein Spieler Internet benötigt, um beim Server abzufragen, ob er denn Item XYZ besitzt. Das bedeutet jedoch ein lokales Speichern, was weitestgehend nicht manipulierbar sein sollte.

Mich hätte mal interessiert wie das andere Spiele lösen. Gibt es denn noch gänzlich andere Techniken, die mit JSON nichts zu tun haben - also etwas, dass die Sicherheit gleich mitlöst?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

31.10.2013, 16:54

Mal am Rand: Heißt das nicht InAppPurchase statt AppInPurchase?

Du wirst Online-Handel übrigens nie in den Griff bekommen, wenn Du nicht sicherstellen kannst, dass der Anbieter das Item auch tatsächlich besitzt. Er muss dafür ja nur rausbekommen wie die Requests/Responses an den Server lauten, damit er Items dupen und verkaufen kann. Die einzige Möglichkeit hier für Dich wären vom Server vergebene GUIDs, was natürlich das Offline-Erlangen/Erschaffen von Items komplett ausschließt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

31.10.2013, 17:09

Möchtest du die angebotenen Dinge dann für echt-Geld anbieten? Wenn ja, muss schon eine gewisse Sicherheit da sein. Du könntest das ganze jetzt einfach binär speichern, Irgendwelche Hashwerte mit abspeichern, Bitshifting oder was weiß ich nicht machen, aber das ist alles recht schnell geknackt. Dann bringt irgendwer ein Tool raus mit welchem man die Safegames anpassen kann und spätestens dann kann es wirklich jeder Depp. Ein Beispiel für sowas ist Diablo2. Da gab es genügend Editoren etc um Savegames anzupassen. Ich meine mich zu erinnern dass man da auch recht einfach mit einem Hexeditor ran konnte. Das ganze ging dann nur im Closed-bnet nicht, da hier die Daten auf dem Server gespeichert wurden. Du könntest jetzt einfach deine Savegames verschlüsseln. Hier ist das Problem, dass dein Schlüssel irgendwo im Programm hinterlegt ist. Dieser lässt sich natürlich auch irgendwie raus finden. Je nachdem reicht dafür schon ein einfacher Hexeditor aus, wenn es besser abgesichert ist muss man den Arbeitsspeicher überwachen. Unknackbar wird das ganze jedoch nicht. Geht es um echtes Geld kannst du meiner Meinung nach davon ausgehen, dass es einer der ein wenig Know How hat knackt, ein Tool für das ganze schreibt und es danach jeder knacken kann. Guck mal wie viele Threads im Netzt zu finden sind bei welchen Leute nach irgendwelchen Cheats oder Hacks für einfache Apps fragen. Also wäre mein Tipp, geht es um echtes Geld, halte die Savegames online, geht es nur um ingame Geld und hat mit echter Währung nichts zu tun, verschlüssel die Save-Games von mir aus um wenigstens ein paar Leute abzuhalten und gut ist.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

imakemygame

Treue Seele

  • »imakemygame« ist der Autor dieses Themas

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

9

31.10.2013, 20:25

@Blue: ja du hast recht :D, danke für die Korrektur

@die anderen
Ok nochmal ein paar Überlegungen:
1. Wenn ich nur für Mobile entwickeln würde - entgehe ich damit den Memoryhackern? Ich hab ehrlich gesagt keine Ahnung ob es da so etwas wie CheatEngine gibt.
2. Wenn das ganze auf "Onlinesavegames" hinausläuft, da gibt es doch auch Tricks wie einen Server vorzugaukeln? Ist das dann wesentlich schwerer zu knacken? Und vor allem gibt es doch da riesige Probleme? Ich meine, da reicht es ja nicht kurz online zu sein, wenn man das Spiel startet. Da muss ja dann dauerhaft ein Savegame hochgeladen werden um das ganze zu puffern, falls jemand offline geht oder irgendwie kein Netz hat etc.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

10

31.10.2013, 21:08

Hi, also ein oft gemachtes Missverständnis: Verschlüsselung muss gegen Manipulation überhaupt nicht schützen. Ein Beispiel wäre AES im Counter Mode (http://en.wikipedia.org/wiki/Block_ciphe…unter_.28CTR.29). Da die Blöcke, die mit AES generiert werden auf den Plain Text per XOR aufgebracht werden kann man problemlos ein Bit im Plain Text umwerfen, in dem man es im Cipher Text umwirft. Man muss nur ohne Entschlüsselung Wissen welches Bit man verändern muss.

Was du willst ist den Spielstand signieren und ich denke auch ganz ohne Verschlüsselung. Zumindestens sehe ich kein Problem darin, wenn jemand sieht was im Spielstand drin ist, solanger er ihn nicht verändern kann. Da gibt es dann so Ansätze wie den HMAC (http://de.wikipedia.org/wiki/Keyed-Hash_…entication_Code). Wenn ich mich richtig erinnere war der HMAC sogar sicher, wenn die Hashfunktion sicher ist. Die Hashfunktion ist aber ein großes Problem. Da weiß ich nicht, was momentan aktuell relativ sicher ist.

Das größte Problem beim HMAC wird für dich sein, wo legst du den Schlüssel K ab? Im Plugin selber kannst du vergessen, das wird mehr oder weniger einfach disassembliert/per Debugging herausgefunden/etc. etc.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Werbeanzeige