Eine Anwendung so gut wie möglich beschützen

InDerNot

Mitglied
Guten Tag,

nehmen wir an, man schreibe eine Anwendung (z.B. ein Spiel) und speichert die Daten auf einer externen Datenbank. Nun möchte man, wenn man das Spiel verloren hat, eine Top 10 Liste ausgeben lassen, die in der Datenbank drin steht, welche mit Passwort gesichert ist. Nun meine Frage, wie setzt man das am besten und am sichersten um?

Meine Ideen:
Man sollte auf keinen Fall das Passwort in der Anwendung stehen haben. Deswegen bevorzuge ich einen Server, welcher für eine Verifikation sorgt, dass man dann die Daten bekommt. Der Server greift dann auf die Datenbank zu.
Aber.. wie führe ich die Verifikation durch?
Ich dachte anfangs, die Hash Daten der Application zu nehmen und dies als Verifikation zu benutzen, aber dann sind wir beim üblichen Java Problem:
Da man Anwendungen einfach decompilen kann, kann man dies umgehen und trotzdem die Daten bekommen.
Führt man eine Obfuscation aus, dann benutzt man Reverse Engineering und kann jederzeit trotzdem auf den Inhalt des Servers zugreifen.

Es ist halb so schlimm, wenn man die Daten, die man eh sehen soll, sieht..
Aber: Wenn man in der Anwendung z.B. Punkte sammelt, dann schickt man die Punkte (Req -> Client zu Server) an den Server, damit er dies in die Datenbank reintut.
Wie umgehe ich das? Reverse Engineering ist eine schwere Sache. Ich weiß, dass man nicht 100% sich schützen kann, aber was wäre die beste Möglichkeit dagegen vorzugehen?

Ich meine.. in Handy Spielen kann man sich das auch nicht zwingend manipulieren, welche Online gehen, egal wie oft man versucht. Sollte man wirklich auf eine gute Obfuscation, ByteCode Manipulator verlassen?

Selbst wenn man eine Mischung aus Hash, random-Text und FileSize nimmt, kann man das immer noch sehen in Java und dementsprechend manipulieren.
Was mich aber am meisten stört ist, dass man sich so oft Punkte geben kann, wie es auch nur geht. Siehe das Beispiel von oben.

Meine Frage ist nun.. wie geht ihr da voran? Natürlich erwarte ich keine 100%tige Lösung. Es ist Reverse Engineering, man kann nichts vor Reverse Engineering schützen. Aber trotzdem wäre es nicht schlecht, es sicher wie möglich zu gestalten.

Würde mich um Antworten freuen.

Vielen Dank!

MfG
 

Thallius

Top Contributor
Einfach den User vorher am Server registrieren lassen und beim Start des Spiels muss der User sich halt jedesmal mit seinem Passwort anmelden. Das ist 100% sicher
 

httpdigest

Top Contributor
Alleine schon die Tatsache, dass sich der CLIENT Punkte geben kann, indem er das dem Server einfach sagt, ist schon unglaublich verkorkstes Design und ruft ja geradezu zum Cheaten/Ausnutzen auf.
Spiele, die einigermaßen sicher sind, implementieren immer eine serverseitige Simulation des Spiels und Validierung der Usereingaben. Das heißt, der Server weiß als einziger, wann ein Spieler wieviele Punkte bekommt und ein Client kann den Server selbstverständlich nie einfach anweisen, ihm eine bestimmte Punktezahl zu geben oder sonstirgendwie den Zustand des Spieles zu beeinflussen, nur weil er (der Client) das sagt.
Eine der allerallergrundlegendsten Regeln beim Entwickeln einer sicheren Client/Server-Architektur ist: Traue dem Client NIEMALS! Gehe IMMER davon aus, dass der Client z.B. einen Netzwerksniffer verwendet, um einmal mit dem echten Client seinen Punktestand (z.B. auch mit einem korrekten Passwort) zu setzen und dann netzwerkbasierte Replay-Attacken mit erhöhten Punkteständen sendet. Hierzu muss man noch nichtmal deinen Java-Code decompilieren und verstehen.
Am sichersten ist es, wenn der Client nur Usereingaben (User betätigt Button X, Y oder Z oder User klick Maustaste 1, 2 oder 3) an den Server sendet und dieser die gesamte Simulation und Kontrolle über das Geschehen hat. Natürlich wird ein vernünftig implementierter Client hier Latenzüberbrückungsstrategien (Dead Reckoning bzw. Event-Extrapolation) anwenden, um dem Spieler ein flüssiges Spielerlebnis zu gewährleisten.
 

InDerNot

