In PHP ist Crypt () eine Funktion für die Hash -Verschlüsselung, die in Szenarien der Kennwortverarbeitung und der Datenverschlüsselung häufig verwendet wird. Viele Entwickler sind jedoch überrascht, dass beim Verschlüsseln des gleichen Inhalts mithilfe der Crypt () -Funktion:
Dieser Artikel wird Sie in ein tiefes Verständnis der Gründe für dieses Phänomen führen und Ihnen beibringen, wie Sie Crypt () richtig und sicher verwenden.
Die Essenz von Crypt () ist eine Hash -Funktion, die nicht zum Verschlüsseln von Daten bestimmt ist, sondern irreversible Hash -Werte, die häufig zur Kennwortüberprüfung verwendet werden.
Der Funktionsprototyp lautet wie folgt:
string crypt(string $string, string $salt)
Es empfängt zwei Parameter:
$ String : Der String, der verschlüsselt wird.
$ salt : Der "Salzwert", der während der Verschlüsselung verwendet wird und das Hashing -Ergebnis beeinflusst.
Wenn Sie das gleiche $ salt bestehen, wird das Verschlüsseln der gleichen $ -Skette natürlich das gleiche Ergebnis erzielen. Genau deshalb sehen Sie, dass "Verschlüsselungsergebnisse immer gleich sind".
Dies liegt daran, dass Sie, wenn Sie Crypt () anrufen, möglicherweise einen festen Salzwert verwendet oder einfach den zweiten Parameter $ Salz übergeben haben.
PHPs Crypt () versucht, einige System -Standardmechanismen zu verwenden, wenn kein $ Salz bereitgestellt wird, aber dieser Mechanismus kann als "standardmäßig das gleiche Salz verwenden" auf einigen Systemen erscheinen, was zu "Die gleiche Eingabe erhält immer die gleiche Ausgabe".
Schauen Sie sich das folgende Beispiel an:
echo crypt("mypassword", "m6"); // Verwenden Sie fest salt
Jedes Mal, wenn ich diesen Code ausführe, ist die Ausgabe dieselbe, egal wie oft er ist. Dies bedeutet, dass ein Angreifer weiß, dass Sie ein festes Salz verwenden, er auch die Hash-Tabelle vorab kalkulieren kann, um Ihr System anzugreifen.
** Der richtige Weg ist: Verwenden Sie zufällige Salzwerte. ** Jedes Mal, wenn ein Passwort -Hash für den Benutzer generiert wird, wird in der Datenbank ein separates Salz generiert und gespeichert. Auf diese Weise sind die Hash -Werte, selbst wenn die Passwörter von zwei Benutzern gleich sind, unterschiedlich.
PHP empfiehlt die Verwendung einer Methode mit automatischer Salzgenerierung, z .
$password = 'mypassword';
$hash = password_hash($password, PASSWORD_BCRYPT);
Diese Funktion erzeugt automatisch ein einzigartiges Salz für Sie und befestigt es an das Ergebnis. Jeder Lauf erhält unterschiedliche Ergebnisse:
// Jeder Ausgang ist anders
$hash1 = password_hash('mypassword', PASSWORD_BCRYPT);
$hash2 = password_hash('mypassword', PASSWORD_BCRYPT);
Sie können jedoch weiterhin verwendet werden, um das Originalkennwort über Passwort_verify () zu überprüfen.
Wenn Sie Crypt () verwenden müssen, erzeugen Sie manuell zufälliges Salz. Hier ist ein Beispiel:
function generate_salt($length = 22) {
return substr(strtr(base64_encode(random_bytes($length)), '+', '.'), 0, $length);
}
$password = 'mypassword';
$salt = '$2y$10$' . generate_salt(); // verwenden Blowfish Algorithmus
$hash = crypt($password, $salt);
Jeder Anruf erzeugt ein anderes Salz, und natürlich werden unterschiedliche Verschlüsselungsergebnisse generiert.
Die verschlüsselten Ergebnisse sollten zur späteren Überprüfung in der Datenbank gespeichert werden. Der Beispielcode lautet wie folgt:
// Beim Speicher
$hash = crypt($password, $salt);
// Speichern in der Datenbank
// Während der Überprüfung
if (hash_equals($hash, crypt($inputPassword, $hash))) {
echo "Richtiges Passwort";
} else {
echo "Fehlerkennwort";
}
Beachten Sie, dass der zweite Parameter von Crypt () direkt in den verschlüsselten Hash -Wert übergeben werden kann, und PHP extrahiert automatisch das Salz daraus.
Crypt () gibt das gleiche Ergebnis zurück, da Sie dasselbe Salz verwendet haben.
Um sicher zu sein, sollten Sie zufälliges Salz verwenden oder direkt verwenden.
Es wird nicht empfohlen, Crypt () in neuen Projekten weiter zu verwenden, es sei denn, es gibt eine besondere Anforderung.
Vermeiden Sie immer hartcodierte Salze, um Regenbogentischangriffe zu verhindern.
Bei der Entwicklung eines Systems mit Benutzerkennwortverarbeitung hat die Sicherheit immer oberste Priorität. Das korrekte Verständnis des Verhaltens von Crypt () hilft Ihnen, ein stabileres und zuverlässigeres Anwendungssystem aufzubauen.