W3docs

crypt()

Die Funktion crypt() führt eine Einweg-Verschlüsselung eines Strings durch. Syntax, Salt-Formate, Algorithmen und Passwortprüfung werden erklärt.

Die PHP-Funktion crypt() führt ein Einweg-Hashing eines Strings durch. „Einweg" bedeutet: Ein Passwort lässt sich in einen Hash umwandeln, aber nicht zurück in das ursprüngliche Passwort — genau das ist gewünscht, wenn Passwörter gespeichert werden sollen. Diese Seite erläutert die Syntax, die Salt-Formate zur Auswahl des Hashing-Algorithmus, die Verifikation eines gespeicherten Hashes und warum moderner Code stattdessen password_hash() bevorzugen sollte.

Syntax

crypt(string $string, string $salt = ""): string

Die Funktion erwartet zwei Parameter:

  • $string — der Eingabe-Text, der gehasht werden soll.
  • $salt — ein string, der den Hashing-Algorithmus auswählt und zufällige Bytes liefert, damit identische Passwörter zu unterschiedlichen Hash-Werten führen. Der Salt ist optional, aber das Weglassen ist unsicher (seit PHP 8.0 wird eine Warnung ausgegeben): Übergeben Sie immer einen expliziten Salt.

Der Rückgabewert ist der gehashte string. Die ersten Zeichen des Ergebnisses kodieren Salt und Algorithmus — der Hash ist damit selbstbeschreibend. Er kann direkt gespeichert werden, und crypt() weiß später, wie er reproduziert werden kann.

Ein einfaches Beispiel

php— editable, runs on the server

Hier übergeben wir einen string und einen Salt an crypt(), und die Funktion gibt den Hash zurück. Mit dem Salt "ab" ist die Ausgabe der Standard-DES-Hash:

abJnggxhB/yWI

Beachten Sie, dass die ersten beiden Zeichen der Ausgabe (ab) dem Salt entsprechen — so merkt sich crypt(), welcher Algorithmus und welcher Salt den Hash erzeugt haben.

Salt-Formate und Algorithmen

Die Form des Salts teilt crypt() mit, welcher Algorithmus verwendet werden soll. Das ist das Wichtigste, was man über diese Funktion verstehen muss:

Salt-PräfixAlgorithmusHinweise
(2 Zeichen, kein $)DESVeraltet, schwach — nur die ersten 8 Zeichen des Passworts werden berücksichtigt. Vermeiden.
$1$MD5Alt; nicht für neue Passwörter verwenden.
$5$SHA-256
$6$SHA-512Stark; unterstützt einen rounds=-Kostenfaktor.
$2y$Blowfish (bcrypt)Der empfohlene Algorithmus für crypt(). Format: $2y$<cost>$<22-char salt>.

Ein bcrypt-Beispiel mit einem expliziten Kostenfaktor von 10:

<?php
$hash = crypt("password123", '$2y$10$usesomesillystringforsalt$');
echo $hash;
?>

Die Ausgabe beginnt mit $2y$10$ und zeichnet Algorithmus und Kostenfaktor auf, damit der Hash später verifiziert werden kann:

$2y$10$usesomesillystringforeSNzFqnuq1h/v0NITsGcb4b3qwzSfNIa

Ein Passwort verifizieren

Um ein Passwort gegen einen gespeicherten Hash zu prüfen, wird der Kandidat mit dem gespeicherten Hash als Salt gehasht. crypt() liest Algorithmus und Salt aus diesem Hash heraus und reproduziert so automatisch dieselben Parameter:

php— editable, runs on the server

Ausgabe:

Password is valid!

Verwenden Sie für den Vergleich hash_equals() statt == — die Funktion läuft in konstanter Zeit und verhindert Timing-Angriffe, die Informationen über den Hash preisgeben könnten.

Wann verwenden (und was stattdessen nutzen)

crypt() ist ein Low-Level-Werkzeug aus älteren Zeiten. Es ist leicht zu missbrauchen: Ein zu kurzer Salt, ein falsches Präfix oder das veraltete DES-Format erzeugen schwache Hashes. Für neuen Code sollten die höherwertigen Hilfsfunktionen bevorzugt werden, die crypt() intern verwenden und Salt-Generierung sowie Algorithmusauswahl für Sie übernehmen:

<?php
$hash = password_hash("password123", PASSWORD_DEFAULT);   // generates a strong bcrypt hash + random salt

if (password_verify("password123", $hash)) {
    echo "Password is valid!";
}
?>

password_hash() und password_verify() sind die empfohlene Methode zum Speichern und Prüfen von Passwörtern in modernem PHP. Greifen Sie auf crypt() nur dann zurück, wenn Sie mit einem bestehenden System interagieren müssen, das bereits Hashes im crypt()-Format speichert.

Für einfaches, nicht passwortbezogenes Hashing (Prüfsummen, Cache-Schlüssel, ETags) lesen Sie die Funktionen md5() und sha1() — beachten Sie, dass diese nicht für Passwörter geeignet sind. Weitere String-Hilfsmittel finden Sie in der Referenz für PHP String-Funktionen.

Übungen

Übung
Was ist der Hauptzweck der Funktion crypt() in PHP?
Was ist der Hauptzweck der Funktion crypt() in PHP?
Was this page helpful?