Start · Sprachen · PHP · Referenz · crypt_gensalt

crypt_gensalt

Funktion

Erzeugt einen zufälligen Salt-String zur Verwendung als zweites Argument für <code>crypt()</code>.

Kategorie: misc

Signatur

crypt_gensalt(string $prefix = '', int $count = 0): string

Beschreibung

crypt_gensalt() generiert einen zufälligen Salt-String, der als zweites Argument an die Funktion crypt() übergeben werden kann. Die Funktion ist Teil der libxcrypt-Bibliothek und steht in PHP nur dann zur Verfügung, wenn die PHP-Installation mit entsprechender Unterstützung kompiliert wurde.

Der Parameter prefix bestimmt das verwendete Hashing-Verfahren. Typische Prefixe sind $2b$ für bcrypt, $5$ für SHA-256-crypt und $6$ für SHA-512-crypt. Wird kein Prefix angegeben, wählt die Bibliothek das stärkste verfügbare Verfahren automatisch aus.

Der Parameter count steuert den Rechenaufwand (Work Factor) des Hash-Algorithmus. Ein höherer Wert erhöht die Berechnungszeit und damit den Schutz gegen Brute-Force-Angriffe, verlangsamt aber gleichzeitig legitime Authentifizierungsvorgänge. Der Wert 0 überlässt die Wahl dem jeweiligen Algorithmus-Standard.

In modernen PHP-Anwendungen empfiehlt sich jedoch die Verwendung von password_hash() und password_verify(), da diese eine einfachere und sicherere API bieten. crypt_gensalt() ist besonders dann nützlich, wenn eine feingranulare Kontrolle über den Salt und das Hashing-Verfahren benötigt wird oder Legacy-Code mit crypt() weiterentwickelt werden muss.

Parameter

Name Typ Default Beschreibung
$prefix string '' Algorithmus-Prefix, der das Hashing-Verfahren bestimmt. Beispiele: $2b$ (bcrypt), $5$ (SHA-256), $6$ (SHA-512). Ein leerer String wählt das stärkste verfügbare Verfahren automatisch.
$count int 0 Anzahl der Iterationen bzw. Work Factor für den Algorithmus. Der Wertebereich hängt vom jeweiligen Algorithmus ab. 0 überlässt die Wahl dem algorithmischen Standard.

Rückgabewert

Typ
string
Beschreibung
Gibt einen gültigen Salt-String zurück, der direkt als zweites Argument an crypt() übergeben werden kann. Der zurückgegebene String enthält sowohl den Algorithmus-Prefix als auch den zufälligen Salt-Anteil.

Beispiele

Passwort-Hash mit bcrypt erzeugen

<?php
// Salt für bcrypt mit Work Factor 12 erzeugen
$salt = crypt_gensalt('$2b$', 12);
echo 'Salt: ' . $salt . PHP_EOL;

// Passwort hashen
$password = 'geheimesPasswort123';
$hash = crypt($password, $salt);
echo 'Hash: ' . $hash . PHP_EOL;

// Passwort verifizieren
$eingabe = 'geheimesPasswort123';
if (hash_equals($hash, crypt($eingabe, $hash))) {
    echo 'Passwort korrekt!';
} else {
    echo 'Passwort falsch!';
}
Salt: $2b$12$<zufälliger Salt> Hash: $2b$12$<vollständiger bcrypt-Hash> Passwort korrekt!

SHA-512-crypt-Salt automatisch auswählen

<?php
// Salt für SHA-512 mit erhöhtem Work Factor erzeugen
$salt = crypt_gensalt('$6$', 50000);
$password = 'meinSicheresPasswort';
$hash = crypt($password, $salt);
echo 'Verwendetes Verfahren: SHA-512-crypt' . PHP_EOL;
echo 'Hash: ' . $hash . PHP_EOL;

// Stärkstes verfügbares Verfahren automatisch wählen
$autoSalt = crypt_gensalt();
echo 'Auto-Salt: ' . $autoSalt . PHP_EOL;
Verwendetes Verfahren: SHA-512-crypt Hash: $6$<rounds=50000>$<zufälliger Salt>$<Hash> Auto-Salt: $<bester Algorithmus>$<zufälliger Salt>

// Wichtig · Fallstricke

Verfügbarkeit: crypt_gensalt() ist keine Standard-PHP-Funktion und steht nur zur Verfügung, wenn PHP mit libxcrypt-Unterstützung kompiliert wurde. Die Funktion ist nicht auf allen Systemen und nicht in allen PHP-Installationen vorhanden. Prüfe die Verfügbarkeit mit function_exists('crypt_gensalt').

Sicherheitsempfehlung: Für neue Projekte sollte password_hash() mit PASSWORD_BCRYPT oder PASSWORD_ARGON2ID bevorzugt werden, da diese Funktionen deutlich einfacher korrekt zu verwenden sind und aktiv gewartet werden.

Timing-Angriffe: Beim Vergleich von Passwort-Hashes immer hash_equals() anstelle von === verwenden, um Timing-Angriffe zu verhindern.

Keine eigenen Salts: Übergib niemals einen selbst konstruierten Salt-String an crypt() — nutze ausschließlich von crypt_gensalt() generierte Salts, um sicherheitskritische Fehler zu vermeiden.