Mitglied
Einfach den User vorher am Server registrieren lassen und beim Start des Spiels muss der User sich halt jedesmal mit seinem Passwort anmelden. Das ist 100% sicher
Das würde nicht viel bringen, wenn serverseitig nicht viel kommt. Man kann einfach einen Debugger verwenden und die Passwortabfrage überspringen. Wäre auch nicht die optimale Lösung.

Am sichersten ist es, wenn der Client nur Usereingaben (User betätigt Button X, Y oder Z oder User klick Maustaste 1, 2 oder 3) an den Server sendet und dieser die gesamte Simulation und Kontrolle über das Geschehen hat. Natürlich wird ein vernünftig implementierter Client hier Latenzüberbrückungsstrategien (Dead Reckoning bzw. Event-Extrapolation) anwenden, um dem Spieler ein flüssiges Spielerlebnis zu gewährleisten.
Daran hatte ich auch gedacht. Aber dann kommt die Frage: Was passiert, wenn der Spieler den "Button" spammt oder den Button überspringt? Wie muss das serverseitig gemacht werden? Außerdem.. wenn man in einem Spiel sich bewegen kann, kann man ja unmöglich die einzelnen Bewegungen vom Server verwalten lassen. Soweit ich weiß, machen das nicht mal so viele Spiele. Die Bewegung vom Client serverseitig zu machen, sodass bei der Modifizierung des Clients der Server dann den Spieler darauf hinweist, dass seine Bewegungen falsch sind, verbraucht das nicht viel Leistung? Was ist, wenn der Spieler Latenz Probleme hat? > 100ms und man müsste Toleranzen einbauen. Hast du ja schon drauf angesprochen.

Man könnte Limitierungen zu den Buttons einbauen, aber man könnte dann in anderen Zeitpunkten andere Buttons betätigen, die den Anwender zum Vorteil bringen können. Serverseitig dies abzufragen ist gar nicht mal so leicht, da man immer die States überprüfen muss, wie die Lage ist uvm.

Hätte nie gedacht, dass das serverseitige Programmieren so eine harte Nummer ist. Ist auch der Grund, warum Spiele Entwickler für ihre Spiele ein Hackshield verwenden, da vieles vom Client ist.

Eine entscheidende Frage habe ich:
Wie überprüft man, ob die Anwendung modifiziert ist oder nicht? Man könne ja die Hash vom File nehmen, aber dies kann man ja modifizieren. Was wäre die optimale Verifikation?
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Eine entscheidende Frage habe ich:
Wie überprüft man, ob die Anwendung modifiziert ist oder nicht?
Abgesehen davon, dass ich mir ziemlich sicher bin, dass es kein sicheres Verfahren dafür gibt (in irgendeiner Form ist die Anwendung beteiligt), ist das m. E. auch die falsche Frage.

Es geht nicht darum, die Integrität der Client-Anwendung, sondern in erster Linie die Identität des Anwenders festzustellen. Hierfür bietet Mehrfaktor-Authentifizierung ein vergleichsweise hohes Sicherheitsniveau. Auch gegen Replay-Attacken gibt es geeignete Maßnahmen (z. B. Einmal-Passwörter).

Das alles bitte vor dem Hintergrund, dass ich kein Sicherheitsexperte bin :)
 

httpdigest

Top Contributor
Die Authentizität des Nutzers zu beweisen, bringt dir nur etwas, wenn es eben nicht gerade ein authentisierter Benutzer ist, der das System hacken will und sich einen höheren Punktestand zuweisen möchte.
Du möchtest sicherstellen, dass der Client im Auftrag des Users eben keine unplausiblen/inkonsistenten/unerlaubten Kommandos zum Server sendet. Und das ist nur möglich, wenn es sich bei solchen Kommandos eben nicht um absolute Befehle wie etwa "Gib mir 100000 credits" handelt, sondern um Aktionen, die der Server auch validieren bzw. auf Plausibilität prüfen kann.
Ich weiß ja nicht, um welches Spiel oder welches Genre es bei dir geht, aber so ziemlich jeder AAA First-Person-Shooter macht genau das: Er sendet nur die Tastatur/Maus/Controller-Eingaben an den Server und der Server simuliert für alle aktiven Spieler das Spielgeschehen samt Physik. Natürlich simuliert der Client das Spiel auf seiner Seite auch nochmal, um eben Latenzen zu verstecken und es werden Kompromisse eingegangen, basierend auf dem Gameplay. Für Overwatch schau dir z.B. mal das hier an:
 

httpdigest

