md5() Sicherheit

So, ich habe mir jetzt ein paar Artikel zu md5-Hash und salt durchgelesen und bin nicht so richtig schlau daraus geworden.
Ich habe mal einen dokumentierten Quellcode geschrieben und hoffe, dass mir jemand sagen kann, ob es von der Sicherheit so reicht oder ob ich irgendwas vergessen oder sogar falsch gemacht habe.
Das ist mein erster Versuch mit md5()!!!

User:

PW:

<?php // Als erstes wird eine Datenbank erstellt, die folgende Attribute enthaelt:
// ID // User // Password // Salt // Jetzt wird ein Benutzer angelegt, indem man eine Eingabemaske mit HTML erstllt, in der man // den Benutzernamen und das Password eingibt. // Das Dokument sendet nun einen INSERT-Befehl an die Datenbank. // In der Datenbank wird der Benutzername (hier: max) gespeichert. // Zudem wird das Password als md5-Hash (hier: md5(1234)) gespeichert. // Und zu guter letzt noch ein salt, der zufaellig generiert wird, gespeichert. // ################## Salt ################## // So koennte der Zufallsgenerator fuer den salt aussehen function salt\_generator() { // substr - gibt einen Teil des Strings zurueck // rand() - generiert zufaellige Zahlen // uniqid - gibt eine eindeutige ID zurueck, die durch die aktuelle Zeit in Millisekunden generiert wird $salt\_db=substr(uniqid(rand()),2,10); return $salt\_db; } // ################## Password ################## // Hier wird mit Hilfe von md5 und dem salt ein Hash generiert. Dieser Hash wird als Password in der // Datenbank abgespeichert. function hash\_generator($pw, $salt, $user) { $pw\_hash=md5($pw.$salt.$user); return $pw\_hash; } // Nun zur Abfrage, ob der User sich auch einloggen darf: // Variablen, die eigentlich aus der Datenbank ausgelesen werden!!! // Zu Test-Zwecken hier vorgegeben!!! $user\_db="max"; $pw\_db="758ec8dce8b92977300e12f66e8d597e"; $salt\_db="270476bace"; // Variablen, die aus der Eingabemaske des Users ausgelesen werden $eingabe\_user=$\_POST[user]; $eingabe\_pw=$\_POST[pw]; // Ueberpruefung, ob die Eingaben (Benutzername und Password) auch mit den Eintraegen // der Datenbank uebereinstimmen. // Hier wird der selbe Hash-Code erstellt, der als Password in der Datenbank liegt $password=md5($eingabe\_pw.$salt\_db.$eingabe\_user); // Abfrage ob ueberhaupt etwas eingegeben wurde if($\_POST[user]=="" OR $\_POST[pw]=="") { echo "Bitte die Felder ausfüllen"; } // Abfrage ob die Eingabe und die Eintraege der Datenbank uebereinstimmen elseif($password==$pw\_db AND $eingabe\_user==$user\_db) { echo "Eingabe RICHTIG!!!"; } // Falls die Eingaben nicht uebereinstimmen else { echo "FALSCH... :frowning:"; } ?\>

Soweit ich mich da auskenne, ist das sicher.
Aber hier würde ich die Reihenfolge etwas vertauschen:

// Nun zur Abfrage, ob der User sich auch einloggen darf:

// Abfrage ob ueberhaupt etwas eingegeben wurde
if(empty($_POST[user]) OR empty($_POST[pw]))
{
echo „Bitte die Felder ausfüllen“;
} else {
// Variablen, die aus der Eingabemaske des Users ausgelesen
werden
$eingabe_user=$_POST[user];
$eingabe_pw=$_POST[pw];
//Versuchen, einen Datenbankeintrag für $eingabe_user zu finden.

// Variablen, die eigentlich aus der Datenbank ausgelesen
werden!!!
// Zu Test-Zwecken hier vorgegeben!!!
$user_db=„max“;
$pw_db=„758ec8dce8b92977300e12f66e8d597e“;
$salt_db=„270476bace“;

// Hier wird der selbe Hash-Code erstellt, der als Password in
der Datenbank liegt
$password=md5($eingabe_pw.$salt_db.$eingabe_user);

// Abfrage ob die Eingabe und der Eintrag der Datenbank
uebereinstimmen
elseif($password==$pw_db)

{
echo „Eingabe RICHTIG!!!“;
}
// Falls die Eingaben nicht uebereinstimmen
else
{
echo „FALSCH… :frowning:“;
}

}

?>

Johannes

OK, super. Kannte den Befehl empty gar nicht. Aber ich habe mir php auch nur so übers I-Net beigebracht.
Klasse!

Solange man keinen Zugriff auf deine Datenbank bekommt ist es so relativ schwer das Password über Rainbow Tables zu knacken. (http://de.wikipedia.org/wiki/Rainbow_Table)

Was auch noch gefährlich ist sind Atacken via Brute Force (http://de.wikipedia.org/wiki/Brute-Force-Methode)
Und SQL Injektion (http://de.wikipedia.org/wiki/SQL-Injektion#PHP)

Es gibt sicher noch einiges mehr an Sicherheitslücken aber dies sind so die Sachen die mir gerade auf anhieb eingefallen sind :wink:

Gruß