Aktueller Standort: Startseite> Neueste Artikel> Wie kann ich die Crypt () -Funktion von PHP richtig verwenden, um Regenbogentischangriffe zu verhindern?

Wie kann ich die Crypt () -Funktion von PHP richtig verwenden, um Regenbogentischangriffe zu verhindern?

M66 2025-07-10

In der modernen Webentwicklung ist sicherer Speicher von Benutzerkennwörtern eine kritische Aufgabe. Rainbow Table Attack ist eine gängige Passwort-Cracking-Technik, die sich auf vorbereitete Hash-Tabellen stützt, die schnell mit den Originalkennwörtern übereinstimmen. Um gegen diesen Angriff effektiv zu verteidigen, müssen wir dem Passwort -Hash "Salz" hinzufügen. Die Crypt () -Funktion von PHP ist ein Werkzeug, das diese Herausforderung gut behandeln kann, jedoch nur, wenn sie korrekt verwendet wird.

1. Einführung in die KryPT () -Funktion

PHPs Crypt () -Funktion wird verwendet, um Strings in Einweg zu verschlüsseln und häufig für das Hashing von Passwort. Es unterstützt eine Vielzahl von Verschlüsselungsalgorithmen, darunter traditionelle DES, MD5 und die sichereren Blowfish ( $ 2y $ ) und SHA-256 /512 ( $ 5 $ / 6 $ ).

Der Funktionsprototyp lautet wie folgt:

 string crypt(string $string, string $salt);

Wenn $ String die ursprüngliche Zeichenfolge ist, die verschlüsselt wird, bestimmt $ salz, welchen Algorithmus und die Verschlüsselungsvariante.

2. Warum kann Crypt () Regenbogentischangriffe verhindern?

Der Regenbogentischangriff basiert auf der Vorbereitung der Hash-Werte. Wenn der Salzwert jedes Hash jedoch unterschiedlich ist, kann der Angreifer die gemeinsame Regenbogentabelle nicht zum Matching verwenden. Mit Crypt () können wir den Salzwert anpassen und in Kombination mit starken Verschlüsselungsalgorithmen können wir diesen Angriff effektiv vermeiden.

Zum Beispiel können wir den Blowfish -Algorithmus und die dynamischen Salzwerte wie diese verwenden:

 $password = 'user-password';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);

Im obigen Code:

  • $ 2y $ 10 $ bedeutet die Verwendung des Blowfish -Algorithmus mit einem Kostenfaktor von 10;

  • Random_Bytes (16) erzeugt Zufallssalze mit hoher Intensität;

  • Substr (..., 0, 22) wird in eine Länge geschnitten, die dem Blasfish -Salzformat entspricht.

Der auf diese Weise generierte $ hash ist der Passwort -Hash nach dem Hinzufügen von Salz.

3.. Wie man Crypt () verwendet

Wenn sich der Benutzer anmeldet, müssen wir das Salz nicht wieder manuell erzeugen, sondern es direkt in Crypt () übergeben, wobei der in der Datenbank gespeicherte Hash als Salzparameter gespeichert ist:

 $inputPassword = 'user-input';
$storedHash = '$2y$10$qzWRzYy5q3DvYbEC0KMX4O0PGWlOQxkz7v0QF5OwMqpyG0TzjSAGK'; // Aus der Datenbank

if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
    echo 'Richtiges Passwort';
} else {
    echo 'Fehlerkennwort';
}

Auf diese Weise wird CryPT () das Passwort automatisch mithilfe des Salz- und Algorithmus im Hash neu entschlüsselt und dann vergleichen. Diese Methode ist einfach und sicher.

4. Nicht empfohlene Praktiken und Fallstricke

Verwenden Sie feste Salzwerte

 $hash = crypt($password, 'fixedsalt');

Diese Methode ist äußerst anfällig für Regenbogentabellenangriffe, da dasselbe Passwort immer demselben Hash entspricht.

Verwenden Sie alte Algorithmen (wie Des)

 $hash = crypt($password, 'ab'); // DES Algorithmus,Zu kurzes Salz

DES ist nicht nur kurz in Salz, sondern verfügt auch über niedrige Rechenkosten, und moderne Hardware kann leicht brutaler Riss.

5. Weitere Vorschläge

Obwohl CryPT () sicher ist, empfiehlt PHP die Verwendung von Password_hash () und Password_verify (), einer moderneren API mit Passwort -Hashing -API ab 5.5. Wenn Sie jedoch ein altes Projekt aufrechterhalten oder aus Kompatibilitätsgründen dennoch Crypt () verwenden, stellen Sie sicher, dass Sie Folgendes durchführen:

  • Verwenden Sie starke Algorithmen (z. B. $ 2y $ , $ 5 $ , $ 6 $ );

  • Verwenden Sie immer zufällig und lang genug Salzwerte;

  • Niemals Salz wiederverwenden;

  • Salzwerte sollten im Hash gespeichert werden, anstatt separat gespeichert zu werden.

6. Beispiel: Vollständige Registrierung und Anmeldungsprozess

 // Bei der Registrierung
$password = $_POST['password'];
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
// Lagerung $hash Gehen Sie zur Datenbank

// Beim Anmelden
$inputPassword = $_POST['password'];
$storedHash = getHashFromDatabase(); // Holen Sie sich aus der Datenbank

if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
    echo 'Erfolgreich anmelden';
} else {
    echo 'Fehlerkennwort';
}

Sie können auf https://m66.net/php-Crypt-guide zugreifen, um die Online-Version dieses Tutorials mit weiteren Beispielen zu erhalten.

Abschluss

Die korrekte Verwendung der Krypta () -Funktion kann regenbogener Tischangriffe effektiv verhindern. Der Schlüssel besteht darin, starke Verschlüsselungsalgorithmen, zufällige Salzwerte und Sicherheitspraktiken beim Vergleich zu verwenden. Obwohl das neue Projekt empfiehlt, die Funktionsreihe password_hash () zu verwenden, ist das Beherrschen der sicheren Verwendung von Crypt () auch für jeden PHP -Entwickler ein obligatorischer Kurs.