Preferences vor Manipulation schützen

  • 16 Antworten
  • Letztes Antwortdatum
W

wwwwwwwwwwww

Neues Mitglied
1
Hi, ich will sicherstellen, dass die Preferences die ich mit meiner App speichere nicht verändert werden. Wie mach ich dass am besten?

Bis jetzt sind mir zwei Methoden eingefallen:
1. Die gesamten Preferences verschlüsseln
2. einen Hash erzeugen der mir sagt, ob die Daten manipuliert wurden

Bei beiden kann ein Angreifer meinen Code decompilieren und so herausfinden wie er die Daten ändern muss, damit die App denkt dass alles ok wäre.

Was schlagt ihr vor?
 
ZU 2. wie willst du den hash den speichern, in ner Preference?
Verschlüsseln ist meiner meinung nach gut, am besten den schlüssel schön irgendwo versteckt, dass es schwieriger wird.
 
blackfire185 schrieb:
ZU 2. wie willst du den hash den speichern, in ner Preference?
Ja wo anders geht ja nicht wirklich, in dem Fall müsst ich versuchen einen Hash zu erzeugen, bei dem es schwer ist herauszufinden wie ich ihn erstelle.

blackfire185 schrieb:
Verschlüsseln ist meiner meinung nach gut, am besten den schlüssel schön irgendwo versteckt, dass es schwieriger wird.
Die Frage ist halt wie ich den Schlüssel sicher verstecke.
 
Letztlich kommt man durch dekompilieren an den code und mit root zu denn preferences. Letztlich bleibt also nur die Möglichkeit, das verfahren so gut es geht zu verstecken!

Verstecken unter vielen konstanten, inmitten des codes usw. (So würde ich es machen)

Gesendet von meinem LG-P880 mit der Android-Hilfe.de App
 
Naja.. Konstanten inmitten des Codes bringen aber auch nichts, wenn ich nach dem dekompilierung noch ein Formatierungstool drüber laufen lasse, dass mir alles an die richtige Stelle sortiert.
Dann stehen die auch wieder oben.

Ohne das gerade bis in jedes Detail zuende gedacht zu haben, hast du in deiner App Internetzugriff?
Wenn ja könntest du den Hash extern speichern beispielsweisen auf einem externen Server.
Auf den kann dann niemand zugreifen und den auch nicht verändern.
Dann musst du nur prüfen ob der Hash der Preferences mit dem auf dem Server übereinstimmt.
Dafür kannst du dann ja sogar einen beliebigen "normalen" hash nutzen MD5 oder so.

Wenn jetzt jemand die Preferences ändert holt die App den Hashcode von extern und prüft den gegen die Preferences. Wenn's nicht passt wurde irgendwas manipuliert.

Da hilft dann auch dekompilieren nicht mehr.
 
Aber man hat eben dauerhaft Internetzugang was als störend empfunden werden kann aber keine andere Möglichkeit.

Gesendet von meinem LG-P880 mit der Android-Hilfe.de App
 
Was man machen kann: den Code nicht im Klartext speichern, sondern ihn algorithmisch zu erzeugen. ZB zwei Strings in zwei Klassen (damit es nicht an einer Stelle im Code zu finden ist) ver"xor"en. Klar, kann ein Hacker auch den Code analysieren - aber der kriegt im Zweifelsfall dann auch einen Internetzugriff und den Hashvergleich abgefangen :)

Frage dich vor allem, gegen welchen "Angriff" du deine App schützen musst.
 
Muss meinem Vorredner recht geben die xor Variante ist eigentlich recht gut, aber ich würde 2 mal xor einsetzten. Einmal nur recht leicht versteckt damit hat man eine falsche Pfärte am besten irgend was stumpfes wie "geheim" und dann das Ergebnis noch einmal versteckt mit einem richtigen passwort

Gesendet von meinem LG-P880 mit der Android-Hilfe.de App
 
Wenn die Sicherheit wichtiger als die Usability ist, kannst du auch den User ein passwort für die Verschlüsselung eingeben lassen.

Dann musser zwar beim Entschlüsseln auch wieder eins eingeben.
Aber dafür musst du keine Schlüssel bzw "Passwörter" im Code verstecken.
Was Prinzipiell niemals eine wirklich gute idee ist.

Ansonsten musst du uns mal erzählen wie wichtig das wirklich ist und warum du das möchtest, vielleicht gibt es dafür ja noch ganz andere Möglichkeiten
 
Manchmal will man die Prefs auch vor Manipulationen durch den Cheater..äh..User schützen,
da hilft ein User-PW rein gar nichts :D

Wie schon gesagt: Wie man verschlüsselt, hängt extrem vom Angriffsszenario ab, gegen dass man sich schützen will.
 
Zuletzt bearbeitet:
DieGoldeneMitte schrieb:
Manchmal will man die Prefs auch vor Manipulationen durch den Cheater..äh..User schützen,
da hilft ein User-PW rein gar nichts :D
Genau darum geht es. Dem User soll es so schwer wie möglich gemacht werden zu schummeln. Eine dauerhafte Internetverbindung will ich eigendlich nicht voraussetzen.
 
Ok dann fällt das Passwort weg.
Wobei ich mir die Frage stelle warum du das verhindern willst.
Das macht meiner Meinerung nach nur Sinn, wenn die Highscores oder ähnliches in einer Online bestenliste gespeichert werden.

Dann brauchst du sowieso eine Internetverbindung.
Und dauerhaft musst die Verbindung ja eh nicht sein, du brauchst die nur kurz um die Preferences zu entschlüssen bzw zu prüfen.

