Start · Sprachen · PHP · Referenz · sodium_crypto_pwhash_scryptsalsa208sha256_str_verify

sodium_crypto_pwhash_scryptsalsa208sha256_str_verify

Funktion

Prüft, ob ein Klartextpasswort zu einem zuvor mit <code>sodium_crypto_pwhash_scryptsalsa208sha256_str()</code> erzeugten Hash-String passt.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_pwhash_scryptsalsa208sha256_str_verify(string $hash, string $password): bool

Beschreibung

Die Funktion sodium_crypto_pwhash_scryptsalsa208sha256_str_verify() vergleicht ein Klartextpasswort mit einem gespeicherten Hash-String, der zuvor mit dem scrypt-Algorithmus (kombiniert mit Salsa20/8 und SHA-256) erzeugt wurde. Der Hash-String enthält dabei alle nötigen Informationen – Salt, Algorithmusparameter und den eigentlichen Hash –, sodass kein separater Salt-Parameter benötigt wird.

Im Gegensatz zu einem einfachen String-Vergleich arbeitet diese Funktion timing-sicher (constant-time comparison), um Timing-Angriffe zu verhindern. Sie sollte immer anstelle eines manuellen Vergleichs wie === oder hash_equals() verwendet werden, wenn scrypt-Passwort-Hashes geprüft werden.

Typischer Einsatz: Ein Benutzer gibt sein Passwort beim Login ein, und die Anwendung vergleicht es mit dem in der Datenbank gespeicherten Hash. Die Funktion gibt true zurück, wenn das Passwort korrekt ist, andernfalls false.

Für neue Anwendungen wird in der Regel sodium_crypto_pwhash_str_verify() mit dem Argon2id-Algorithmus empfohlen. scrypt bleibt jedoch eine bewährte, sichere Alternative, insbesondere wenn Kompatibilität mit bestehenden Systemen gefragt ist.

Parameter

Name Typ Default Beschreibung
$hash Pflicht string Der zuvor mit sodium_crypto_pwhash_scryptsalsa208sha256_str() erzeugte Hash-String. Er enthält Salt und Algorithmusparameter in einem einzigen, lesbaren Format.
$password Pflicht string Das zu prüfende Klartextpasswort, das der Benutzer eingegeben hat.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Passwort zum gespeicherten Hash passt, andernfalls false. Bei ungültigem oder manipuliertem Hash-String wird ebenfalls false zurückgegeben.

Beispiele

Passwort-Hash erstellen und verifizieren

<?php
$password = 'MeinSicheresPasswort123!';

// Hash beim Registrieren des Benutzers erzeugen und in der DB speichern
$hash = sodium_crypto_pwhash_scryptsalsa208sha256_str(
    $password,
    SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
);

echo "Erzeugter Hash: " . $hash . "\n";

// Beim Login: Passwort gegen den gespeicherten Hash prüfen
if (sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($hash, $password)) {
    echo "Passwort korrekt – Benutzer eingeloggt.\n";
} else {
    echo "Falsches Passwort.\n";
}
Erzeugter Hash: $7$...<scrypt-hash-string>... Passwort korrekt – Benutzer eingeloggt.

Login-Überprüfung mit falschem Passwort

<?php
$passwortAusDb = sodium_crypto_pwhash_scryptsalsa208sha256_str(
    'KorrektesPasswort',
    SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
);

$eingegebenesPasswort = 'FalschesPasswort';

if (sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($passwortAusDb, $eingegebenesPasswort)) {
    echo "Zugang gewährt.\n";
} else {
    echo "Zugang verweigert: Passwort stimmt nicht überein.\n";
    // Keine weiteren Details an den Benutzer – kein Hinweis, was falsch ist
}
Zugang verweigert: Passwort stimmt nicht überein.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Verwenden Sie diese Funktion niemals in Kombination mit === oder anderen String-Vergleichen – nur der eingebaute Vergleich dieser Funktion ist timing-sicher.
  • Speichern Sie den Hash-String vollständig in der Datenbank – kürzen oder verändern Sie ihn nicht, da dies zu false-Ergebnissen führt.
  • Falls sodium_crypto_pwhash_scryptsalsa208sha256_str() eine SodiumException wirft (z. B. bei zu wenig Arbeitsspeicher), sollte die Ausnahme abgefangen und der Benutzer nicht eingeloggt werden.
  • Für neue Projekte sollten Sie den moderneren Argon2id-Algorithmus via sodium_crypto_pwhash_str_verify() oder password_verify() mit PASSWORD_ARGON2ID bevorzugen.
  • Der $hash-Parameter muss ein gültiger scrypt-Hash-String sein, der mit dieser Bibliothek erzeugt wurde. Andere Hash-Formate (z. B. bcrypt) werden nicht erkannt und führen zu false.