2016-12-14 3 views
7

ich php crypt Funktion bin mit einem Passwort sicher zu machen, aber wenn ich versuche, und vergleichen Sie ein Passwort für einen ein in der Datenbank eingegeben wird es nicht funktionieren.Ich kann nicht durch ein Passwort aus meiner Datenbank vergleichen, und die ein eingegebene

hier ist mein Code, um das Passwort in erster Linie zu erstellen:

$crypt_password = crypt($_POST['confirm-password']); 

hier ist ich versucht, in einer anderen Funktion, um das Passwort zu vergleichen:

$input_crypt_password = crypt($_POST['input-pw']); 

if ($input_crypt_password == $dbpassword){ 
    // do change password function 
} 

Das funktioniert nicht.

Wenn ich beide Passwörter drucke, sind die Unterschiede.

Warum sind die Passwörter unterschiedlich, obwohl ich das gleiche Passwort eingabe und die crypt-Funktion auf beiden benutze?

Kann mir jemand in die richtige Richtung zeigen?

+3

Bitte lesen Sie die Dokumentation über die von Ihnen verwendete Funktion. Es wird deine Frage beantworten. – arkascha

+1

Kurzreferenz: 'Eine optionale Salzkette, auf der das Hashing basiert. Wenn nicht angegeben, wird das Verhalten durch die Implementierung des Algorithmus definiert und kann zu unerwarteten Ergebnissen führen. " – bansi

+4

Verwenden Sie die sicherere Funktion password_hash() - https://secure.php.net/manual/en/function.password-hash. php –

Antwort

1

Ich weiß nicht, was das zu sagen, wird ausführlicher als addieren, was alle anderen schon gesagt hat ...

also in modernen Hash/unhashing Algorithmen wäre es unsicher sein Passwörter zu speichern Standard-Hashing mit Funktionen (z. B. MD5/SHA256), da diese Art von Eingabe schnell und einfach zu lösen ist.

password_hash() wie in anderen Antworten und Kommentaren verwiesen sollten Sie Ihre # 1 Weg sein, Passwörter sicher zu speichern, da es einen Einweg-Hashalgorithmus verwendet.

You should read this page!

Und dann als Antwort auf Ihre ursprüngliche Frage, verwenden hash_equals() Funktion Passwörter zu vergleichen.

6

Verwenden Sie nicht crypt direkt für Kennwörter.

Wenn Sie PHP 5.5+ haben, dann verwenden Sie die integrierte password_hash-Funktion, andernfalls, wenn Sie PHP 5.3.7+ verwenden Sie die polyfill für diese Funktion.

13

Von the docs

Beispiel # 1 crypt() Beispiele

<?php 
$hashed_password = crypt('mypassword'); // let the salt be automatically generated 

/* You should pass the entire results of crypt() as the salt for comparing a 
    password, to avoid problems when different hashing algorithms are used. (As 
    it says above, standard DES-based password hashing uses a 2-character salt, 
    but MD5-based hashing uses 12.) */ 
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { 
    echo "Password verified!"; 
} 
?> 

Der Code in der Frage wird effektiv einen neuen Hash es jedes Mal erzeugen nennt - das vorhandene Passwort-Hash muss als Salz übergeben werden, um ein konsistentes Ergebnis zu erhalten.

Wie auch in der Dokumentation erwähnt:

Verwendung von password_hash() wird gefördert.

ich weiter gehen würde und sagen, Sie auf jeden Fall password_hash verwenden sollten statt crypt für die Verwendung von Passwörtern Aufruf (PHP> = 5.5 vorausgesetzt); in jedem Fall aber für welche Werkzeuge/Methoden Sie auch immer verwenden - bitte lesen Sie die Dokumentation, um zu wissen, wie Sie sie benutzen.

+0

lernen Sie die gesamten oben genannten Komplikationen für einen minderwertigen nicht empfohlenen Passwort-Algorithmus oder einfach Passwort password_hash wie von Handbuch empfohlen. – bansi

+1

@bansi 'password_hash() ist ein einfacher crypt() - Wrapper und kompatibel mit vorhandenen Passwort-Hashes. Die Verwendung von password_hash() wird empfohlen. Ich würde auch die Verwendung von password_hash empfehlen, aber der Fehler in der Frage ist nicht "die falsche Funktion verwenden", sondern "eine Funktion verwenden, falsch" - oder einfach die Dokumente nicht lesen. – AD7six

2

Versuchen Sie etwas wie das.

$crypt_password = crypt($_POST['confirm-password'],salt); 

$input_crypt_password = crypt($_POST['input-pw'],salt); 

if ($input_crypt_password == $dbpassword){ 
    // do change password function 
    echo "Password match successfully!"; 
} 

Hier salt Parameter, um die Hashing auf Basis. Wenn nicht angegeben, wird das Verhalten durch die Implementierung des Algorithmus definiert und kann zu unerwarteten Ergebnissen führen.

+1

Wahrscheinlich meinen Sie "$ salt", es sei denn, "salt" ist als Konstante definiert ... – Leith

0

Wie viele Leute hier gesagt, sollten Sie password_hash PHP-Funktion verwenden.

Hier können Sie ein einfaches Beispiel sehen, wie es zu benutzen:

<?php 

$password = '123456'; 
$userInput = '123456'; 

$storedHash = password_hash($password, PASSWORD_DEFAULT); 

if (password_verify($userInput, $storedHash)) { 
    echo 'OK'; 
} else { 
    echo 'ERROR'; 
} 

auch wie bereits erwähnt, wenn Sie ältere Version von PHP verwenden, können Sie polyfill installieren.

0

Haben Sie den Eingang vor dem Speichern in db und während des Vergleichs getrimmt? Da die Eingabe vom Browser kommt, kann dies ein Grund sein, warum sie nicht übereinstimmt. ansonsten scheint dies https://stackoverflow.com/a/41141338/1748066 angemessen zu sein.

Verwandte Themen