# Anmeldedaten im Programm "verstecken"



## BRoll (24. Jul 2012)

Also ich sitz grad vor einem Problem dass ich mir logisch schon garnicht
vorstellen kann wie es funktionieren soll.

Also wenn ich mit einem Java Programm auf eine Datenbank zugreife,
zb. für online Highscores oder sowas, dann benötige ich dazu ja
die Anmeldedaten (benutzer/passwort usw).

Das steht ja dann aber im Quellcode drin:


```
try{
	    	   Class.forName ("com.mysql.jdbc.Driver").newInstance ();
             Connection  connection = DriverManager.getConnection (dbUrl, userName, password);
              } 
              catch (Exception e){
               System.out.println(e );
               System.err.println ("Cannot connect to database server");
              }
```

Wenn ich das jetzt als Jar exportiere, und jemand gebe, kann dieser ja theoretisch
mit einem decompiler den quellcode auslesen und damit an die anmeldedaten kommen.

Wie kann man sein Programm (bzw. diese heikle Stelle) davor schützen?
Ich hab keine Ahnung wie man das machen könnte,
weil nur einen Benutzer auf der Datenbank mit nur Leseberechtigung bringt ja nichts,
wenn das Spiel auch Highscores schreiben können soll.

Ich hab schon überlegt ob man da mit PHP eine Brücke bauen soll,
aber damit hab ich schlechte Erfahrungen auf meiner Website gemacht
(manche Highscores wurden einfach weggelassen).

Gibts da einen einfacheren Weg oder ist das zu aufwendig/kompliziert?

mfg BRoll


----------



## Gast2 (24. Jul 2012)

> Wie kann man sein Programm (bzw. diese heikle Stelle) davor schützen?


Gar nicht. Zugangsdaten gehören nicht in den Clientcode. Sobald der Client direkten Zugriff auf die Datenbank hat kann man da schindluder mit treiben.



> Ich hab schon überlegt ob man da mit PHP eine Brücke bauen soll


Das wäre eine Möglichkeit. Das verhindert schonmal dass der Client direktzugriff hat. Dieser Webservice muss aber nicht zwangsläufig in PHP geschrieben sein.


----------



## BRoll (24. Jul 2012)

EikeB hat gesagt.:


> Gar nicht. Zugangsdaten gehören nicht in den Clientcode. Sobald der Client direkten Zugriff auf die Datenbank hat kann man da schindluder mit treiben.



Ja aber wie soll sich dann der Client mit der Datenbank verbinden ohne die Infos?

Mit ner Brücke kann man ja diese Infos verlagern, wo sie sicher sind (zb auf dem Server).

Ich werds mal mit PHP versuchen, was gibt es denn da noch für Alternativen?


----------



## Gast2 (24. Jul 2012)

> Ja aber wie soll sich dann der Client mit der Datenbank verbinden ohne die Infos?


Gar nicht. Der Client schickt seinen Highscore an den Server/Webservice, der trägt den Highscore dann in die Datenbank ein.


----------



## nillehammer (24. Jul 2012)

EikeB hat gesagt.:
			
		

> Gar nicht. Der Client schickt seinen Highscore an den Server/Webservice, der trägt den Highscore dann in die Datenbank ein.


Hat man damit wirklich was gewonnen? Statt einen direkten INSERT auf die Datenbank abzusetzen, könnte doch sicher auch der entsprechende HTTP-Post gefaked werden, um sich einen höheren HighScore zu erschleichen.


----------



## Gast2 (24. Jul 2012)

Das man damit nicht gefälschte Highscores verhindern kann ist klar. Aber man verhindert sowas:

```
SELECT username, password FROM admin_users;
```
Durch den Webservice stellt man sicher dass ausschließlich Highscores eingetragen werden oder Highscores abgefragt werden.

Um wirklich sicherzustellen dass Highscores nicht gefälscht werden, muss man schon fast soweit gehen und die gesamte Spiellogik auf dem Server laufen lassen, nur dann kann man sicher sein dass der User auch wirklich das erreicht hat was der Highscore aussagt.


----------



## nillehammer (24. Jul 2012)

EikeB hat gesagt.:
			
		

> Um wirklich sicherzustellen dass Highscores nicht gefälscht werden, muss man schon fast soweit gehen und die gesamte Spiellogik auf dem Server laufen lassen, nur dann kann man sicher sein dass der User auch wirklich das erreicht hat was der Highscore aussagt.


Danke, das wollte ich lesen . Ich glaube nämlich, dass das das verklausulierte Grundproblem bei der Frage von BRoll ist.


----------



## BRoll (24. Jul 2012)

nillehammer hat gesagt.:


> Danke, das wollte ich lesen . Ich glaube nämlich, dass das das verklausulierte Grundproblem bei der Frage von BRoll ist.



Jein nicht ganz, soweit konnte ich mir das schon selber zusammenreimen,
bloß umso mehr auf dem server gemacht wird, umso höher die Belastung
bei vielen Spielern.

