Signatur
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
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 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!');
// Wichtig · Fallstricke
Sicherheitshinweise:
- Verwende niemals selbst gewählte, niedrige Werte für
opslimitodermemlimitin 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
SodiumExceptionwenn nicht genügend Arbeitsspeicher verfügbar ist — dies sollte in Produktivumgebungen abgefangen werden.