Problem mit md5 [gelöst]

Guten Abend :bp:,

momentan bastel ich an einem (einfachen) Login-Script.
Als PHP-Anfänger tue ich mich aber schwer…
Das Passwort soll mit dem in einer Textdatei gespeicherten verglichen werden. Das sollte nun nicht im Klartext in der Datei stehen - also nehme ich md5.

Und jetzt wird’s lustig:
Das Passwort soll „test“ sein.
Um den md5-string zu erhalten, öffne ich eine Linux-Konsole und mache das hier:echo "test"|md5
Als Ausgabe erhalte ich [quote]d8e8fca2dc0f896fd7cb4cb0031ba249[/quote]
Der PHP-Befehl echo md5(„test“) gibt mir jedoch das aus: [quote]098f6bcd4621d373cade4e832627b4f6[/quote]
Woher kommt dieser Unterschied?
MD5 erzeugt doch (bei gleicher Eingabe) immer denselben Hash…?!

Das kenn ich :smiley:…jedenfalls sind die Hashes von MySQL und PHP gleich :wink:

PW: XMPP verwendet wieder eine andere MD5-Version (auch anderer Hash)

PS: Ich kann dir aber crypt statt md5 empfehlen, da Crypt mit Salts arbeitet, und dadurch nicht einfach eine Rainbow-Tabelle zur Entschlüsselung verwendet werden kann :wink:
Auch wenn es auf php.net etwas verwirrt: der Salt kann zufällig sein, er muss nur auf eines der Muster passen :wink:

Ja, ich habe XAMMP laufen (auf debian)… Du meinst, das ist die Ursache?
Dann stehen die Chancen gut, dass mein Provider (1blu) wieder andere Hashes erzeugt - mit der selben Funktion und der selben Eingabe?!

Ok, ich brauche eine alternative Verschlüsselung.
Hat crypt() irgendwelche Voraussetzungen in PHP, die erfüllt sein müssen?

crypt ist standardmäßig in php einkompiliert…wenn ein Hoster PHP ohne crypt kompiliert, hat er sich nur unnötige Arbeit angetan :ps:
(andererseits braucht man dann aber ein PHP zum verschlüsseln :wink: )

michi@michi:~$ echo "test" | md5 d8e8fca2dc0f896fd7cb4cb0031ba249
also am system liegt es nicht :wink: (es sind nur unterschiedliche Auffassungen von MD5 :wink: )

Ahem… crypt erzeugt bei jedem Aufruf einen anderen hash… und ist damit nicht zu gebrauchen.

Ok, mal zur Struktur:
ich lese ein (verschlüsseltes) Passwort aus einer Textdatei (oder Datenbank, das ist ja egal).
Und nun muss ich $_POST[‘password’] überprüfen - also ebenfalls verschlüsseln, und beide hash-Werte vergleichen.

Dafür dachte ich an md5 - schade, geht nicht…

edit:
inzwischen denke ich ernsthaft drüber nach, das Passwort unverschlüsselt abzulegen.
Das ist zwar ein Sicherheitsrisiko, aber andererseits - hier geht es um einen Kundenlogin, bei dem quasi gar keine sensiblen Daten hinterlegt sind (obwohl: möglicherweise kommen Verträge auch (später) mit rein…)

edit2:
ich habe eine Lösung!
Nachdem ich auf dem Space meines Providers mal getestet habe, was denn hier md5 für einen hash erzeugt, glaube ich, dass “nur” PHP andere md5-hashes erzeugt als mein Linux.
Daraus folgt, ich werde zur Erzeugung der Hashes (für die Textdatei) nicht mein System, sondern die Ausgabe von PHP nehmen - damit klappt es.

wenn du für die Erzeugung sowiso PHP verwendest, was spricht dann gegen crypt???

<?php

$pass_klar = "Hallo";
$salt="$1$1234567890ab$";

//Erzeugen
$pass_versch = crypt($pass_klar, $salt);

$eingabe = $pass_klar;

//Überprüfen
if(crypt($eingabe, $pass_versch) == $pass_versch)
   echo "Übereinstimmung!";

ganz einfach :wink:

naja, md5 ist doch schon ok, hab hier ne php datei, die musst du einfach im browser aufrufn, da gibt dein PW ein und danach wird es dir angezeigt, dann haste doch dein md5 PW…

[code]<?
$pw = $_POST[‘pw’];

echo’


'; if (!empty($pw)){ echo md5($pw); } unset($pw); ?>[/code]

und für die überprüfung einfach ein formular mit der eingabe deines PW und namens und dann diese datei zum einloggen.

