PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Passwort Vergleich crypt()



suse
04-06-2003, 14:17
Hallo,

das ist ein ganz übles Problem.
Die vier Skripte funktionieren sonst einwandfrei... jedoch die Password abfrage die läuft nicht wie sie es eigentlich laufen sollte...

also zuerst soll sich einer Regestrieren "nutzername" und "password" dies beiden informationen werden in einer datenbank abgelegt (das Password wird verschlüsselt abgespeichert)
-> das Funktioniert....

doch jetzt soll sich der gleiche "nutzername" mit dem gleichen "password" auf dieseer Datenbank anmelden. Dieser vergleich des gerade gespeicherten und den eingegeben Passwort funktioniert nicht.... (Der Passwort vergelich findet in der nutzer_pruefen.php Datei statt)

Ich verwende dazu die crypt() Funktion
Aber am besten schaut euch mal denn Code an... (von nutzer_pruefen.php)

Ich würde mich über eine rückantwort freuen.....und wäre sehr dankbar dafür...
Falls ihr noch die anderen drei Scripte braucht werde ich sie reinstellen!
Oder kann ich mehr als nur eine Datei dranhängen?



//nutzer_pruefen.php

<?php

function eingabe_wiederholen($fehlermeldung)
{
printf("%s<br>",$fehlermeldung);
printf("<form action='nutzer_abfrage.php' method='post'>");
printf("<input type='submit' value='Eingabe wiederholen'>");
printf("</form>");
}

if (strlen($nutzername)==0)
{
eingabe_wiederholen("Bitte einen Nutzernamen eingeben");
exit();
}

if (strlen($password)==0)
{
eingabe_wiederholen("Bitte ein Password eingeben");
exit();
}

include("/webserver/php/include/webnutzer_connect.inc");

$ergebnis = mysql_query('use webnutzer');

if ($ergebnis == NULL)
{
printf("use: %s %s",mysql_errno(),mysql_error());
exit();
}

$ergebnis = mysql_query("select * from nutzerdaten");

if($ergebnis == NULL)
{
printf("select * from nutzerdaten: %s %s",mysql_errno(),mysql_error());
exit();
}

$nutzer_existiert = FALSE;

while ($datensatz = mysql_fetch_assoc($ergebnis))
{
if ($datensatz["nutzername"] == $nutzername)
{
$verschluesselt = $datensatz["password"];
$nutzer_existiert = TRUE;
}
}

if ($nutzer_existiert == FALSE)
{
eingabe_wiederholen("Nutzer existeirt nicht");
exit();
}

if($verschluesselt == crypt($password,$verschluesselt))
{
printf("Passwort OK");
}
else
{
printf("Passwort <b>nicht</b> OK");
}

eingabe_wiederholen(" ");

//echo "<center><form action='nutzer_eingabe' method='post'>";
//echo "<input type='submit' value='neue Eingabe'>";
//echo "</form></center>";

?>



und hier noch die nutzer_speichern.php



<?php

function eingabe_wiederholen($fehlermeldung)
{
printf("<form action='nutzer_eingabe.php' method='post'>");
printf("<input type='submit' value='Eingabe wiederholen'>");
printf("</form>");
}

if (strlen($nutzername)==0)
{
eingabe_wiederholen("Bitte einen Nutzernamen eingeben");
exit();
}

if (strlen($password)==0)
{
eingabe_wiederholen("Bitte ein Password eingeben");
exit();
}

include("/webserver/php/include/webnutzer_connect.inc");

$ergebnis = mysql_query('use webnutzer');

if ($ergebnis == NULL)
{
printf("use: %s %s",mysql_errno(),mysql_error());
exit();
}

$ergebnis = mysql_query("select * from nutzerdaten");

if($ergebnis == NULL)
{
printf("select * from nutzerdaten: %s %s",mysql_errno(),mysql_error());
exit();
}

$verschluesselt = crypt($password);

$kommando = "insert into nutzerdaten ";
$kommando .= " (nutzername,password) values";
$kommando .= " ('$nutzername','$verschluesselt')";

$ergebnis = mysql_query($kommando);

if ($ergebnis == 0)
{
printf("insert into nutzerdaten: %s %s",mysql_errno(),mysql_error());
exit();
}

echo "<center><form action='nutzer_eingabe' method='post'>";
echo "<input type='submit' value='neue Eingabe'>";
echo "</form></center>";

?>


gruss
suse

Gaert
04-06-2003, 14:43
Hallo Suse!

Der Fehler steckt in der Tat hier:


while ($datensatz = mysql_fetch_assoc($ergebnis))
{
if ($datensatz["nutzername"] == $nutzername)
{
$verschluesselt = $datensatz["password"];
$nutzer_existiert = TRUE;
}
}

if ($nutzer_existiert == FALSE)
{
eingabe_wiederholen("Nutzer existeirt nicht");
exit();
}

if($verschluesselt == crypt($password,$verschluesselt))
{
printf("Passwort OK");
}
else
{
printf("Passwort <b>nicht</b> OK");
}


Genauer gesagt liegt hier wohl ein Denkfehler vor:
if($verschluesselt == crypt($password,$verschluesselt))

