Hinzufügen von Salt zur Registrierung
Sie wissen also bereits, dass Hashing via
md5 - ein irreversibler Prozess ist und ein Hacker,
der Zugriff auf den Hash erhält, nicht in der Lage sein wird,
aus diesem Hash das Passwort zu erhalten.
Eigentlich ist diese Aussage nicht ganz richtig - heutzutage haben böswillige Hacker Bibliotheken mit Hashes beliebter und weniger beliebter Passwörter erstellt und jeder Dummkopf kann ein Passwort knacken, einfach indem er seinen Hash googelt.
Dies betrifft ausreichend einfache, beliebte Passwörter.
Googeln Sie zum Beispiel den Hash 827ccb0eea8a706c4c34a16891f84e7b
und Sie werden sofort in der Google-Suche sehen, dass es sich um das
Passwort '12345' handelt.
Hashes von ausreichend komplexen Passwörtern kann man auf diese Weise nicht knacken (versuchen Sie es).
Sie könnten fragen, wo dann das Problem liegt - lassen Sie uns alle mit komplexen Passwörtern registrieren. Es gibt jedoch ein Problem - die meisten Benutzer machen sich keine Gedanken über die Sicherheit ihrer Daten und können ausreichend einfache Passwörter eingeben.
Wir könnten bei der Registrierung vorschreiben, dass
längere Passwörter gewählt werden müssen, indem wir zum Beispiel
die Mindestzeichenzahl auf 6
oder 8 beschränken. Dennoch werden
Passwörter wie '123456' oder '12345678' auftauchen.
Man könnte natürlich einen intelligenteren Algorithmus zur Überprüfung der Passwortkomplexität entwickeln, aber es gibt eine andere Lösung.
Der Kern dieser Lösung ist: Passwörter müssen gesalzen werden. Salt (Salz) ist ein spezieller zufälliger String, der beim Registrieren zum Passwort hinzugefügt wird und der Hash wird dann nicht vom einfachen Passworttyp berechnet, sondern vom String Salt+Passwort, also vom gesalzenen Passwort.
Das bedeutet, dass Sie bei der Registrierung etwas wie folgt tun werden:
<?php
$salt = '1sJg3hfdf'; // Salt - komplexer zufälliger String
$password = md5($salt . $_POST['password']); // Passwort in gesalzenen Hash umwandeln
?>
Dabei wird das Salt für jeden Benutzer unterschiedlich sein. Es muss zufällig zum Zeitpunkt der Registrierung generiert werden.
Hier ist eine fertige Funktion, die dies erledigt:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // Länge des Salts
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // Symbol aus der ASCII-Tabelle
}
return $salt;
}
?>
Mit dieser Funktion können wir unseren Code wie folgt umschreiben:
<?php
$salt = generateSalt(); // Salt
$password = md5($salt . $_POST['password']); // gesalzenes Passwort
?>
Ich wiederhole noch einmal, dass dies Änderungen bei der Registrierung waren - in der Datenbank speichern wir nicht einfach den Hash des Passworts, sondern den Hash des gesalzenen Passworts.
Das ist noch nicht alles: In der Tabelle mit den Benutzern müssen neben
den Feldern login und password
noch ein Feld salt angelegt werden, in dem
wir das Salt jedes Benutzers speichern.
Implementieren Sie die oben beschriebene Registrierung mit gesalzenem Passwort.