Top Contributor
Was passiert, wenn der Spieler den "Button" spammt oder den Button überspringt? Wie muss das serverseitig gemacht werden?
Du musst das Spiel so designen, dass es entweder irrelevant ist, ob ein Spieler einen Button "spammt": Z.B. ist es in einem First-Person-Shooter ja egal, wenn ein Spieler zwanzigmal pro Sekunde "Vorwärts" drückt. Im Zweifel ist ihm das sogar zum Nachteil verglichen mit einem Spieler, der eben Vorwärts die ganze Zeit gedrückt hält. Wenn pro Tastendruck tatsächlich eine wichtige Aktion ausgelöst wird, dann gilt wieder: Server muss auf Plausibilität prüfen und du brauchst dann wohl eine Art cooldown-Zeit für den Tastendruck, der vom Server enforciert wird.
Außerdem.. wenn man in einem Spiel sich bewegen kann, kann man ja unmöglich die einzelnen Bewegungen vom Server verwalten lassen. Soweit ich weiß, machen das nicht mal so viele Spiele. Die Bewegung vom Client serverseitig zu machen, sodass bei der Modifizierung des Clients der Server dann den Spieler darauf hinweist, dass seine Bewegungen falsch sind, verbraucht das nicht viel Leistung?
Und genau das tun eigentlich alle Spiele. (siehe oben) Natürlich verbraucht das "Leistung". Musst dein Spiel dann halt effizient implementieren.
Was ist, wenn der Spieler Latenz Probleme hat? > 100ms und man müsste Toleranzen einbauen. Hast du ja schon drauf angesprochen.
Genau, das ist ein großes Problem für viele Spiele. Insbesondere z.B. PLAYERUNKNOWN'S Battlegrounds, wo es für den Client sogar von Vorteil ist, einen hohen Ping zu haben (wird auch im Overwatch-Video angesprochen).
Man könnte Limitierungen zu den Buttons einbauen, aber man könnte dann in anderen Zeitpunkten andere Buttons betätigen, die den Anwender zum Vorteil bringen können. Serverseitig dies abzufragen ist gar nicht mal so leicht, da man immer die States überprüfen muss, wie die Lage ist uvm.
Natürlich. Und genau das musst du tun.
Wie überprüft man, ob die Anwendung modifiziert ist oder nicht? Man könne ja die Hash vom File nehmen, aber dies kann man ja modifizieren. Was wäre die optimale Verifikation?
Gar nicht. Das einzige, was der Server sieht, ist ja, was der Client ihm über das Netzwerk sendet. Versuche dir also vorzustellen: Es gibt gar keinen Client bzw. du weißt nicht, wie dieser aussieht. Du siehst nur die Informationen, die der Client dem Server sendet. Alles kann abgegriffen werden, alles kann geforged/fabriziert werden. Es bringt z.B. auch nichts, die Informationen mit einem Schlüssel zu verschlüsseln. Mit asynchroner Verschlüsselung könnte man diese Informationen zwar nicht wieder entschlüsseln (das kann dann nur der Server), aber man kann sich dann wiederum den Quellcode angucken und herausfinden, wie denn die noch unverschlüsselten Informationen generiert werden und diese dann mit dem notwendigerweise bekannten Schlüssel verschlüsseln. Ein großer Faktor für die Sicherheit deines Spiels wird also notwendigerweise "Security through Obscurity" werden.
 

mihe7

Top Contributor
Die Authentizität des Nutzers zu beweisen, bringt dir nur etwas, wenn es eben nicht gerade ein authentisierter Benutzer ist, der das System hacken will und sich einen höheren Punktestand zuweisen möchte.
Du hast natürlich vollkommen Recht. In meinem Umfeld habe ich genau mit dem von Dir geschilderten Fall zu tun :)

Sein Beispiel wäre dagegen in etwa so, als würde sich der Server bei einer Bestellung auf den vom Client übermittelten Preis verlassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S "Katalog"-Anwendung in Java eine gute Idee? Allgemeine Java-Themen 12
S Wie eine verteilte Anwendung in die Cloud? Allgemeine Java-Themen 4
R Geht das? JRE 1.4 global, 1.6.20 nur für eine Anwendung? Allgemeine Java-Themen 9
S Wie eine Anwendung als neuer Prozess starten? Allgemeine Java-Themen 8
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
R bei eclipse von java in eine andere programmiersprache wechseln? Allgemeine Java-Themen 2
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
S wie rufe ich mit .jar datei eine .bat auf? Allgemeine Java-Themen 15
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
E Methoden Hat jemand eine gute Lösung? Allgemeine Java-Themen 5
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
Exdroid BlueJ Wie bekomme ich die Ausgabe in eine TXT Datei? Allgemeine Java-Themen 2
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
Tausendsassa Interface Eine Gui von einer anderen schließen lassen Allgemeine Java-Themen 3
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
V Gibt es eine Möglichkeit die Internet auslastung mit Java auszulesen Allgemeine Java-Themen 11
L Drop Emails von Outlook in eine JList Allgemeine Java-Themen 5
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben