Zum Inhalt springen

PHP: MD5 Passwort Hash mit EIngabe vergleichen


Empfohlene Beiträge

Hi hi,

ich bastel gerade etwas an meine Hompeage rum und bin gerade beim Login.

Wenn ich mich registriere gebe ich ein Passwort an und verschlüssle diese mit md5 und leg es in die Datenbank. Wenn ich mich nun einloggen will dann geb ich mein PW ein und dann muss ich das mit dem md5 hashwert in der DB vergleichen. Nur wie mach ich das?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du holst dir mit nem SELECT das verschlüsselte Paßwort zu deinem User von der Datenbank und vergleichst es mit dem md5-Produkt dessen, was dein User als Passwort übergeben hat.

So etwa:


$result = mysql_query("SELECT password FROM user WHERE uid = '$id'",$db);
$row = mysql_fetch_row($result);

if ($row !== NULL)
{
if ($row[0] == md5($_POST["password_feld"])
//dann biste eingeloggt
else
//sonst halt net
}
[/PHP]

Wo ist dat Problem?

Link zu diesem Kommentar
Auf anderen Seiten teilen

nein, dem ist nicht so. Der Hash-Algorithmus ist zwar eine One-Way-Verschlüsselung, was aber nicht heißt, das aus einunddemselben Wort einmal dieser Code und ein andermal ein anderer Code rauskommt. Wenn es denn so wäre, dann wäre md5 meiner Meinung nach völlig sinnlos, da man es ja auch nicht mehr decodieren kann!

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber dann ist das doch recht unsicher

ich könnte doch jetzt mir n script basteln welches wörter (groß-,kleinbuchstaben, zahlen) von 4 zeichen bis 15 zeichen bastelt und diese mit md5 verschlüsselt, ab in ne datenbank mit den beiden werten und wenn ich mir dann die hashes von meinen usern hol und den dazu passenden wert in der datenbank suche hab ich das kennwort klartext...

aber ok, da bracuht man schon ne sehr schnelle datenbank um es in einem leben zu schaffen...

26 (buchstaben) * 2(gros/klein) + 10(zahlen) = 62 (mögliche zeichen)

768.909.704.948.766.668.552.634.368 mögliche kombinationen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vorsicht:

Hashes sind _keine_ Verschlüsselung von etwas, sondern nur eine kryptographische Prüfsumme, d.h. im Krypto-Sprachgebrauch: der Part von "Integrität der Daten".

Will man Daten verschlüsseln nimmt man andere Algorithmen.

Und gegen BruteForce ist sowieso jede Verschlüsselung oder Hash nutzloch. Es kommt nur auf die Zeit an ;)

taschentoast

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber ok, da bracuht man schon ne sehr schnelle datenbank um es in einem leben zu schaffen...

Genauso kannst du auch alle anderen Methoden, ein Passwort zu verschlüsen "bruteforcen", es ist alles nur eine Frage der Zeit. ;)

als Code würde ich es so machen:


$result = mysql_query("SELECT uID FROM user WHERE
loginname = '$logname' and passwd = md5('$pw')",$db);
$row = mysql_fetch_row($result);

if ($row !== NULL)
{
// Willkommen drin...
}
[/PHP]

Auch wenn der Unterschied nicht groß ist zu Hobbes Vorschlag, ich finde die Lösung eleganter. Auch bleibt das (original) PW des Benutzers so in der DB und wird direkt da verglichen und nicht ausgelesen und weitergegeben. Klar ist das jetzt keine Möglichkeit das Ding irgendwie abzufangen oder so... aber warum nicht die MySQL-Fähigkeit zum Hasherzeugen nutzen?

Ich bin der Ansicht, das ist besser so... :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast schon recht, es ist keine Verschlüsselung. Man kann es in dem Sinne auch nicht rückentschlüsseln, sondern nur per BruteForce per Dictionary oder allen Kombinationen jeweils Hashwerte erzeugen und die vergleichen, wenn's hinhaut, hat man das Paßwort "geknackt". Das wäre ja nahezu die gleiche Vorgehensweise, wie Snowman es vorschlägt, aber bei 7,68e+26 Kombinationsmöglichkeiten ist der Zeitaufwand, den man zum Knacken braucht sehr wahrscheinlich länger als die Lebensdauer des Paßwortes :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast schon recht, es ist keine Verschlüsselung. Man kann es in dem Sinne auch nicht rückentschlüsseln, sondern nur per BruteForce per Dictionary oder allen Kombinationen jeweils Hashwerte erzeugen und die vergleichen, wenn's hinhaut, hat man das Paßwort "geknackt". Das wäre ja nahezu die gleiche Vorgehensweise, wie Snowman es vorschlägt, aber bei 7,68e+26 Kombinationsmöglichkeiten ist der Zeitaufwand, den man zum Knacken braucht sehr wahrscheinlich länger als die Lebensdauer des Paßwortes :)

