Start · Sprachen · PHP · Referenz · crypt

crypt

Funktion

Erstellt einen Einweg-Hash eines Strings mithilfe des DES-, MD5-, Blowfish- oder SHA-Algorithmus, abhängig vom angegebenen Salt.

seit PHP 4.0.0 Kategorie: string

Signatur

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

Beschreibung

crypt() erzeugt einen Einweg-Hash (nicht umkehrbaren Hash) eines Strings. Welcher Algorithmus dabei verwendet wird, hängt vom Format des übergebenen $salt-Parameters ab. Die Funktion unterstützt verschiedene Algorithmen wie Standard-DES, Extended-DES, MD5, Blowfish sowie SHA-256 und SHA-512.

Das Salt bestimmt dabei nicht nur den Algorithmus, sondern auch den verwendeten Rundenfaktor (bei bcrypt oder SHA). So ermöglicht beispielsweise das Blowfish-Salt-Präfix $2y$ die Angabe einer Kosten-Zahl, welche die Berechnungsdauer und damit die Sicherheit beeinflusst. Höhere Kostenwerte erschweren Brute-Force-Angriffe erheblich.

Für die meisten modernen Anwendungsfälle empfiehlt PHP die Verwendung von password_hash() und password_verify(), die intern bcrypt oder argon2 verwenden und deutlich einfacher sicher zu benutzen sind. crypt() sollte nur dann direkt verwendet werden, wenn eine direkte Kontrolle über das Salt oder den Algorithmus erforderlich ist oder Legacy-Code damit arbeitet.

Beim Vergleich von Hashes sollte unbedingt hash_equals() statt dem ==-Operator genutzt werden, um Timing-Angriffe zu vermeiden.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der zu hashende Klartext-String.
$salt Pflicht string Das Salt bestimmt den Algorithmus und beeinflusst das Ergebnis. Das Format des Salts legt den genutzten Hash-Algorithmus fest, z. B. $2y$10$... für bcrypt (Blowfish) oder $5$... für SHA-256. Wird kein Salt angegeben, verhält sich die Funktion undefiniert – in PHP 8.0 ist ein fehlendes Salt eine veraltete Nutzung und erzeugt einen Fehler.

Rückgabewert

Typ
string
Beschreibung
Gibt den gehashten String zurück. Das Format des Rückgabewerts hängt vom verwendeten Algorithmus ab. Bei ungültigem Salt oder einem Fehler wird ein String zurückgegeben, der kürzer als 13 Zeichen ist – dieser kann zur Fehlererkennung geprüft werden.

Beispiele

Passwort-Hashing mit bcrypt (Blowfish)

<?php
// Sicheres bcrypt-Salt erzeugen und Passwort hashen
$password = 'geheimesPasswort123';
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);

$hash = crypt($password, $salt);
echo $hash;

// Verifikation: timing-sicher mit hash_equals()
$eingabe = 'geheimesPasswort123';
if (hash_equals($hash, crypt($eingabe, $hash))) {
    echo PHP_EOL . 'Passwort korrekt!';
} else {
    echo PHP_EOL . 'Falsches Passwort.';
}
$2y$12$[generierter-hash] Passwort korrekt!

Hashing mit SHA-512 und Rundenfaktor

<?php
// SHA-512 mit 10000 Runden
$password = 'meinPasswort';
$salt = '$6$rounds=10000$' . substr(strtr(base64_encode(random_bytes(12)), '+', '.'), 0, 16);

$hash = crypt($password, $salt);
echo $hash . PHP_EOL;

// Prüfen ob Salt gültig war (Rückgabe mind. 13 Zeichen)
if (strlen($hash) >= 13) {
    echo 'Hash erfolgreich erzeugt.' . PHP_EOL;
} else {
    echo 'Fehler beim Erzeugen des Hashes.' . PHP_EOL;
}
$6$rounds=10000$[generierter-hash] Hash erfolgreich erzeugt.

Moderner Ersatz: password_hash und password_verify

<?php
// Empfohlene Alternative zu crypt() in modernem PHP
$password = 'meinSicheresPasswort';
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

echo $hash . PHP_EOL;

if (password_verify($password, $hash)) {
    echo 'Passwort korrekt!';
} else {
    echo 'Falsches Passwort.';
}
$2y$12$[generierter-hash] Passwort korrekt!

// Wichtig · Fallstricke

Sicherheitshinweis: Die Verwendung von crypt() ohne korrektes Salt oder mit schwachen Algorithmen (wie Standard-DES oder MD5) ist nicht sicher für die Passwortspeicherung. Verwende immer Blowfish ($2y$) oder SHA-512 ($6$) mit einem ausreichend hohen Kostenfaktor bzw. Rundenzahl.

Timing-Angriffe: Niemals == oder === zum Vergleich von Hashes verwenden. Stattdessen immer hash_equals() nutzen, um konstante Vergleichszeiten zu gewährleisten.

Deprecation: Ab PHP 8.0 ist das Weglassen des $salt-Parameters als veraltet markiert und erzeugt einen E_NOTICE. Das Verhalten ohne Salt ist plattformabhängig und sollte vermieden werden.

Empfehlung: Für neue Projekte sollte password_hash() und password_verify() bevorzugt werden, da diese Funktionen das Salt automatisch und sicher verwalten.