Start · Sprachen · PHP · Referenz · sodium_crypto_pwhash_scryptsalsa208sha256_str

sodium_crypto_pwhash_scryptsalsa208sha256_str

Funktion

Erzeugt einen sicheren, ASCII-kodierten Passwort-Hash mit dem scrypt-Algorithmus (Salsa20/8, SHA-256).

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_pwhash_scryptsalsa208sha256_str(string $password, int $opslimit, int $memlimit): string

Beschreibung

sodium_crypto_pwhash_scryptsalsa208sha256_str() hasht ein Passwort mit dem scrypt-Algorithmus unter Verwendung von Salsa20/8 und SHA-256. Das Ergebnis ist ein vollständiger ASCII-String, der Salt, Algorithmusparameter und den eigentlichen Hash enthält — alles in einem einzigen, speicherbaren String.

Die Funktion ist Teil der libsodium-Bibliothek und bietet eine moderne, sichere Alternative zu älteren Passwort-Hashing-Funktionen wie md5() oder sha1(). Im Gegensatz zu einfachen Hashes ist scrypt bewusst rechenintensiv und speicherintensiv, um Brute-Force- und Rainbow-Table-Angriffe zu erschweren.

Mit opslimit und memlimit kann die Arbeitslast gesteuert werden. Für interaktive Anwendungen empfehlen sich die Konstanten SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE und SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE. Für hochsensible Daten sollten die SENSITIVE-Varianten dieser Konstanten verwendet werden.

Der erzeugte Hash kann direkt mit sodium_crypto_pwhash_scryptsalsa208sha256_str_verify() verifiziert werden. Da Salt und Parameter im Ausgabe-String kodiert sind, müssen diese nicht separat gespeichert werden.

Parameter

Name Typ Default Beschreibung
$password Pflicht string Das Passwort im Klartext, das gehasht werden soll.
$opslimit Pflicht int Maximale Anzahl der Rechenoperationen. Höhere Werte erhöhen die Sicherheit, aber auch die Rechenzeit. Empfohlene Konstanten: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE oder SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE.
$memlimit Pflicht int Maximale Menge an Arbeitsspeicher (in Bytes), die der Algorithmus verwenden darf. Empfohlene Konstanten: SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE oder SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE.

Rückgabewert

Typ
string
Beschreibung
Gibt einen ASCII-kodierten String zurück, der den Hash, das Salt und die verwendeten Parameter enthält. Im Fehlerfall wird eine SodiumException geworfen (z. B. bei unzureichendem Arbeitsspeicher oder ungültigen Parametern).

Beispiele

Passwort hashen und verifizieren (interaktiver Anwendungsfall)

<?php
$password = 'MeinSicheresPasswort123!';

$hash = sodium_crypto_pwhash_scryptsalsa208sha256_str(
    $password,
    SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
);

echo "Hash (speicherbar): " . $hash . PHP_EOL;

// Verifizierung bei der Anmeldung
$eingabe = 'MeinSicheresPasswort123!';
if (sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($hash, $eingabe)) {
    echo "Passwort korrekt!" . PHP_EOL;
} else {
    echo "Passwort falsch!" . PHP_EOL;
}

// Speicher sauber halten
sodium_memzero($password);
sodium_memzero($eingabe);
Hash (speicherbar): $7$...(langer ASCII-String)... Passwort korrekt!

Hash in einer Datenbank speichern (Registrierungsvorgang)

<?php
function registriereBenutzer(PDO $pdo, string $benutzername, string $passwort): void
{
    $hash = sodium_crypto_pwhash_scryptsalsa208sha256_str(
        $passwort,
        SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE,
        SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
    );

    $stmt = $pdo->prepare('INSERT INTO benutzer (name, passwort_hash) VALUES (:name, :hash)');
    $stmt->execute([
        ':name' => $benutzername,
        ':hash' => $hash,
    ]);

    // Passwort sofort aus dem Speicher entfernen
    sodium_memzero($passwort);
    echo "Benutzer '{$benutzername}' wurde erfolgreich registriert." . PHP_EOL;
}

// Beispielaufruf (PDO-Verbindung vorausgesetzt):
// registriereBenutzer($pdo, 'alice', 'geheimesPasswort!');
Benutzer 'alice' wurde erfolgreich registriert.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Verwende niemals selbst gewählte, niedrige Werte für opslimit oder memlimit in Produktivsystemen — nutze stets die vordefinierten Konstanten.
  • Der Rückgabe-String enthält bereits ein zufällig generiertes Salt; dieses muss nicht separat gespeichert werden.
  • Lösche Klartextpasswörter nach der Verwendung mit sodium_memzero() aus dem Speicher, um deren Verweildauer zu minimieren.
  • Die Verifizierung sollte ausschließlich mit sodium_crypto_pwhash_scryptsalsa208sha256_str_verify() erfolgen, da diese Funktion einen Timing-Attack-sicheren Vergleich durchführt.
  • Für neue Anwendungen kann auch sodium_crypto_pwhash_str() (Argon2id) in Betracht gezogen werden, da Argon2id als moderner und vielseitiger gilt.
  • Die Funktion wirft eine SodiumException wenn nicht genügend Arbeitsspeicher verfügbar ist — dies sollte in Produktivumgebungen abgefangen werden.