Hash mit JS oder PHP erzeugen?

...komplette Frage anzeigen

3 Antworten

Die beiden Antworten von agent0009 und Nille87 kannst Du ganz schnell vergessen. Ein Hashwert eines Passworts zu verschicken ist genauso unsicher als wenn Du das Passwort im Klartext verschickst. Aus dem Hashwert kannst Du das Passwort ja nicht mehr extrahieren, d.h. für Dich, Du must auf dem Server vom Passwort auch den Hashwert errechnen und die Hashwerte vergleichen. Als Angreifer brauche ich dann also auch nur den Hashwert abfangen. Besser ist es, Du verschlüsselst die gesamte Kommunikation zwischen Server und Client.

WhiteGandalf 03.04.2013, 12:53

Ja: Bei den beiden reicht offenbar das Vorstellungsvermögen oder die eigene Übung im Hacking noch nicht aus.

Jetzt stellen wir uns noch vor, daß GuteFrage einen hohen Stellenwert bei Google hat und was mit Neulingen auf dem Gebiet passiert, die diese Frage/Antworten erwischen...

OK: Es geht nur um relativ nebensächliche Sachen - auf die Sicherheit hat ja die Entscheidung hier eh keinen Einfluß. Aber es wäre schon gut, wenn die tatsächlich korrekten Antworten höher bewertet werden!

0

Nun, ich kann mich keinem meiner Vorredner anschließen. Lioxen hat zwar das Problem von Agent und Nille erkannt, letztendlich ist aber auch seine aussage, bis auf den teil mit der gesammten verschlüsselung der verbindung, nicht wirklich standhaft.

Grundsätzlich gilt:

  • Sichere Verbindung (per HTTPS)

Wenn das gegeben ist, kannst du anfangen mit sicheren Passwörtern und ähnlichen herum zuspielen, alles andere wäre so wie 5 Schlösser an die Tür zu packen und die ganzen Schlüssel im Blumentopf daneben zu verstecken....

Per Javascript etwas zu verschlüsseln ist die dümmste Idee, die man haben kann - der Hacker sieht sich den Quelltext an und kennt alle deine Verschlüsselungsmechanismen, da kannst du gleich alles im Klartext abspeichern, da weiß der Hacker wenigstens nicht, wie du arbeitest... Abgesehen davon: Was passiert mit den Nutzern, die JS deaktiviert haben?

Das Passwort wird in PHP verschlüsselt und zwar mit einem Salt! Jeder zweite Mensch, der einen Webspace hat verschlüsselt die Passworter mit md5 oder sha1 oder so aber keinem salt! Das ist unnütz!!

Nun, zusammengefasst gehen wir wie folgt vor:

Wir bauen eine sichere Verbindung mit HTTPs auf -> Das Login-Formular wie gehabt einfach per HTML erstellen und per JS kontrollieren lassen (ob die Eingaben korrekt sind - wäre optional) -> das Formular wird an den Server (per HTTPs) geschickt und dort mit PHP nochmals überprüft, ob alles korrekt ist (JS kann man ja ausschalten :-D ) und dann beginnen wir mit der Verschlüsselung: Das Passwort (welches unserem Server ja im Klartext vorliegt, wird mit einem SALT versehen, das bedeutet, wir fügen einfach etwas statisches hinzu: z.B: "mk47f9s" (dieser Salt ist fix im Skript verbaut - PHP sieht ja keiner - außer er hat zugang zu deinem Webserver oder den Dateien, das ist aber ein anderes Kapitel) und fügen es wie gesagt dem passwort hinzu: myPassmk47f9s -> ERST JETZT HASHEN WIR ES! dann fügen wir es in die Datenbank und erst dann ist es wirklich sicher!

Wenn wir jetzt natürlich einen login bauen wollen, gehen wir exakt gleich vor, wir machen eine sichere verbindung, dem passwort wird der salt angehängt, hashen und schauen ob der hash derselbe ist wie der in der Datenbank, wenn ja, dann ist das Passwort korrekt, ansonsten nicht....

(Falls du das mit dem Salt nicht kapiert hast):

$salt = "mk47f9s"; //hier einfach irgentwas verwenden, muss dann aber der salt für alles sein! auch beim login
$passwort = $_POST['PasswordVomNutzer']; //das eingegeben Password
$hash = sha1($passwort.$salt);  //Nutze bitte sha1, da md5 bereits alt ist und es unzälige Bruteforce-Generatoren gibt, die einige Passwörter schon knacken...

alles klar?

Lioxen 04.04.2013, 11:06
  1. was meinst Du mit, meine Aussage ist nicht standhaft? Habe ich was falsches behauptet oder mich undeutlich ausgedrückt? Um es hier noch mal klar zu stellen. Weder das Passwort im Klartext noch einen Hashwert zum Server zu schicken bringt einen Sicherheitsgewinn.

  2. In einem Punkt Deiner Ausführung muss ich Dir widersprechen. Warum sollte es nicht möglich sein, mit Javascript eine sichere Verschlüsselung zu erreichen? Das Argument, man kann den Quellcode sehen, zählt nicht, Dann dürfte es nämlich überhaupt keine sichere Verschlüsselung geben. Denn von allen bekannten und als sicher eingestuften Verschlüsselungsverfahren ist auch der Quellcode bekannt. Sichere Verschlüsselung basiert nicht auf Security by Obscurity, das hat noch nie funktioniert.

0
Hosenmist95 04.04.2013, 20:19
@Lioxen
  1. Den Teil mit dem Hashwert abfangen :-)

  2. Da Javascript deaktiviert werden kann.

