In PHP wird die Crypt () -Funktion häufig zum Verschlüsseln von Kennwörtern verwendet. Es kann eine Vielzahl von Hashing-Algorithmen wie Standard DES, MD5, SHA-256 und SHA-512 unterstützen, und sein Verhalten hängt vom eingehenden "Salzwert" ab. Der Salzwert erhöht nicht nur die Komplexität des Kennworts, sondern bestimmt auch die Methode und das Ergebnis von Hashing. Sobald der Salzwert falsch ist, kann der Benutzer die Überprüfung nicht übergeben, wenn der Benutzer das richtige Originalkennwort eingibt.
Die grundlegende Syntax von Crypt () lautet wie folgt:
$hashed_password = crypt('Originalkennwort', 'Salzwert');
Während der Überprüfung wird das vom Benutzer eingegebene Kennwort normalerweise mit dem zuvor gespeicherten Hash als Salzwert neu verhandelt:
if (crypt($input_password, $stored_hash) === $stored_hash) {
// Richtiges Passwort
}
Beachten Sie, dass der entscheidende Punkt hier lautet: Der Hash selbst wird als Teil des Salzwerts übergeben, um sicherzustellen, dass die Verwendung vollständig konsistenter Algorithmen und Salzwerte verwendet wird.
Es gibt zwei Hauptfunktionen des Salzwerts:
Rainbow Table Attack verhindern: Auch wenn zwei Benutzer dasselbe Passwort verwenden, unterscheiden sich die Hash -Ergebnisse nach dem Hinzufügen unterschiedlicher Salzwerte.
Sagen Sie Crypt (), welcher Verschlüsselungsalgorithmus und seine Parameter verwendet werden.
Beispielsweise gibt der folgende Salzwert die Verwendung des SHA-512-Algorithmus an und iteriert 5000 Mal:
$salt = '$6$rounds=5000$usesomesillystringforsalt$';
Wenn Sie versuchen, das gleiche Passwort mit unterschiedlichen Salzwerten erneut zu entschlüsseln (auch wenn nur einer unterschiedlich ist), sind die Ergebnisse völlig unterschiedlich. Dies ist genau das Merkmal der Hash -Funktion: Eine leichte Änderung führt zu einem großen Unterschied in den Ausgangsergebnissen .
Stellen Sie sich ein Szenario vor:
$original_hash = crypt('mySecretPassword', '$6$rounds=5000$m66.net$');
Wenn sich der Benutzer erneut anmeldet, überprüft das Programm wie folgt:
if (crypt('mySecretPassword', '$6$rounds=5000$wrongdomain.com$') === $original_hash) {
echo 'Richtiges Passwort';
} else {
echo 'Fehlerkennwort';
}
Obwohl der Benutzer das richtige Kennwort eingegeben hat, erzeugt Crypt () aufgrund unterschiedlicher Salzwerte einen völlig anderen Hash, was zu einer Verifizierung führt.
Es ist, als ob Sie dasselbe Rezept (Passwort) verwenden, aber die Verwendung verschiedener Zutaten (Salz) ist das Schalen (Hash), das endet, von Natur aus unterschiedlich.
Falsche Praxis:
Generieren Sie jedes Mal, wenn Sie ihn überprüfen, einen neuen zufälligen Salzwert.
Der ursprüngliche Hash -Wert wird nicht als Salzwert während der Überprüfung verwendet.
Manuell abgeschnitten oder ändern gespeicherte Hash -Werte.
Richtige Möglichkeit, dies zu tun:
Verwenden von APIs auf hoher Ebene wie password_hash () und password_verify () verwalten sie automatisch Salzwerte und Algorithmen.
Wenn Sie Crypt () verwenden, wird der ursprüngliche Hash immer als Salzwert beim Validieren verwendet.