Функция password_hash
Tatsächlich gelten die Funktion md5 und das Salzen
von Passwörtern damit als veraltet.
Wir haben sie studiert, damit Sie den weiteren Stoff
verstehen und weil Sie ihr bei der Arbeit
mit Fremdprojekten begegnen könnten.
Es gibt eine fortschrittlichere Methode, um ein
gesalzenes Passwort zu erhalten. Dafür wird die Funktion
password_hash verwendet. Ihr erster Parameter ist
ein String, der zweite - der Verschlüsselungsalgorithmus
(dazu später mehr), und sie gibt den Hash dieses Strings
zusammen mit dem Salt zurück.
Versuchen Sie, diesen Code mehrmals auszuführen:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
Sie werden jedes Mal ein anderes Ergebnis erhalten, und in diesem Ergebnis wird der erste Teil der Zeichenkette das Salt sein, und der zweite Teil - das gesalzene Passwort.
Angenommen, wir haben einen Hash, der von der Funktion
password_hash erzeugt wurde, und ein beliebiges Passwort.
Um zu überprüfen, ob es sich um den Hash dieses Passworts handelt oder nicht,
sollte die Funktion password_verify verwendet werden.
- ihr erster Parameter ist das Passwort,
der zweite - der Hash, und sie gibt true
oder false zurück.
Sehen wir uns ein Beispiel an:
<?php
$password = '12345'; // Passwort
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // Hash
if (password_verify($password, $hash)) {
// Hash von diesem Passwort
} else {
// Hash nicht von diesem Passwort
}
?>
Was bringt uns das in der Praxis: Wir müssen kein separates Feld in der Datenbank für die Speicherung des Salts anlegen, uns nicht mit der Generierung dieses Salts herumschlagen - PHP erledigt alles für uns!
Das bedeutet, dass wir in der Datenbank im Feld
password das gesalzene
Passwort zusammen mit seinem Salt speichern werden.
Dabei wird das gehashte Passwort eine größere Länge haben.
Daher müssen wir in der Datenbank die Größe
des Passwortfelds anpassen und sie auf 60
Zeichen setzen.
Korrigieren wir nun den Registrierungscode. Hier ist, was wir aktuell haben:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // Länge des Salts
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // Zeichen aus ASCII-Tabelle
}
return $salt;
}
$salt = generateSalt(); // Salt
$password = md5($salt . $_POST['password']); // Passwort in einen gesalzenen Hash umwandeln
?>
Mit password_hash können wir dies auf Folgendes reduzieren:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
Auf ähnliche Weise wird der Autorisierungscode angepasst:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'"; // Benutzer per Login abrufen
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$hash = $user['password']; // gesalzenes Passwort aus der DB
// Überprüfen, ob der Hash aus der Datenbank mit dem eingegebenen Passwort übereinstimmt
if (password_verify($_POST['password'], $hash)) {
// alles ok, autorisieren...
} else {
// Passwort stimmt nicht, Meldung ausgeben
}
} else {
// Benutzer mit diesem Login existiert nicht, Meldung ausgeben
}
?>
Passen Sie Ihre Anmeldung und Registrierung an die neuen gelernten Funktionen an.