Start · Sprachen · PHP · Referenz · crypt_checksalt

crypt_checksalt

Funktion

Prüft, ob ein <code>crypt</code>-Einstellungsstring (Salt) gültig und sicher ist.

Kategorie: misc

Signatur

crypt_checksalt(string $setting): bool

Beschreibung

crypt_checksalt() validiert einen crypt-kompatiblen Einstellungsstring (auch als Salt bezeichnet) auf Korrektheit und Sicherheit. Die Funktion stammt aus der libxcrypt-Bibliothek und ist ab PHP 8.0 auf Systemen verfügbar, die libxcrypt unterstützen.

Ein Einstellungsstring kodiert das verwendete Hash-Verfahren (z. B. bcrypt mit $2y$, SHA-512 mit $6$ oder MD5 mit $1$) sowie die zugehörigen Parameter wie den Kostenfaktor. crypt_checksalt() gibt true zurück, wenn der String syntaktisch korrekt und das verwendete Verfahren als sicher eingestuft wird.

Die Funktion ist besonders nützlich, bevor ein bestehender Hash-Salt wiederverwendet wird, um sicherzustellen, dass er noch den aktuellen Sicherheitsanforderungen entspricht. Sie kann eingesetzt werden, um veraltete oder schwache Hashing-Algorithmen (z. B. DES oder MD5) zu erkennen und eine Neuberechnung des Passwort-Hashes zu erzwingen.

Für neue Anwendungen sollte password_hash() und password_verify() bevorzugt werden. crypt_checksalt() ist vor allem dann relevant, wenn legacy-Systeme migriert oder bestehende crypt()-Hashes überprüft werden müssen.

Parameter

Name Typ Default Beschreibung
$setting Pflicht string Der zu prüfende crypt-Einstellungsstring, wie er z. B. aus einem gespeicherten Hash-Wert extrahiert werden kann (z. B. $2y$12$...).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Einstellungsstring gültig und das verwendete Hash-Verfahren als sicher eingestuft wird. Gibt false zurück, wenn der String ungültig ist oder ein als unsicher geltendes Verfahren verwendet.

Beispiele

Bcrypt-Salt auf Gültigkeit prüfen

<?php
// Einen bcrypt-Hash erzeugen und dessen Einstellungsstring prüfen
$hash = crypt('meinPasswort', '$2y$12$usesomesillystringforsalt$');
// Den Einstellungsstring (Prefix + Parameter) aus dem Hash extrahieren
$setting = substr($hash, 0, 29); // $2y$12$ + 22 Zeichen Salt

if (crypt_checksalt($setting)) {
    echo "Der Einstellungsstring ist gültig und sicher.";
} else {
    echo "Der Einstellungsstring ist ungültig oder veraltet.";
}
Der Einstellungsstring ist gültig und sicher.

Veralteten MD5-Salt erkennen und Rehash erzwingen

<?php
// Gespeicherter alter MD5-crypt-Hash (unsicheres Verfahren)
$storedHash = '$1$saltsalt$somethinghashed';
$setting = substr($storedHash, 0, strrpos($storedHash, '$', 3) + 1);

if (!crypt_checksalt($setting)) {
    echo "Veraltetes Hash-Verfahren erkannt. Bitte Passwort neu hashen!";
    // Hier würde man z. B. password_hash() aufrufen, sobald das Klartextpasswort bekannt ist.
} else {
    echo "Einstellungsstring ist aktuell und sicher.";
}
Veraltetes Hash-Verfahren erkannt. Bitte Passwort neu hashen!

// Wichtig · Fallstricke

Verfügbarkeit: crypt_checksalt() ist nur auf Systemen verfügbar, die libxcrypt verwenden (vor allem Linux). Auf Windows oder macOS ohne libxcrypt steht die Funktion nicht zur Verfügung. Prüfe die Verfügbarkeit mit function_exists('crypt_checksalt').

Sicherheitshinweis: Als unsicher eingestufte Verfahren wie traditionelles DES, BigCrypt oder MD5 ($1$) liefern false. Dies sollte als Signal gewertet werden, betroffene Passwort-Hashes bei der nächsten Anmeldung neu zu berechnen – idealerweise mit password_hash() und PASSWORD_BCRYPT oder PASSWORD_ARGON2ID.

Keine Ersatz für password_needs_rehash(): Für moderne Passwort-Hashes aus password_hash() sollte stattdessen password_needs_rehash() verwendet werden, da es Algorithmus und Kostenfaktor berücksichtigt.