Benutze ich die crypt () - Funktion von PHP richtig?
Habe ich mit PHP crypt()
als eine Möglichkeit zum speichern und überprüfen der Passwörter in meiner Datenbank. Ich benutze hashing für andere Dinge, aber crypt()
für Passwörter. Die Dokumentation ist nicht so gut und es scheint eine Menge Diskussion. Ich bin mit blowfish und zwei Salzen zu crypt ein Passwort ein und speichern es in die Datenbank. Bevor ich speichert den salt und das verschlüsselte Passwort (wie ein gesalzener hash), merkte aber an seine redundant, da das Salz ist Teil der verschlüsselten Passwort-string.
Ich bin ein wenig verwirrt, wie rainbow-table-Angriffe funktionieren würde crypt()
jedenfalls schaut das korrekt aus Sicht der Sicherheit. Ich benutze eine zweite Salz-zum Anhängen an das Passwort zur Erhöhung der Entropie kurze Passwörter, wahrscheinlich übertrieben, aber warum nicht?
function crypt_password($password) {
if ($password) {
//find the longest valid salt allowed by server
$max_salt = CRYPT_SALT_LENGTH;
//blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 base 64
$blowfish = '$2a$10$';
//get the longest salt, could set to 22 crypt ignores extra data
$salt = get_salt ( $max_salt );
//get a second salt to strengthen password
$salt2 = get_salt ( 30 ); //set to whatever
//append salt2 data to the password, and crypt using salt, results in a 60 char output
$crypt_pass = crypt ( $password . $salt2, $blowfish . $salt );
//insert crypt pass along with salt2 into database.
$sql = "insert into database....";
return true;
}
}
function get_salt($length) {
$options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$salt = '';
for($i = 0; $i <= $length; $i ++) {
$options = str_shuffle ( $options );
$salt .= $options [rand ( 0, 63 )];
}
return $salt;
}
function verify_password($input_password)
{
if($input_password)
{
//get stored crypt pass,and salt2 from the database
$stored_password = 'somethingfromdatabase';
$stored_salt2 = 'somethingelsefromdatabase';
//compare the crypt of input+stored_salt2 to the stored crypt password
if (crypt($input_password . $stored_salt2, $stored_password) == $stored_password) {
//authenticated
return true;
}
else return false;
}
else return false;
}
InformationsquelleAutor der Frage Brian | 2010-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie wirklich einen Blick auf PHPASS: http://www.openwall.com/phpass/ Es ist ein Kennwort-hashing-framework Verwendung von crypt (), welche in Projekten wie WordPress und phpBB.
Außerdem gibt es einen ausgezeichneten Artikel auf dieser website über Passwort-hashing, Salzen und dehnen mit crypt(): http://www.openwall.com/articles/PHP-Users-Passwords
UPDATE:
Derzeit gibt es eine alternative für die PHPASS Bibliothek. In der nächsten version von PHP gibt es spezielle Funktionen für das hashing und die Verifizierung der Passwörter mit bcrypt): http://www.php.net/manual/en/ref.password.php. Es ist ein Kompatibilitäts-Bibliothek, die diese Funktionen für PHP 5.3.7+: https://github.com/ircmaxell/password_compat
InformationsquelleAutor der Antwort Robert Ros
Ihre Nutzung der
crypt()
ist in Ordnung.crypt($input, $stored) == $stored
ist, wie es ist entworfen, um verwendet werden.Ihre
get_salt()
Funktion ist nicht so toll, da es mit der oft schlechtenrand()
Funktion. Sollten Sie eine stärkere random-Funktion, wieopenssl_random_pseudo_bytes()
statt.InformationsquelleAutor der Antwort caf
Die Idee, eine rainbow-Tabelle ist, die ein Angreifer kann eine Tabelle mit allen möglichen Passworte und deren hashes zu Hause.
E. g.
etc.
Mit dieser Tabelle kann der Angreifer schnell konvertieren Sie beliebige hash zu einem Passwort. Rainbow table verwendet einige tricks, so dass nicht alle hashes gespeichert werden, aber es immer noch berechnet alle hashes vorher.
Durch die Verwendung eines salt, noch bei der Lagerung mit dem Kennwort, Sie machen dies viel schwieriger. Statt hashing jedes Wort in einem Wörterbuch, die Angreifer haben nun die hash-jedes Wort mit jedem Salz. Mit einem lang genug Salz, das gibt genug Kombinationen, um es unmöglich zu berechnen, alle diese hashes.
So ein salt ist nicht dazu gedacht, ein extra Passwort, nur die Anwendung ist gemeint, ändern Sie den hash-Funktion, so dass es nicht dem standard entspricht.
InformationsquelleAutor der Antwort Sjoerd
Dies ist eine missbräuchliche Verwendung von crypt (), weil Sie mit einer veralteten primitiven. Blowfish ist sehr alt, twofish ist der Ersatz, und selbst das ist alt, weil threefish ist fast abgeschlossen. Sie sollten mit einem Mitglied der sha2-Familie, sha256 oder sha512 sind beide eine gute Wahl. crypt() kann verwendet werden, mit sha256 oder sha512 verwenden, sollten Sie die CRYPT_SHA256 CRYPT_SHA512 Parameter jeweils.
Auch Ihre Salze haben eine sehr kleine Entropie/Größe-Verhältnis, Sie sind nur mit einer alphanumerischen set, das ist ein Witz, weil alphanumerischen rainbow-Tabellen sind die häufigsten. Sie sollten mit einem vollen byte, die base256, und ich empfehle, ein Salz, das ist 256 bytes lang. Beachten Sie alle hash-Funktionen sind binäre sicher durch definition also, sollten Sie nicht haben, um sorgen über die null-bytes und dergleichen.
InformationsquelleAutor der Antwort rook
Verwenden SHA-512 (wenn vorhanden) mit einem Salz, die die Zeit() und openssl_random_pseudo_bytes(). Crypt ist konsolidiert /effizient, denn es gibt die Salz eingelegt mit dem Hash-string.
InformationsquelleAutor der Antwort