Du verwendest $verschlüsselt als Salt!
--> wirf mal einen Blick ins Manual: http://www.php.net/crypt

Die Lösung:
Verwende crypt mit dem selben Salt wie beim verschlüsseln oder md5() statt crypt - ist ohnehin gebräuchlicher:
if($verschluesselt == md5($password))

Das Passwort in der Datenbank muss dann logischerweise auch mit md5() verschlüsselt sein.

suse
04-06-2003, 15:03
Mit md5() klappt es auch nicht ....

ist das denn nicht richtig ...
wenn ich ..

$verschluesselt = crypt($password);

und dann es vergelichen will

if ($verschluesselt == crypt($password,$verschluesselt))
{
blbal
}

ich benutze kein salt deswegen muss es doch gehen oder...??

Noch was wenn ich salt benutzen würde müsste es doch so lauten .... oder?

$verschluesselt = crypt($password,"XY");

und dann es vergelichen will

if ($verschluesselt == crypt($password,"XY"))
{
blbal
}

gruss
suse

Gaert
04-06-2003, 18:19
Hier hast du einen Ansatz, wie es mit md5 funktioniert....

http://www.devarticles.com/art/1/417/2

phate
04-06-2003, 20:08
Hi mitnander,

also erstma vorneweg, lass Dich nicht verunsichern suse, Deine Verwendung von crypt() war schon korrekt.
Genauer gesagt liegt hier wohl ein Denkfehler vor:
if($verschluesselt == crypt($password,$verschluesselt))

Du verwendest $verschlüsselt als Salt!
--> wirf mal einen Blick ins Manual: http://www.php.net/cryptAlso genauer gesagt liegt hier wohl ein Lesefehler seitens Gaert vor :p

Anhand Deines Skriptes kann ich nun leider auch nicht erkennen, was da falsch läuft aber folgendes was in Kurzform das simuliert, was bei Dir ablaufen soll, funktioniert bei mir einwandfrei.
<?
$password = "password";

$crypted1 = crypt($password);

$crypted2 = crypt($password, $crypted1);

echo "crypted1: $crypted1<BR>\n";
echo "crypted2: $crypted2<BR>\n";

?>Beide $crypted - Variablen haben den selben Inhalt.

Versuch mal bei Dir einige echo() - Ausgaben zum Debuggen mit reinzubringen, also was er z.B. als verschlüsseltes Passwort aus der Datenbank holt, welches Plaintext-Passwort er mit diesem als Salt versucht zu crypten und und und.... Dann ist Deine Chance, zu sehen wo es hängt grösser.

Und das hier
$ergebnis = mysql_query('use webnutzer');
... lässt sich doch über
mysql_select_db()realisieren.

gruss,

phate

suse
04-06-2003, 21:13
Ich bekomme es einfach nicht hin....
Ich weiss zwar was du meinst aber mit der Ausführung klappt es nicht...
Schau dir mal bitte einfach mal alle Skripte an ...
Ich wäre dir wirklich sehr dankbar...

nutzer_speichern.php


<?php

function eingabe_wiederholen($fehlermeldung)
{
printf("<form action='nutzer_eingabe.php' method='post'>");
printf("<input type='submit' value='Eingabe wiederholen'>");
printf("</form>");
}

if (strlen($nutzername)==0)
{
eingabe_wiederholen("Bitte einen Nutzernamen eingeben");
exit();
}

if (strlen($password)==0)
{
eingabe_wiederholen("Bitte ein Password eingeben");
exit();
}

include("/webserver/php/include/webnutzer_connect.inc");

$ergebnis = mysql_query('use webnutzer');

if ($ergebnis == NULL)
{
printf("use: %s %s",mysql_errno(),mysql_error());
exit();
}

$ergebnis = mysql_query("select * from nutzerdaten");

if($ergebnis == NULL)
{
printf("select * from nutzerdaten: %s %s",mysql_errno(),mysql_error());
exit();
}

$verschluesselt = crypt($password);

$kommando = "insert into nutzerdaten ";
$kommando .= " (nutzername,password) values";
$kommando .= " ('$nutzername','$verschluesselt')";

$ergebnis = mysql_query($kommando);

if ($ergebnis == 0)
{
printf("insert into nutzerdaten: %s %s",mysql_errno(),mysql_error());
exit();
}

echo "<center><form action='nutzer_eingabe' method='post'>";
echo "<input type='submit' value='neue Eingabe'>";
echo "</form></center>";

?>


nutzer_pruefen.php


<?php

function eingabe_wiederholen($fehlermeldung)
{
printf("%s<br>",$fehlermeldung);
printf("<form action='nutzer_abfrage.php' method='post'>");
printf("<input type='submit' value='Eingabe wiederholen'>");
printf("</form>");
}

if (strlen($nutzername)==0)
{
eingabe_wiederholen("Bitte einen Nutzernamen eingeben");
exit();
}

if (strlen($password)==0)
{
eingabe_wiederholen("Bitte ein Password eingeben");
exit();
}

include("/webserver/php/include/webnutzer_connect.inc");