Und ich Frage mich gerade ob der User nicht sowieso das Spiel selbst manipulieren beispielsweise mit nem Debugger oder änhlichem.
 
Dann mach das mit den xor Strings. Mach aber nicht mehr, du solltest lieber die Energie in dein Spiel(?) stecken anstatt dich dabei zu verzetteln, Cheater zu bekämpfen, die sich ja eigentlich nur selbst den Spaß nehmen.

Da es nicht so klingt, als dass du globale Toplisten hättest, haben ehrliche Spieler nichts von deiner Arbeit an der falschen Front :D
 
Ich nutze die Online Ranglisten der "Google play Spieldienste" und will da kein falschen Ergebnisse drin haben. Zudem biete ich In-App-Käufe an, die durch Cheaten sinnlos werden.
 
Dann könntest du doch auch den Spieledienst zum speichern der Spielstände nutzen, dafür gibts ja auch eine funktion was sowieso für den user besser ist, da er dann seinen Spielstand einfach auf einem anderen Telefon nutzen kann wenn er das wechselt.

Für den User wäre es doch auch blöd wenn er vielleicht schon In-App was gekauft hat und auf einem neuen Telefon wieder von vorne anfangen muss.
 
amfa schrieb:
Dann könntest du doch auch den Spieledienst zum speichern der Spielstände nutzen, dafür gibts ja auch eine funktion was sowieso für den user besser ist, da er dann seinen Spielstand einfach auf einem anderen Telefon nutzen kann wenn er das wechselt.

Für den User wäre es doch auch blöd wenn er vielleicht schon In-App was gekauft hat und auf einem neuen Telefon wieder von vorne anfangen muss.
Es gibt bei deinem Vorschlag aber ein paar Probleme:
1. Nutzer könnten offline nicht mit ihrem Spielstand weiter spielen
2. Google selbst schreibt, dass man wichtige Daten in der Cloud verschlüsseln soll
3. Durch Cloud Savegames kann es zu Problemen kommen, falls ein Nutzer auf zwei Geräten die App nutzt. Beispiel:

Spieler startet Spiel auf Gerät 1.
Gerät 1 holt sich Savegame aus der Cloud. (Punkte: 500, Upgrades1: nicht gekauft, Upgrades2: nicht gekauft ....)
Spieler kauft Upgrade1 für 400 Punkte. (Punkte: 100, Upgrades1: gekauft, Upgrades2: nicht gekauft ....)
Spieler beendet Spiel ohne Internetverbindung.

Spieler startet Spiel auf Gerät 2.
Gerät 2 holt sich Savegame aus der Cloud. (Punkte: 500, Upgrades1: nicht gekauft, Upgrades2: nicht gekauft ....)
Spieler kauft Upgrade2 für 400 Punkte. (Punkte: 100, Upgrades1: nicht gekauft, Upgrades2: gekauft ....)
Spieler beendet Spiel mit Internetverbindung.

Spieler startet Spiel auf Gerät 1 mit Internetverbindung.
Savegame auf Gerät 1: (Punkte: 100, Upgrades1: gekauft, Upgrades2: nicht gekauft ....)
Savegame in Cloud: (Punkte: 100, Upgrades1: nicht gekauft, Upgrades2: gekauft ....)

Das gibts ein Problem, dass die App selbst nicht lösen kann. Ich könnte denn Nutzer entscheiden lassen, ob er Speicherstand 1, oder 2 nutzen will, aber dann kann es sein, dass er Punkte die er verdient oder gekauft hat verliert. Ich könnt auch genau erklären, was passiert ist und ihn z.B. in dem oben genannten Beispiel fragen ob er Upgrade1 oder Upgrade2 behalten will. Das Problem dabei ist aber, dass der Konflikt weit größer werden kann als oben und ich die Erfahrung gemacht habe, dass man bei Smartphonespielen alles ziemlich einfach halten sollte, da sonnst einige Nutzer überfordert sind.
 
sind die updates nun nur ingame gekauft oder als in-app "echter" kauf?
Weil die werden von Google soweit ich weiß ja auch synchronisiert.

Aber du hast Recht auf 2 Geräten ist das etwas komplizierter wenn bei einem keine Internet verbindung besteht. Aber das Problem hast du auch wenn er auf 2 Geräten mit offline Spielständen spielt. Meiner Meinung sogar noch mehr, weil wenn er auf einem Gerät was kauft (gegen echtes Geld) hat er es nicht auf dem 2. oder braucht es da nicht wenn er da anders spielt.
optimal wäre wenn er auf jedem gerät einfach weiterspielen kann.

Ich hab damit selbst auch noch nicht gearbeitet, aber hier kommt wieder die entscheidung Sicherheit vs Usability Entweder du machst es sicher in dem du eine Internetverbindung vorrausetzt zumindest beim starten der app oder du möchtest das der user relativ frei tun kann was er will auf kosten der Sicherheit.

Ich hab dazu bisher auch nur die Session auf der Google IO gesehen. Da klang das (natürlich) alles ganz einfach und gut.

https://www.youtube.com/playlist?list=PLOU2XLYxmsIJOOTFfYzhR2d-rcSbBbEE_

Guck dir die mal an (falls du sie noch nicht kennst)
Vielleicht hast du da ja die zündene Idee irgendwo :)

Aber einfach sind die Entscheidungen natürlich alle nicht.

EDIT:
Auch wenn du die Services ja schon nutzt find ich das Videos hier ganz gut
https://www.youtube.com/watch?v=mYSWGNMrGi0
 
Zurück
Oben Unten