[code]<?PHP
if( !empty($_POST[‘loginname’]) ) {

$loginname = $_POST['loginname'];

}
if( !empty($_POST[‘password’]) ) {

$password = $_POST['password'];

}
if ( ($file[‘user_passwort’] == md5($password)) && ($file[‘user_name’] == $loginname) ) {
// du bist eingeloggt, setz nen cookie oder so…
}
[/code]

Stimmt - ganz einfach :smiley:

Hatte nur das „salt“ in der (code-)Suppe vergessen :ps:

Ok, danke für die Hilfe - klappt und gelöst.
Und wieder was gelernt - war der Tag also auch nicht umsonst :read:

@promi:ja, aber normale MD5-Hashes kann man zB hier problemlos entschlüsseln lassen. Das ist eine Rainbow-Tabelle, die vergleicht nur den Hash mit einem gespeicherten :wink:
Deswegen auf jeden Fall Crypt :wink:

@i.deFix: hast du jetzt Crypt genommen, oder?

@ michi: ja, und es funktioniert prächtig.
Danke nochmals.

michi7x7 - ich glaube ja nicht, daß diese Regenbogentabellen
es fertig bringen, wenn ich einen zufälligen Abschnitt aus
Goethes Faust per md5 verwurste, anzugeben, was das nun
war.
Bei kürzeren, nicht originellen Paßwörtern allerdings werden
solche Tabellen recht nützlich sein, aber auch nur, wenn der
md5-Algorithmus überall gleich ist.
Da stellt sich dann die Frage, ob zum Beispiel die Linux-Variante
vielleicht nur die Anführungszeichen mitverwurstet hat oder
sowas, denn an sich wird der Algorithmus ja verwendet, um
zu verifizieren, daß etwa software-Pakete nicht verfälscht wurden,
wozu man eben die Zeichenkette des Programmierers mit der
vergleicht, die man selbst hat berechnen lassen. Da wäre es ja
ziemlich sinnlos, wenn zwei unterschiedliche Programme zu
anderen Ergebnissen kämen ;o)

Paßwort von anderen Leuten unverschlüsselt ablegen ist schon
insofern eine schlechte Idee, weil viele so unaufmerksam oder
ungeschickt sind, bei mehrere Diensten dasselbe Paßwort zu
verwenden. Wenn das bei einem Dienst geklaut wird, sind dann
auch gleich die anderen gefährdet. Das ist zwar an sich ein
persönliches Problem der betroffenen Person, wenn man das
vermeiden kann, erspart das aber eine Menge Aufregung ;o)

[quote]michi7x7 - ich glaube ja nicht, daß diese Regenbogentabellen
es fertig bringen, wenn ich einen zufälligen Abschnitt aus
Goethes Faust per md5 verwurste, anzugeben, was das nun
war.[/quote]
Die meißten Regenbogentabellen enthalten alle Passwörter bis zu einer länge von 6 Zeichen…eine mit 7 Zeichen ist schon bedeutend größer (ist glaub ich klar).
Jedenfalls sind mehr als die hälfte aller Passwörter nicht länger als 6 Zeichen (Ich hasse Studien, aber für sowas sind sie schon nützlich), was natürlich eine Regenbogentabelle erst bezahlt macht :wink:

“Entschlüsselt” sind Passwörter mit Salts jedoch gleich schnell, wie die ohne…

nutzt doch sonst sha1()

btw kann man auch mit md5 ne art “salt” verwenden:

function md5_salt($str, $salt=''){
    return md5($str.$salt);
}

oder mit sha1()

function sha1_salt($str, $salt=''){
    return sha1($str.$salt);
}

Nutzt man eine der Funktionen oben, und benutzt in allen php Scripten den gleichen bsp. 10 stelligen “salt”, dann sollte das Problem der Passwortstärke damit gelöst sein, oder?


SHA soll angeblich besser/stabiler sein als MD5, weil in MD5 wohl paar Schwachstellen existieren.
Und die SHA-Ausgabe ist 40 Stellen lang, währen MD5 nur 32 Stellen lang ist.

mfg Balmung

Das ist aber kein Salt… :ps:
Das verlängert Maximal das Passwort :wink:

Wenn man hinten an ein md5 verschlüsseltes Passwort nur was dranhängt (und das auch noch bei jedem dann gleich ist), kann sowas ein hacker, welcher alle pws hat, bemerken und sagt ich lass die letzten Zeichen weg und versuch dann das passwort zu entschlüsseln.
Schwupps kommt am ende wieder test raus nur weil er den “salt” weggelassen hat.
Ich denke da ist crypt schon sicherer als md5 + irgendwat hinten dran^^