$ergebnis = mysql_query('use webnutzer');

if ($ergebnis == NULL)
{
printf("use: %s %s",mysql_errno(),mysql_error());
exit();
}

$ergebnis = mysql_query("select * from nutzerdaten");

if($ergebnis == NULL)
{
printf("select * from nutzerdaten: %s %s",mysql_errno(),mysql_error());
exit();
}

$nutzer_existiert = FALSE;

while ($datensatz = mysql_fetch_assoc($ergebnis))
{
if ($datensatz["nutzername"] == $nutzername)
{
$verschluesselt = $datensatz["password"];
$nutzer_existiert = TRUE;
}
}

if ($nutzer_existiert == FALSE)
{
eingabe_wiederholen("Nutzer existeirt nicht");
exit();
}

if($verschluesselt == crypt($password,$verschluesselt))
{
printf("Passwort OK");
}
else
{
printf("Passwort <b>nicht</b> OK");
}

eingabe_wiederholen(" ");

echo "verschluesselt = $verschluesselt<p>";
echo "verschluesselt1 = $verschluesselt1";
//echo "<center><form action='nutzer_eingabe' method='post'>";
//echo "<input type='submit' value='neue Eingabe'>";
//echo "</form></center>";

?>


nutzer_eingabe.php


<?php

include("/webserver/php/include/webnutzer_connect.inc");

//printf("Verbindung zu MySQL wurde hergestellt<br>");

$ergebnis = mysql_select_db('webnutzer');

if($ergebnis == NULL)
{
printf("use: %s %s",mysql_errno(),mysql_error());
exit();
}

$nutzer = mysql_query("select * from nutzerdaten");

printf("<center><table border =1><tr>");
while($datensatz = mysql_fetch_assoc($nutzer))
{
printf("<tr><td> %s</td><td> %s</td></tr>",$datensatz["nutzername"],$datensatz["password"]);
}
printf("</tr></table></center>");

echo "<center><table border=0>";
echo "<form action='nutzer_speichern.php' method='post'>";
echo "<tr>";
echo "<td>Nutzername:</td><td><input type='text' name='nutzername' maxlength='20'></td>";
echo "</tr>";
echo "<br>";
echo "<tr>";
echo "<td>Password:</td><td> <input type='password' name='password' maxlength='8'></td>";
echo "</tr></table>";
echo "<p>";
echo "<input type='submit' value='Eingabe speichern'>";
echo "<input type='reset' value='Eingabe l&ouml;schen'>";
echo "</form>";
echo "<form action='nutzer_abfrage.php' method='post'>";
echo "<input type='submit' value='Anmelden'>";
echo "</form></center>";

?>


nutzer_abfrage.php


<?php

include("/webserver/php/include/webnutzer_connect.inc");

//printf("Verbindung zu MySQL wurde hergestellt<br>");

$ergebnis = mysql_select_db('webnutzer');

if($ergebnis == NULL)
{
printf("use: %s %s",mysql_errno(),mysql_error());
exit();
}

$nutzer = mysql_query("select * from nutzerdaten");

printf("<center><table border =1><tr>");
while($datensatz = mysql_fetch_assoc($nutzer))
{
printf("<tr><td> %s</td><td> %s</td></tr>",$datensatz["nutzername"],$datensatz["password"]);
}
printf("</tr></table></center>");

echo "<center><table border=0>";
echo "<form action='nutzer_pruefen.php' method='post'>";
echo "<tr>";
echo "<td>Nutzername:</td><td><input type='text' name='nutzername' maxlength='20'></td>";
echo "</tr>";
echo "<br>";
echo "<tr>";
echo "<td>Password:</td><td> <input type='password' name='password' maxlength='8'></td>";
echo "</tr></table>";
echo "<p>";
echo "<input type='submit' value='Anmelden'>";
echo "<input type='reset' value='Eingabe l&ouml;schen'>";
echo "</form>";
echo "<form action='nutzer_eingabe.php' method='post'>";
echo "<input type='submit' value='Registrieren'>";
echo "</form></center>";
?>


Probiere es einfach mal aus wen du Zeit hast...
Ich wäre wirklich gut wenn du mir weiterhelfen könnteset...

gruss
suse

The Ripper
05-06-2003, 12:07
Das da:
$nutzername = $_REQUEST['nutzername'];
$password = $_REQUEST['password']; ganz oben in nutzer_pruefen.php und nutzer_speichern.php und es hat funktioniert ;)

suse
05-06-2003, 14:10
Sorry damit funktioniert nichts...
Keine Anmeldung und die Speicherung auch nicht..

gruss
suse

The Ripper
05-06-2003, 16:48
Vielleicht stimmt was mit deinem Datenbankconnectscript oder mti der Tabellenstruktur nicht, die Fehlerüberprüfung funktioniert so nämlich nicht.

Sämtliche MySQL-Funktionen geben bei einem Fehler nicht NULL, sondern false zurück.

suse
05-06-2003, 17:01
Nein nein...

jetzt läuft alles .... lag an der Datenbanktabelle...
Trotzdem vielen Dank....

gruss
suse