PHP login etc.

abba wie läuft das denn dann ab wenn ich die dinger jetz verschlüssle??

sag ich dann sowas wie (also wenn crypt() das ganze verschlüsselt:)
beim login mein ich jetzt!
PHP:
if (crypt($_POST['password'])==$Database_password) {
//login
}
else {
//Fehlerquelle genauer suche und ausgeben!
}
 
joa so zum beispiel. Oder direkt in der SQL abfrage. Die passwörter sollten dann aber auch mit der crypt() funktion in der DB gespeichert werden. Wobei ich pers. auf md5 setze. Is nen Hash, ich glaube crypt is nur eine verschlüsselung oder?
 
ah hab mir mal nen script von jemandem anderen angeguckt!
jetz weiß ich für was des md5 war^^

ok thx dann werd ichs demnächst noch n bissl verändern!
(grad eben anmelde-script fertigbekommen)
 
Der Vollständigkeit halber (falls jemand danach sucht und hier nachliest), das Beispiel von php.net:
PHP:
<?php
$passwort = crypt('mein_Pwd'); // Der Salt wird automatisch generiert

/* Sie sollten das vollständige Ergebnis von crypt() als Salt zum
   Passwort-Vergleich übergeben, um Problemen mit unterschiedlichen
   Hash-Algorithmen vorzubeugen. (Wie bereits ausgeführt, verwendet
   ein Standard-DES-Passwort-Hash einen 2-Zeichen-Salt, ein
   MD5-basierter hingegen nutzt 12 Zeichen. */
if (crypt($benutzer_eingabe, $passwort) == $passwort) {
   echo "Passwort stimmt überein!";
}
?>
php.crypt() KANN folgende Verschlüsselungen benutzen, soweit im System vorhanden:
CRYPT_STD_DES - Standard DES-Schlüssel mit 2-Zeichen-Salt
CRYPT_EXT_DES - Erweiterte DES-basierte Verschlüsselung mit einem 9-Zeichen-Salt
CRYPT_MD5 - MD5-Verschlüsselung mit 12-Zeichen-Salt, beginnend mit $1$
CRYPT_BLOWFISH - Blowfish-Verschlüsselung mit 16-Zeichen-Salt, beginnend mit $2$ oder $2a$
 
PHP:
if (crypt($benutzer_eingabe, $passwort) == $passwort)

also muss man ziemlich aufpassen, dass man zum vergleich mit dem richtigen passwort als basis der verschlüsselung der benutzereingabe nimmt, da es sonst nicht stimmt, oda?

weil eigentlich (würde ich zumindest denken) würde es doch reichen einfach crypt($nutzereingabe) mit dem schon verschlüsselten wert aus der DB zu vergleichen.
verstehe nicht ganz für was man hier die basis $passwort (was ja wahrscheinlich aus der DB kommen soll) nehmen soll...
 
rtfm.
Es wird kein statisches Salt benutzt, somit weiß man also auch nicht, mit welchem Salt man die Nutzereingabe verschlüsseln soll. Ein Vergleich ohne das Salt zu kennen ist unmöglich, da die Verschlüsselung der Nutzereingabe ohne angegebenes Salt immer mit einem Random-Salt geschieht und somit immer zu einem anderen Ergebnis führt.
Da das Salt immer auf die benötigte Länge abgeschnitten wird und das (verschlüsselte) Passwort in der Datenbank immer mit dem Salt beginnt, übergibt man der Funktion crypt an zweiter Stelle somit nicht wirklich das Passwort aus der DB, sondern lediglich das benötigte Salt, um die Nutzereingabe verschlüsseln und anschließend vergleichen zu können.
 
... wow gar net so einfach zu verstehen^^

und wo speicher ich das benötigte salt?? auch in der datenbank odda??
und wie trag ich dort das salt dann ein?(beim anmelden wahrscheinlich, aber wie muss ich des machen)

wär schön wenn mir einer mal das ganze mit beispielwerten zeigen könnte (und am besten angeben woher die werte kommen bzw. wenn aus datenbank wie sie hergestellt worden sind)!

denn ich würde jetz nach der erklärung das ganze wie folgt denken:
PHP:
$_POST['password']=Test; //aus formular
$right_password=Hallo; //aus datenbank ausgelesen
//Woher bekomm ich jetzt bitte das in meinem beispiel benutzte 43656767??


if (crypt($_POST['password'], 43656767) == $right_password
 
Okay, ganz langsam.

Neuen Benutzer anlegen:

PHP:
$benutzername_aus_formular
$pw_crypted = crypt($passwort_aus_formular)
Diese beiden Werte schreibst du jetzt in deine Datenbank, z.B.:
max.mustermann, $1$oLa7.3xA$XIehGfT7TBwbIjrFLpcl91

Der hintere String ist das verschlüsselte Passwort inkl. Salt:
Salt: $1$oLa7.3xA$, PW: XIehGfT7TBwbIjrFLpcl91

crypt() gibt beides zusammen zurück, das Salt ist random-generiert.

Das steht jetzt beides in der Datenbank, ein mal der User und ein mal ein String bestehend aus Salt und PW.

Jetzt bekommst du aus einem Login-Formular die Daten übergeben und suchst den entsprechenden Eintrag in der DB.
Du übergibst der Funktion crypt das vom Benutzer eingebene Passwort und als Salt den String aus der DB. Da das Salt aber nur eine bestimmte Länge haben darf (in diesem Fall 12 Zeichen, da MD5) wird das Passwort an sich, das in dem String in der DB hinter dem Salt steht weggeschnitten. Somit wird das vom Benutzer eingegebene Passwort mit dem gleichen Salt verschlüsselt wie einst das Passwort bei der Erstellung. Jetzt kannst du das Ergebnis von crypt() mit dem kompletten String aus der DB vergleichen.
z.B.:
PHP:
try {
	$db = new PDO('mysql:host='.$db_server.';dbname='.$db_database, $db_login, $db_password, array(PDO::ATTR_PERSISTENT => true));
} catch (PDOException $e) {
	die("Error!: " . $e->getMessage());
}

if ( isset($_POST['user']) && isset($_POST['password']) ) {
	$user = $_POST['user'];
	$password = $_POST['password'];
	$stmt = $db->prepare("SELECT * FROM `benutzer` WHERE user = :user LIMIT 1");
	$stmt->bindParam(':user', $user);
	$stmt->execute();
	$result = $stmt->fetch(PDO::FETCH_ASSOC);
	if ( $result != FALSE) {
		if ( crypt($password, $result['password']) == $result['password'] ) {
			/*
			 * Hier ist der User korrekt eingeloggt.
			 * Man könnte z.B. eine Session-Variable oder
			 * ein Cookie setzen oder etwas ausgeben oder was auch immer.
			 */
		}
	}
	$stmt->closeCursor();
}
 
ah ok jetz versteh ichs!
Danke!
War mir nicht klar, dass das Salt dann mit in der DB (automatisch vor der eigentlichen verschlüsselung) gespeichert wird.
 
Zurück
Oben