[quote=“iNaD”]Wenn man hinten an ein md5 verschlüsseltes Passwort nur was dranhängt (und das auch noch bei jedem dann gleich ist), kann sowas ein hacker, welcher alle pws hat, bemerken und sagt ich lass die letzten Zeichen weg und versuch dann das passwort zu entschlüsseln.
Schwupps kommt am ende wieder test raus nur weil er den “salt” weggelassen hat.
Ich denke da ist crypt schon sicherer als md5 + irgendwat hinten dran^^[/quote]
wie bitte was?
md5 entschlüsseln? ich hab dich nicht ganz verstanden…
wie soll ein Hacker das herausfinden?
und wie soll er den zusatz entfernen können, wenn er nur den md5 hash hat, den man nicht enschlüsseln kann.

mfg Balmung

Hmm also michi hat hier doch nen link gepostet warte… such
Klickste
So nun stell dir vor. Du hast das PW "test"
Der MD5 Hash lautet dafür laut meinem PHP "098f6bcd4621d373cade4e832627b4f6"
So den gebe ich da ein und es kommt wirklich test raus.
Nun wie du sagtest hänge ich hinten einen “salt” an, der ja gleich sein müsste bei jedem PW, was in der DB steht, weil sich ein User sonst nicht einloggen könnte oder er besteht immer aus der gleichen zeichenanzahl und wird ja hinten angehängt, wie ich es an deiner Funktion erkenne.
Wenn das ein hacker herausfindet und nun einfach den “salt”, wie es z.B. 12345 oder so sein könnte, wegnimmt (md5 hash mit “salt” wäre “098f6bcd4621d373cade4e832627b4f612345” und ohne halt immernoch “098f6bcd4621d373cade4e832627b4f6”) dann kriegt er am ende Test raus. Nur weil bei den anderen auch die letzten 5 Zeichen gleich sind und somit das nix mehr bringt.
Man sollte solche Typen nicht unterschätzen.

Ok, der threat ist zwar schon als gelöst markiert, aber gut… diskutieren wir mal ein wenig über Sicherheit.

Ein Angreifer hätte zunächst mal das Problem, den md5-Wert überhaupt herauszufinden. Der wird aus einer Textdatei ausgelesen (ohne Endung, übrigens, also z.B. „user1234“.
Ein Zugriff auf diese Datei ist nicht ohne weiteres möglich, denn dazu müsste er den Dateinamen und -Pfad kennen oder raten.

Weiterhin verwende ich grundsätzlich Passwörter, die
a) mindestens 8 Zeichen haben - mitunter auch mehr,
b) kein „sinnvolles“ Wort ergeben, aber dennoch für meinen Kunden zu merken sind.
Zum Beispiel „Wdv-0908:VN“ - zunächst völlig wirr, aber zusammengesetzt aus
Webdesignvertrag vom September (09) des Jahres 2008, Kunde Vorname Nachname.
Das macht es schwer bis unmöglich, mittels Wörterbuch- und/oder Rainbowtable-Angriff dieses Passwort zu knacken.

Beides zusammen halte ich für einen sicheren Mechanismus - immerhin bin ich keine Bank, die Daten nach Regierungsrichtlinien „bombensicher“ (gibt’s sowieso nicht) machen muss.

Und dann verwende ich ja, michi7x7 sei Dank, auch kein md5() sondern crypt() :wink:

Übrigens: md5 zu „entschlüsseln“, halte ich von der Sache her für unmöglich - eine gewisse „Länge“ der Eingangsdaten vorausgesetzt.
Andernfalls würde ich der erste sein, der denjenigen für den Nobelpreis vorschlägt, der mir aus 32 Zeichen wieder eine 700MB Kubuntu-CD macht… :ps:

Moin,

wenn man sich nochmal das Beispiel von Balmung ansieht, wird man auch feststellen, dass der String aus PW und Salt zuerst zusammengesetzt wird und dann verschlüsselt wird, d.h. wir hätten etwas wie:

tollespassword15dsdfsdfe (z.B.) - was danach verschlüsselt wird. Auch Rainbow-Tabellen sollten es dann schwer haben …

crypt geht natürlich auch :wink:

MfG
myPages

@myPages: genau so isses
crypt kannte ich noch gar nicht, im ersten moment nahm ich an, dass wäre eine Verschlüsselter Text und kein Hash der dort erzeugt wird.

@iNad:
Du hattest mich falsch verstanden:
Ich habe geschrieben:
return md5($str.$salt);
Du hast interpretiert:
return md5($str).$salt;

So wie ich das meine, wird definitv wieder ein 32 Zeichen MD5-Hash erzeugt, und es ist nicht mehr nachvollziehbar welcher “salt” verwendet wurde.

md5 ist im allgemeinen sicher genug, wenn man den Zugriff auf die Datenbank, welche die Hashs beherbergt so weit es geht vermeiden kann.

btw. hab erst vor kurzem diesen Link gesehen: klick mich

mfg Balmung