MD5 Hash im GM... letztendlich doch unsicher?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • MD5 Hash im GM... letztendlich doch unsicher?

      So, vor einiger Zeit habe ich hier chonmal eine Diskussion geführt (bezüglich MD5) um eben bezüglich dessen Sicherhetit anzufragen.
      (Mittlerweile kapiere ich das System auch.)

      Ich will das thema etwas auffrischen, da es im GM immernoch schwachstellen gibt die es sehr einfach machen könnten zugriff auf z.B: Online highscores zu bekommen.

      1. Gibt es überhaupt einen 100%ig funktionierenden Md5 Hash generator in GML?
      DLLs sind ja (nehme ich mal an) auch anfällig (falls man die DLL umschreiben würde, dass sie z.B: das Passwort das verschlüsselt werden soll im klartext ausgibt)

      2. Wenn das Online Passwort mit MD5 verschlüssellt abgespeichert wurde (z.B: in einem File) , so wird dieses ausgelesen und vom Client an den Server geschickt und dort verglichen ob diese auch wirklich gleich sind.
      Somit kann niemand das Passwort im Klartext auslesen und sich dann "einfach so" mit diesem online im jeweiligen Server einloggen.
      ABER:
      Falls man den Hashcode in einem File auslesen könnte... kann man mit dme Hashcode auch die Online Daten manipulieren wie z.B: in eine Online Highscore falsche Werte einzutragen.
      Dies wäre z.B: möglich indem man ein eigenes Programm schreibt was den Client "simuliert" und den erbeuteten Hashcode einfach an den Server sendet. (mitsamt von falschen Informationen wie z.B: hochgepushten Puntkezahlen.)
      Somit wäre der ganze Hashcode letztendlich doch unsicher, da jeder mit ein wenig Programmierkentniss im GML bereich diesen Client faken und somit zugriff auf den Server bekommen könnte. (Zugriff im Sinne von erschummelnden einträgen.)

      Übersehe ich irgendetwas, oder gibt es da wirklich keinne Sicherheit? (Sicherheit gibt es natürlich nie, jedoch wäre es wünschenswert das leben von etwaigen schummlern so schwer wie nur möglich zu machen.)
    • Seit mehreren jahren ist es bekannt, dass der md5 algorithm als entschluesselbar gilt. So... Ich persoenlich verwende 3 unterschiedliche algorithm fuer den passwort-encrypt... Und zwar nur fuer ein einziges password (natuerlich fuer alle accountbezogenen passwoerter). Es ist unwarscheinlich, dass diese methode genug spass bereitet fuer hacker, um wirklich alle 3 modelle zu identifizieren.

      Nebenbei, ich scheine deinen post nich ganz zu verstehen, kommt Mir vor
    • MD5 ist dafür da aus einem Wert einen unrückgänigmachbaren Wert zu machen, es gibt dazu also auch keinen Schlüssel mit dem man wieder den orginalen Wert bekommen kann. Mit

      Quellcode

      1. 7012acbb1d394b20567dffbf0992b677

      kannst du nicht viel anfangen. Eine Möglichkeit wäre jedoch zum Beispiel um wieder den orginalen Wert zu bekommen einfach alle 2^128 (weil 128Bit) Werte durchzugucken (Brute-Force). Hashes können also dazu benutzt werden um Passwörter nicht im Klartext zu speichern, aber trotzdem zu prüfen ob es die selben sind.

      GML-Quellcode

      1. hash(einegebenesPasswort)=gespeichertesGehashtesPasswordInDatenbank


      Wenn du nun natürlich den Hash vom Passwort weißt bringt das nichts, aber dafür weiß niemand das wirkliche Passwort.
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von henrik1235 ()

    • Ich hab zwar keine Ahnung von Kryptologie, aber MD5-Hash-Werte lassen sich nicht entschlüsseln, das heißt:
      Passwort -> MD5 -> Hash, aber Hash -> Passwort funkt nicht.

      In die Theorie wäre das natürlich möglich, aber dafür brauchst du wahrscheinlich so viel Zeit das das dir nichts bringt.

      So weiß die Bank nicht deine wirkliche PIN, sondern haben nur zum Beispiel den Hash davon, da selbe giltet für Passwörter, daher gibt dir die Passwort vergessen Funktion nicht die Möglichkeit dein altes Passwort anzuzeigen.

      #edit:

      Nun um auf Lewa Posts noch einmal einzugehen:

      1. Gibt es überhaupt einen 100%ig funktionierenden Md5 Hash generator in GML?

      DLLs sind ja (nehme ich mal an) auch anfällig (falls man die DLL
      umschreiben würde, dass sie z.B: das Passwort das verschlüsselt werden
      soll im klartext ausgibt)

      Es gibt eine genaue Beschreibung von MD5, auf Wikipedia gibt es z.B. ein Pseudocode den kannst du ja wenn du deinem aktuellen Code nicht traust, in GML "übersetzen". Ja, DLLs können einfach ausgetauscht werden, aber was sollte das bringen? Bei Benutzern die dann ihr Passwort in dein Programm eingeben, kann ein Virus genau das selbe mit einem Keylogger erreichen...


      Du kannst das so machen das der Client sich zuerst beim Server als "trusted" markieren muss und dann der Server erst die Befehle durchlässt, bei HTTPS muss z.B. sich der Server zum Client "ausweisen", damit das auch wirklich der echte Server ist.

      #edit2:

      Mit dem Hash verhinderst du nur das niemand (außer du) das echte Passwort weiß.
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von henrik1235 ()

    • @Nightrage: Schau bitte auf Wikipedia nach was Hash-Algorithmen wie MD5 sind! de.wikipedia.org/wiki/Hashfunktion Du verwirrst Lewa sonst nur...
      Aber als Anmerkung: Beim md5 Hash kommt als Ergebnis immer ein String der selben Länge heraus - selbst wenn du als "Passwort" 100 Seiten Text verwenden würdest! Allein das beweist dass es keine Möglichkeit gibt das ursprüngliche Passwort zu erhalten, EGAL wie mans anstelt. Es ist mathematisch beweisbar das es nicht möglich ist.

      Was aber mittels Bruteforce und Geschickten hoch(informatik-)mathematischen "Systemen" und unter Umständen gschafft wurde, ist ein ANDERES Eingangs-Wort zu finden welches genau den selben Hash-String erzeugt!
      Md5 ist aber dennoch weitensgehends sicher. Sofern du keine Bank betreibst, wird niemand solch eine Methode anwenden! (mit hoher Wahrscheinlichkeit wäre es einfacher deinen Server zu knacken :D )


      @Lucke:

      Falls man den Hashcode in einem File auslesen könnte... kann man mit dme Hashcode auch die Online Daten manipulieren wie z.B: in eine Online Highscore falsche Werte einzutragen.
      Dies wäre z.B: möglich indem man ein eigenes Programm schreibt was den Client "simuliert" und den erbeuteten Hashcode einfach an den Server sendet. (mitsamt von falschen Informationen wie z.B: hochgepushten Puntkezahlen.)
      Somit wäre der ganze Hashcode letztendlich doch unsicher, da jeder mit ein wenig Programmierkentniss im GML bereich diesen Client faken und somit zugriff auf den Server bekommen könnte. (Zugriff im Sinne von erschummelnden einträgen.)

      Übersehe ich irgendetwas, oder gibt es da wirklich keinne Sicherheit? (Sicherheit gibt es natürlich nie, jedoch wäre es wünschenswert das leben von etwaigen schummlern so schwer wie nur möglich zu machen.)
      Glaube du hast einen falschen Ansatz. Du speicherst die md5 Version des Passworts keinesfalls auf dem Computer des Users!
      Wenn sich ein Spieler registriert, wird der MD5 einmal ausgerechnet und an den Server gesendet. Dieser speichert dann das gehashte Passwort ab (in einer Datei oder besser noch: in einer SQL-Datenbank) und verknüpft ihn mit dem Benutzernamen.
      Auf dem PC wird keine Datei erstellt.

      Will sich nun ein User später einloggen, dann wird erneut lokal das md5 ausgerechnet und zwar anhand des Passworts den der User grade eingegeben hat (kann das falsche sein).
      Dann wird dieser Hash, zusammen mit dem Benutzernamen an den Server geschckt. Dieser überprüft nun mit einem PHP skript ob der empfangene Hash mit dem übereinstimmt welcher beim Registrieren in die Datenbank gespeichert wurde. Falls ja wird der Erfolg zurück gemeldet und der User ist eingeloggt. Falls nicht hat er das Falsche Passwort oder den falschen Benutzenamen eingegeben.

      Somit wird das Passwort zu keinem Zeitpunkt im Klartext übertragen (das ist auch der Hauptgrund wieso man hash-Algos für sowas verwendet)!
      Ein "Hacker" könnte höchstens etwas anstellen wenn er es schafft deinen Server "abzuhören", also die Übertragung des MD5 Hashes beim Login eines Users abzufangen - dann wäre es möglich sich als dieser User mit solch einem selbst gebastelten Client auszugeben - Schummeln könnte man damit ja aber wohl kaum, höchstens fremde Accounts aneignen...

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • "Entschlüsseln" ist im Kontext von Hashes wie md5 sowieso sinnfrei, da
      ein Hash nicht jeden Ursprungswert auf einen eigenen Hash abbildet.
      Somit lässt sich also ein Hash nicht eindeutig einem Ursprungswert
      zuordnen.
      Im Rahmen von hashes kritisch ist nur, dass man eventuell zu einem
      gegebenem Hash einen Wert findet, der sich auf diesen Hash abbilden
      lässt.
      Meines Wissens gibt es da aber für md5 keinen effizienten Algorithmus.
      Gruß, Spellmaker

      Edit: Und da war schätzungsweise jemand schneller und ausführlicher :P
      ___________________________________________________________
      Beware of wild pointers
      ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
    • Du verwirrst Lewa sonst nur...

      Ist schon in Ordnung. XD Wie hashes funktionieren (grobgesagt) ist mir schon bewusst.^^

      Glaube du hast einen falschen Ansatz. Du speicherst die md5 Version des Passworts keinesfalls auf dem Computer des Users!
      Wenn sich ein Spieler registriert, wird der MD5 einmal ausgerechnet und an den Server gesendet. Dieser speichert dann das gehashte Passwort ab (in einer Datei oder besser noch: in einer SQL-Datenbank) und verknüpft es mit dem Benutzernamen.
      Auf dem PC wird keine Datei erstellt.

      Will sich nun ein User später einloggen, dann wird erneut lokal das md5 ausgerechnet und zwar anhand des Passworts den der User grade eingegeben hat (kann das falsche sein).
      Dann wird dieser Hash, zusammen mit dem Benutzernamen an den Server geschckt. Dieser überprüft nun mit einem PHP skript ob der empfangene Hash mit dem übereinstimmt welcher beim Registrieren in die Datenbank gespeichert wurde. Falls ja wird der Erfolg zurück gemeldet und der User ist eingeloggt. Falls nicht hat er das Falsche Passwort oder den falschen Benutzenamen eingegeben.


      Der Punkt ist aber, dass ich die Möglichkeit bieten möchte, Map-Files (bzw Custom Maps) anzubieten die sich Spieler selber zusammenbasteln können.
      Darunter gehört auch die Möglichkeit eines eigenen Online Servers. Mei ngedanke war also, die Passwörter in den Save-Files zu speichern, sodass leute die die Karte dann runterladen
      automatisch eine Verbindung zur OHS bekommen können, da der Client praktisch das Passwort aus dem File liest (gehasht) und an den Server schickt. (Das Passwort selbst zu kennen und bei jedem File eingeben zu müssen ist nicht gerade benutzerfreundlich.)

      Das Problem an der Sache ist jedoch genau das Speichern in einem File. Wenn man es irgendwie schafft das Map-system zu knacken und an den Hash ranzukommen, so bringt dieser letztendlich garnichts mehr da
      man mit einem selbstgebasteltem Client an die Online Highscore rankommt... (und dies ist nicht so schwer da praktisch nur GML wissen braucht und wissen muss wie die Tabelle aufgebaut ist.)

      Evtl indem ich das Mapfile mitsamt dem Hascode nochmal verschlüssele... Aber dann kann man ja im Ram auf den Hashcode zugreifen... oder?


      Somit wird das Passwort zu keinem Zeitpunkt im Klartext übertragen (das ist auch der Hauptgrund wieso man hash-Algos für sowas verwendet)!
      Ein "Hacker" könnte höchstens etwas anstellen wenn er es schafft deinen Server "abzuhören", also die Übertragung des MD5 Hashes beim Login eines Users abzufangen - dann wäre es möglich sich als dieser User mit solch einem selbst gebastelten Client auszugeben - Schummeln könnte man damit ja wohl kaum, höchstens fremde Accounts aneignen...

      Also kann man gegen das Abhören ansich garnichts machen...

      bzw. habe auch gehört dass z.B: der Hash script von gmlscripts.com nicht 100%ig akkurat arbeitet und hier und da andere Codes rausspuckt. Gibt es da eine funktionierende alternative?
    • Achso.. jetzt erinnere ich mich an dein altes Problem..

      Nein was du beschreibst ist im Grunde schlichtweg nicht zu 100% sicher lösbar!
      Aber annähernde Sicherheit kannst du schaffen.
      ABER:
      Arbeitest du mit gm 8(.1)?
      Dann vergiss einfach alle derartigen Sicherheitsaspekte am besten sofort! Es ist egal wie gut du die Dateien verschlüsselst. Dekompilieren ist ohne weiteres möglich weswegen sich das ganze erübrigt. Punkt und Ende.
      Ich würde an deiner Stelle höchstens einen Schutz gegen das DDos'en deines Servers einbauen - also dass niemand mit Hunderten OHS-übertragungen deinen Server lahmlegen könnte... - wenn dein SPiel eine gewisse Popularität erreicht, findet sich garantiert ein Skriptkiddie der das früher oder später versucht...
      Dazu könnte man z.B. Wartezeiten einbauen oder die Anfragen begrenzen (alles in PHP). Da kenn ich mich aber nicht aus.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Arbeitest du mit gm 8(.1)?
      Dann vergiss einfach alle derartigen Sicherheitsaspekte am besten sofort! Es ist egal wie gut du die Dateien verschlüsselst. Dekompilieren ist ohne weiteres möglich weswegen sich das ganze erübrigt. Punkt und Ende.

      Ja, ich arbeite mit dem GM 8.1
      Gibt es da nicht den Obfuscator mit dem man die exen wenigstens unlesbar machen könnte? Sollte doch noch funktionieren.
      Ansonsten: Ist GM:Studio denn decompile sicher? Oder gibt es da auch schon ansätze zum auslesen des GML Codes. Vielleicht versuche ich ja irgendwann wenn ich Zeit habe Celerity auf Studio zu porten...
      (wenn mir das wirklich vorteile bringen sollte...)

      Ich würde an deiner Stelle höchstens einen Schutz gegen das DDos'en deines Servers einbauen - also dass niemand mit Hunderten OHS-übertragungen deinen Server lahmlegen könnte... - wenn dein SPiel eine gewisse Popularität erreicht, findet sich garantiert ein Skriptkiddie der das früher oder später versucht...
      Dazu könnte man z.B. Wartezeiten einbauen oder die Anfragen begrenzen (alles in PHP). Da kenn ich mich aber nicht aus.

      Dann werde ich wohl ein eigenes OHS System schreiben müssen. Aktuell verwende ich Blacksp@rks OHS-DLL.
    • Es gibt exe-Obfuscatoren die jedoch knackbar sind und auch nicht gegen Speicher-Auslsen helfen.
      Beides macht eine Verschlüsselung über interne Passwörter leider zunichte :/

      Das Studio scheint im Moment sicher zu sein. Es wird auch eine andere Technik verwendet bei der zumindest der Code nicht mehr so direkt in der Exe vorkommt (hoffe ich zumindest).
      Ergooglen konnte ich zumindest nichts.
      Du hättest auch gewiss Geschwindigkeitsvorteile im Studio von daher könnte sich die Mühe auch lohnen (und ganz nebenbei hast du auch eingebaute Hash Funktionen: sogar SHA was besser als MD5 ist). Allerdings weiss ich grad nicht ob 3D im Studio überhaupt schon funktioniert!

      Die OHS Dll musst du nicht umschreiben, höchstens etwas am PHP skript werkeln aber mach dich erstmal schlau wie solch ein Schutz funktioniert.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Nochmal in kurzer Zusammenfassung:
      - Hashs bilden eine Eingabe auf eine recht kurze Zeichenkette (fester Länge) ab
      - Die Anzahl der Hashs ist damit endlich, d.h. es gibt mehrere Eingaben, die den gleichen Hash erzeugen => Das Verfahren ist nicht sicher umkehrbar
      - Aber: Es gibt sog. Rainbow Tables, die, einfach ausgedrückt, zu ganz vielen Hash-Codes ein Ursprungswort kennen. Mit einem Ursprungswort kann man sich dann auch einloggen, da es ja den korrekten Hash erzeugt
      - Konsequenz: Man verwendet eine "bessere" Hash-Funktion als MD5, die man noch irgendwie saltet (bzw. salten kann), d.h. personalisiert


      Wenn du es wirklich sicher haben willst, musst auch die übertragenen Daten verschlüsseln. Aber auch das bringt dir nicht viel, wenn jemand dein Programm auseinander nimmt und die Verschlüsselungsfunktion findet. Mein Tipp: Verschwende nicht großartig Zeit damit. Wenn du einem einfaches Scriptkiddie den Wind aus den Segeln nehmen willst, verschicke die Punktzahl verschlüsselt. Wenn der Server merkt, dass er eine offensichtlich falsche Punkzahl bekommt, setzt er dir IP auf eine Untrusted-Liste. Sollte dieser IP später gültige Scores eintragen, lässt du dies zu, löschst sie aber nach ein paar Stunden automatisch.
    • MewX schrieb:

      Sollte dieser IP später gültige Scores eintragen, lässt du dies zu, löschst sie aber nach ein paar Stunden automatisch.
      Umh.. wieso? Um dem Kiddie eine Lehre zu erteilen? Dann wäre es doch besser gleich zu löschen, oder?

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Weil es dann sofort die IP ändert und neu probiert. So wird er im Glauben gelassen, dass du da manuell löschst oder hat sowieso wieder die Motivation verloren. Meistens ist der Drang dazu ja eher spontan und auch genauso schnell wieder verflogen, wenn einmal das Erfolgserlebnis da war. Das wäre jetzt nur meine ganz persönliche Psychostrategie.
    • MewX schrieb:

      Das wäre jetzt nur meine ganz persönliche Psychostrategie.
      Aha, schön zu wissen was in deinem Kopf vorgeht :D
      Aber ja, daran habe ich nicht gedacht!

      @LEWA
      Ausgehend von dem was wir hier besprochen haben brauchst du dir eigentlich nicht die Mühe machen mit irgendeinem Passwort zu verschlüsseln.
      Einfacher wäre es zu obfuscieren. Also den score mit irgendwelchen Zahlen multipliziren, dividieren usw. Der server kehrt diese ganzen Rechnungen dann einfach um.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Benutzer online 1

      1 Besucher