0
Lioxen 05.04.2013, 00:09
@Hosenmist95
  1. WhiteGandalf hat es doch als Kommentar zu agent0009 Betrag auch noch mal ausführlich erklärt. Wenn ich mit dem Hashwert eines Passworts arbeite, kann der Server auch nur die Hashwerte vergleichen, ergo reicht es mir als Angreifer den Hashwert des Passworts zu kennen und an den Server zu senden. Das Passwort muss ich dazu nicht wissen. Was ist daran falsch?

  2. Natürlich kann man Javascript abschalten. In einem solchen Fall sollte dann natürlich auch die Kommunikation mit dem Server verweigert werden. Das ist aber nicht der Punkt. Du hast Deine Behauptung, dass man mit Javascript keine sichere Verschlüsselung hinbekommt damit begründet, man kann in den Quellcode reinschauen. Dem habe ich widersprochen.

0
Hosenmist95 09.04.2013, 15:53
@Lioxen
  1. Eben nicht... Wenn der Server das Passwort hasht, reicht es dir nicht aus, den Hash zu kennen - sollte das ganze über Javascript am Client laufen, dann würde es dir reichen. Aber wenn ein Hash an den Server geschickt wird (und wir am server hashen), dann würde dein Hash nochmal gehasht werden, ergo reicht es dir nicht aus, den Hash des Passworts zu kennen. (Natürlich kannst du jetzt behaupten, man könnte beispielsweiße eine MySQL-Injection machen, aber das ist ein Problem der mangelnden Sicherheit!

  2. Lesen wir uns nocheinmal aufmerksam meinen Beitrag durch:

Per Javascript etwas zu verschlüsseln ist die dümmste Idee, die man haben kann - der Hacker sieht sich den Quelltext an und kennt alle deine Verschlüsselungsmechanismen, da kannst du gleich alles im Klartext abspeichern, da weiß der Hacker wenigstens nicht, wie du arbeitest... Abgesehen davon: Was passiert mit den Nutzern, die JS deaktiviert haben?

Abgesehen davon: Was passiert mit den Nutzern, die JS deaktiviert haben?

Oh, was steht den da? Kannst du mir das vielleicht vorlesen? :-)

Übrigens: Ein Hacker, damit meine ich einen richtigen Hacker, keinen 0815 Cracker oder key-gen-creator, würde mit dem wissen über deine verschlüsselungemechanismen dein gesamtes System innerhalb einer stunde komplett aushebeln und auf dauer lahm legen... Daher ist die reine möglichkeit, deinen Quellcode anzusehen fatal....

0
Lioxen 15.04.2013, 13:15
@Hosenmist95
  1. Wenn der Server das Passwort hasht, dann musst Du es im Klartext an ihn senden. Nur wenn Du Javascript dazu nutzt, versendest Du den Hashwert und in diesem Fall reicht es, den Hashwert zu kennen. Also egal wie rum Du es anstellst, es bringt nichts und nichts anderes habe ich geschrieben.

  2. Du behauptest, nur weil man den Quelltext des Kryptoalgorithmus kennt, kann, man es kompromittieren. Wenn dem so ist, dann ist der Algorithmus oder die Implementierung für die Tonne. Für jedes heute anerkannte Kryptoverfahren ist der Algorithmus bekannt. Du brauchst nur mal auf Wikipedia danach suchen. Auch findest Du da genug Links zu Quellcode in beliebigen Programmiersprachen, die diese Algorithmen implementieren. Hier ist sogar eine Libary in Javascript die mehrere Algorithmen implementiert: http://code.google.com/p/crypto-js/ Ich kenne sogar eine praktische Anwendung, wo eine Verschlüsselung auf dem Client per Javascript gemacht wird. Vielleicht sagt Dir die Plattform "Mega" etwas. Dort werden alle Dateien bevor sie auf den Server hochgeladen werden per Javascript verschlüsselt. Das machen die zwar eher, um sich selber zu schützen, aber ganz nebenbei, weiss damit nicht mal der Serverbetreiber, welchen Inhalt die Datei hat.

Was passieren soll, wenn man Javascript ausgeschaltet hat, hatte ich auch schon geschrieben. Dann erhält derjenige einen netten Hinweis, das er Javascript einschalten soll. Ohne Javascript kann er einfach den Dienst nicht nutzen. Wo ist also das Problem?

0

erst hashen dann schicken, sonst kann es abgefangen werden

WhiteGandalf 03.04.2013, 12:57

Wenn der Server NICHTS ANDERES bekommt als den Hashwert... WORAN MUSS er dann ZWINGEND seine Entscheidung festmachen, ob das Passwort ([Augenzwinkern]: der Hashwert des Passworts!) korrekt sein soll?

Was, wenn dieser Hashwert abgefangen wird? Und dann vom Gauner bei DESSEN Login-Versuch zum Server geschickt wird?

Worin sollte sich ein korrekter Hashwert vom User von einem korrekten (abgefangenen) Hashwert vom Gauner unterscheiden?

0

Was möchtest Du wissen?