Das schummeln wird man wohl nie richtig verhindern können, weil irgendwo
muss sich ja die Katze in den Schwanz beissen.

Ich programmier jetzt mal eine Brücke mit PHP, und schau wie gut das funktioniert.


----------



## freez (25. Jul 2012)

BRoll hat gesagt.:


> Ich hab schon überlegt ob man da mit PHP eine Brücke bauen soll,
> aber damit hab ich schlechte Erfahrungen auf meiner Website gemacht



Je nachdem wie wichtig diese Highscores sind würde ich über eine Authentisierung nachdenken. Den Usern gibst du persönliche Zugangsdaten und die Übertragung an deinen Webservice macht du natürlich per SSL. Somit kannst du dir sicher sein, dass die Highscores vom richtigen User eingetragen sind, und ein auslesen der Post / Get Parameter per Sniffer ist dann auch nicht möglich.

Lohnt sich das betrügen an der Stelle nicht, weil ich z.B. nichts gewinne wenn ich besonders gut bin, dann würde ich mir das schenken.


----------



## Empire Phoenix (25. Jul 2012)

Nen weiterer schritt wäre das man komplette replays mit der highscore hochläd, und andere spieler sich diese angucken können.
Ist je nach spiel nen nettes feature für neulinge um tricks zu lernen und man hat eine realtiv gute sicherheit weil die besten 10 scores aller wahrschenlichkeit nach sehr oft verifiziert werden.


----------



## Templarthelast (25. Jul 2012)

Mann kann ja zusätzlich zum eigentlich HighScore ein Hashwert inklusive Prüfziffer übergeben, was verhindern sollte, dass sich einfach jeder einen höheren Highscore erschleicht.


----------



## BRoll (25. Jul 2012)

Templarthelast hat gesagt.:


> Mann kann ja zusätzlich zum eigentlich HighScore ein Hashwert inklusive Prüfziffer übergeben, was verhindern sollte, dass sich einfach jeder einen höheren Highscore erschleicht.



Aber den Prüfwert könnte man dann auch auslesen bzw. die Stelle im Programm
suchen wo der erstellt wird, bzw. da wo er eingelesen wird.???:L

Das mit den Replays ist mir zu schwierig, erstmal müsste ich wissen wie man ein video
in java macht und dieses dann auch in der datenbank aufbewahren. Mit nem Screenshot
wäre es noch denkbar und gut machbar für mich.

Ich glaub an das Gute in den Menschen, dass niemand schummeln wird


----------



## Templarthelast (25. Jul 2012)

BRoll hat gesagt.:


> Aber den Prüfwert könnte man dann auch auslesen bzw. die Stelle im Programm
> suchen wo der erstellt wird, bzw. da wo er eingelesen wird.???:L
> 
> Das mit den Replays ist mir zu schwierig, erstmal müsste ich wissen wie man ein video
> ...



replay != video.

In einem Replay speicherst du die Spielabläufe wie z.B. Bewegung und Aktionen der Spieler- und NPCfiguren. In einem Video dagegen speicherst du das Bildschirmbild. 

Mann kann theoretisch alles mit dem Quellcode auslesen und Manipulieren. Deine einzige Möglichkeit dies zu unterbinden wäre die Spielmechanik auf einem Server laufen zu lassen und nur vorbereiteten Input des Spielers entgegenzunehmen bzw. das momentane Bild zurückzugeben. Bei dieser ganzen Diskussion stellt ich allerdings die Frage nach Notwendigkeit. 

Brauchst du für dein Spiel ,das (ohne dein Spiel schlecht machen zu wollen) möglicherweise nur 100 Leute je spielen werden, Mechaniken, die jeglichen noch so komplexen Eingriff in das HighScoresystem unterbinden?


----------



## Guest2 (25. Jul 2012)

Moin,

das Replay müsste nicht zwangsläufig als Video gespeichert werden, sondern als eine Art Savegame mit dem kompletten Spielablauf (Zeiten, Tastendrücke, Ereignisse). Wenn Du den Server dann auch in Java aufsetzt, kannst Du dieselben Klassen wie im Client nutzen (Spiellogik), um auf dem Server das Replay zu verifizieren.

Aber natürlich könnte dann immer noch jemand einen Savegame Generator schreiben... 

Viele Grüße,
Fancy

(Ups, zu langsam)


----------



## Tomate_Salat (25. Jul 2012)

's könnte auch jemand deinen Server hacken und die datenbank droppen .

Wenn jemand will, dann bekommt er manipulierte Datensätze in deine Datenbank. Spätestens wenn er das Spiel an sich hackt, kann er den Spielablauf manipuilieren und braucht nichtmal die Übertragung anzugreifen ;-). Szenario über Szenario. 

Mach doch ein Spiel aus dem Spiel ;-). Stell es wenns fertig ist hier zu Verfügung mit der bitte, manipulierte Daten in die Highscore zu bekommen