und um das ganze noch weiter herauszuzögern, sollte man eine maximale Anzahl an Eingabe-Versuchen vorgeben und wenn diese überschritten ist eine Fehlermeldung ausgeben, damits dann nicht ganz so leicht ist,...

eine andere möglichkeit ist auch einen User-Account bei mehrfacher Falsch-Eingabe für z.b. 24h zu sperren....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich seh ehrlich gesagt den Gewinn nicht ganz in JesterDays Lösung. In der von mir beschriebenen Lösung wird das Paßwort gehasht in die Datenbank eingetragen, das heißt, selbst wenn jemand unberechtigtes in die DB schaut, sieht er nur die Hashs und müßte sie per BruteForce hacken.

Und das unverschlüsselte Paßwort wird so und so durch das PHP-Script laufen, da es idR über $_POST übergeben wird (Wer GET nimmt, ist selbst schuld *gg).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich seh ehrlich gesagt den Gewinn nicht ganz in JesterDays Lösung. In der von mir beschriebenen Lösung wird das Paßwort gehasht in die Datenbank eingetragen, das heißt, selbst wenn jemand unberechtigtes in die DB schaut, sieht er nur die Hashs und müßte sie per BruteForce hacken.

Ich sagte nicht, das deine Lösung unsicherer ist. Aber allein schon brauchst du eine SQL-Abfrage mehr, du brauchst in deiner Lösung nämlich die uID zum User, der sich einloggen will. Und auch wenn du es nicht über die User ID machst, brauchst du ein paar PHP Schritte mehr. Klar sind das Millisekunden, aber auch Kleinvieh macht Mist ;) Und wenn man es vermeiden kann...

EDIT:

Ausserdem spart es einige Zeilen Code und macht ihn dadurch übersichtlicher. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Und das unverschlüsselte Paßwort wird so und so durch das PHP-Script laufen, da es idR über $_POST übergeben wird (Wer GET nimmt, ist selbst schuld *gg).

Der Unterschied zw. POST und GET macht, wenn du das PW abfangen kannst, auch keinen Unterschied mehr. Klar, GET siehst du in der URL, aber du wirst ja wissen, was du gerade eingegeben hast ;) Wenn du den Verkehr zw. Client und Webserver "mitlesen" kannst, ist POST auch nicht sicherer. Es sei denn, du benutzt SSL, dann sieht es natürlich anders aus. Dann wird POST nämlich verschlüsselt gesendet, GET aber nicht.

EDIT:

Das ist nur als kleines "Besserwisser-Syndrom" zu verstehen ;) POST ist immer GET vorzuziehen IMHO.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Natürlich ist POST vorzuziehen. Ich meinte aber vor allem, daß es manche User gibt, die auf ne Login-Seite gehen, die nicht redirected wird und das PW noch im GET-Aufruf drinsteht. Und diese Adresszeile wird dann in irgendnem Forum oder so gepostet. Da freut sich jeder *gg

Ok, das stimmt auch wieder ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...