In der modernen Entwicklung der Webanwendungen ist der sichere Speicher von Benutzerkennwörtern von entscheidender Bedeutung. Die integrierte Crypt () -Funktion von PHP unterstützt eine Vielzahl von Verschlüsselungsalgorithmen, einschließlich des Blowfish-Verschlüsselungsalgorithmus. Der Blowfish -Algorithmus wird für seine hohe Intensität und anpassbare Arbeitsfaktoren (Kosten) häufig verwendet. In diesem Artikel wird detailliert vorgestellt, wie PHPs Crypt () -Funktion verwendet werden, um Kennwörter mit dem Blowfish -Algorithmus sicher zu verschlüsseln (Identifier $ 2y $ ).
Blowfish ist ein symmetrischer Schlüsselverschlüsselungsalgorithmus, das speziell für ältere Verschlüsselungsalgorithmen entwickelt wurde. Für das Passworthashing bietet Blowfish gute, brütungssichere Crack-Funktionen mit seinem einstellbaren "Arbeitsfaktor". Je höher der Arbeitsfaktor, desto länger dauert es zur Berechnung der Verschlüsselung, wodurch die Sicherheit der Kennwort verbessert wird.
Die Crypt () -Funktion von PHP verwendet die $ 2y $ -Kennung, um das Blowfish -Hash -Format darzustellen, bei dem es sich um ein für PHP 5.3.7 und höher empfohlener Format handelt, das Sicherheitsprobleme in früheren Versionen vermeiden kann.
Das Salz des Blowfish-Algorithmus ist eine 22-Charakter-Schnur, die AZ , AZ , 0-9 , . / Insgesamt 64 Zeichen. Das Salzformat, das von PHPs Crypt () erforderlich ist, lautet wie folgt:
$2y$ + Zwei Arbeitsfaktoren(cost) + $ + 22 etwas Salz
Zum Beispiel:
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
Hier ist 12 der Arbeitsfaktor, der 2^12 Hash -Berechnungen darstellt, was etwa 4096 Mal ist und nicht zu langsam ist.
$password = 'your_password_here';
$hash = crypt($password, $salt);
Der zurückgegebene $ Hash ist eine vollständige Blowfish -Hash -Schnur, die direkt in die Datenbank gespeichert werden kann.
Verwenden Sie beim Überprüfen des Passworts den ursprünglichen Hash als Salz, um Crypt () aufzurufen und die Ergebnisse zu vergleichen:
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
<?php
// Safes Salz erzeugen
function generate_blowfish_salt($cost = 12) {
if ($cost < 4 || $cost > 31) {
throw new InvalidArgumentException("Der Arbeitsfaktor muss sein4ankommen31zwischen");
}
$randomBytes = random_bytes(16);
$base64Salt = substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 22);
return sprintf('$2y$%02d$%s', $cost, $base64Salt);
}
// Verschlüsselungskennwort
function encrypt_password($password, $cost = 12) {
$salt = generate_blowfish_salt($cost);
return crypt($password, $salt);
}
// Passwort überprüfen
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
// prüfen
$password = 'mypassword123';
$hash = encrypt_password($password);
echo "Passwort Hash: $hash\n";
if (verify_password('mypassword123', $hash)) {
echo "Passwortüberprüfung erfolgreich!\n";
} else {
echo "Passwortüberprüfung fehlgeschlagen!\n";
}
?>
PHP -offizielles Dokument: https://www.m66.net/manual/zh/function.crypt.php