----------



## nillehammer (25. Jul 2012)

Tomate_Salat hat gesagt.:
			
		

> Mach doch ein Spiel aus dem Spiel . Stell es wenns fertig ist hier zu Verfügung mit der bitte, manipulierte Daten in die Highscore zu bekommen


Au ja! Ich bin dabei! :rtfm::toll::applaus:


----------



## BRoll (25. Jul 2012)

Tomate_Salat hat gesagt.:


> Mach doch ein Spiel aus dem Spiel ;-). Stell es wenns fertig ist hier zu Verfügung mit der bitte, manipulierte Daten in die Highscore zu bekommen



Meinst wirklich dass das ne Herausforderung wäre?

Decompiler > PHP Link raussuchen > aufrufen mit gewünschten Infos

Wenns wenigstens anspruchsvoll wäre, dann wäre es noch lustig aber
es ist (noch) zu einfach zu hacken.


----------



## BRoll (25. Jul 2012)

Templarthelast hat gesagt.:


> replay != video.
> 
> In einem Replay speicherst du die Spielabläufe wie z.B. Bewegung und Aktionen der Spieler- und NPCfiguren. In einem Video dagegen speicherst du das Bildschirmbild.
> 
> Mann kann theoretisch alles mit dem Quellcode auslesen und Manipulieren. Deine einzige Möglichkeit dies zu unterbinden wäre die Spielmechanik auf einem Server laufen zu lassen und nur vorbereiteten Input des Spielers entgegenzunehmen bzw. das momentane Bild zurückzugeben. Bei dieser ganzen Diskussion stellt ich allerdings die Frage nach Notwendigkeit.



Ok stimmt, das mit dem Replay habe ich falsch verstanden.
Die einzelnen Koordinaten/Bild Infos zu einem bestimmten zeitpunkt
sind viel kompakter und kleiner als ein video.





Templarthelast hat gesagt.:


> Brauchst du für dein Spiel ,das (ohne dein Spiel schlecht machen zu wollen) möglicherweise nur 100 Leute je spielen werden, Mechaniken, die jeglichen noch so komplexen Eingriff in das HighScoresystem unterbinden?



Bei der Notwendigkeit von so einem Sicherheitssystem, geht es mir nicht darum
dass das Spiel dann von vielen gespielt wird und zudem sicher ist vor Hackern,
sondern allein die Übung.
Hauptsächlich will ich diese Mechanismen verstehen und selber programmieren können.
Ich möchte einfach mal aus jedem Bereich der Programmierung etwas lernen und machen
können. Wie gesagt ich bin noch Anfänger und kenne viele Sachen noch nicht.
Hauptsächlich mach ichs aus Spaß am Programmieren, ich will aber später
beruflich programmieren 
Bewerb mich demnächst auf ner dualen Hochschule um angewandte informatik zu studieren.


----------



## Tomate_Salat (26. Jul 2012)

BRoll hat gesagt.:


> Meinst wirklich dass das ne Herausforderung wäre?
> 
> PHP Link raussuchen > aufrufen mit gewünschten Infos



Tja, wenn du soetwas anbietest:
[c]http://meintollergameserverinphp.de/highscore.php?p=Tomate_Salat&score=Double.POSITIVE_INFINITY[/c]
Dann ist das Kinderkacke . Du musst schon die übertragung iwie absichern ;-)


----------



## BRoll (26. Jul 2012)

Tomate_Salat hat gesagt.:


> Tja, wenn du soetwas anbietest:
> [c]http://meintollergameserverinphp.de/highscore.php?p=Tomate_Salat&score=Double.POSITIVE_INFINITY[/c]
> Dann ist das Kinderkacke . Du musst schon die übertragung iwie absichern ;-)




Das hab ich ja gemeint dass das zu einfach ist 

Und genau nach dem "iwie absichern" frag ich ja hier,
aber anscheinend weiß doch niemand wies genau geht.
 Und das ist ja meine Frage/Problem


----------



## Templarthelast (26. Jul 2012)

probiers doch einfach irgendwie und stell es dann hier rein. es wird sich dann zeigen, wie sicher es ist^^


----------



## Tomate_Salat (26. Jul 2012)

BRoll hat gesagt.:


> Und genau nach dem "iwie absichern" frag ich ja hier



Ja lesen hilft ... mach es einfach irgendwie ;-) . 

Ne also, da gibt es viele Möglichkeiten soetwas abzusichern. Ich würde dem Client einen Public Key (z.B. RSA) mitliefern und daraus iwie was bauen. Habe in den Bereichen bisher leider hauptsächlich nur theoretische Erfahrungen. 

Schau dir dochmal soetwas wie hypride verschlüsselung, zertifikate, etc. an. Könnte vllt en wenig übertrieben sein für eine HighScore aber von dem Wissen kannste später sicher mal profitieren.


----------

