Start · Sprachen · PHP · Referenz · mhash_keygen_s2k

mhash_keygen_s2k

Funktion

Erzeugt einen kryptografischen Schlüssel aus einem Passwort mittels des S2K-Algorithmus (Salted S2K gemäß OpenPGP-Standard).

seit PHP 4.0.4 Kategorie: crypto

Signatur

mhash_keygen_s2k(int $algo, string $password, string $salt, int $bytes): string|false

Beschreibung

mhash_keygen_s2k() implementiert das S2K-Schlüsselableitungsverfahren (String-to-Key) aus dem OpenPGP-Standard (RFC 4880). Es nimmt ein Passwort und einen Salt-Wert entgegen und leitet daraus einen Schlüssel mit der gewünschten Länge ab. Die eigentliche Hash-Berechnung wird intern durch den angegebenen Algorithmus (z. B. MHASH_SHA1, MHASH_MD5) durchgeführt.

Das Verfahren eignet sich dazu, aus einem von Menschen lesbaren Passwort einen binären Schlüssel fester Länge zu erzeugen, der anschließend für symmetrische Verschlüsselungsalgorithmen verwendet werden kann. Der Salt verhindert, dass vorberechnete Tabellen (Rainbow Tables) eingesetzt werden können.

Die Funktion gehört zur mhash-Erweiterung, die in modernen PHP-Projekten oft durch die hash_-Funktionsfamilie (hash_pbkdf2()) ersetzt wird. Für neue Projekte sollte hash_pbkdf2() bevorzugt werden, da es mehr Iterationen und damit eine stärkere Schlüsselableitung ermöglicht.

Der Salt muss genau 8 Bytes lang sein. Ein kürzerer oder längerer Salt führt zu einem Fehler oder unerwartetem Verhalten.

Parameter

Name Typ Default Beschreibung
$algo Pflicht int Die zu verwendende Hash-Algorithmus-Konstante, z. B. MHASH_SHA1, MHASH_MD5, MHASH_SHA256. Die Liste der unterstützten Algorithmen hängt von der installierten mhash-Bibliothek ab.
$password Pflicht string Das Passwort im Klartext, aus dem der Schlüssel abgeleitet werden soll.
$salt Pflicht string Ein zufälliger Salt-Wert. Muss genau 8 Bytes lang sein. Sollte kryptografisch zufällig erzeugt werden, z. B. mit random_bytes(8).
$bytes Pflicht int Die gewünschte Länge des erzeugten Schlüssels in Bytes. Übliche Werte sind 16 (128 Bit) oder 32 (256 Bit).

Rückgabewert

Typ
string|false
Beschreibung
Gibt den erzeugten Schlüssel als binären String der angegebenen Länge zurück. Im Fehlerfall (z. B. ungültiger Algorithmus) wird false zurückgegeben.

Beispiele

Schlüssel aus Passwort für AES-128 ableiten

<?php
// Zufälligen Salt erzeugen (8 Bytes für S2K)
$salt = random_bytes(8);

$password = 'MeinSicheresPasswort!';

// 16-Byte-Schlüssel (128 Bit) mit SHA-256 ableiten
$key = mhash_keygen_s2k(MHASH_SHA256, $password, $salt, 16);

if ($key === false) {
    echo 'Schlüsselerzeugung fehlgeschlagen.';
} else {
    echo 'Schlüssel (hex): ' . bin2hex($key) . PHP_EOL;
    echo 'Salt (hex):      ' . bin2hex($salt) . PHP_EOL;
}
?>
Schlüssel (hex): a3f2e1... (32 hex-Zeichen, variiert je nach Eingabe) Salt (hex): c9f1... (16 hex-Zeichen, zufällig)

Schlüsselableitung und Vergleich: Authentifizierung simulieren

<?php
// Beim Registrieren gespeicherter Salt (hier fest für das Beispiel)
$storedSalt = '\x01\x02\x03\x04\x05\x06\x07\x08';

$password = 'BenutzerPasswort42';

// Schlüssel beim Registrieren erzeugen und speichern
$storedKey = mhash_keygen_s2k(MHASH_SHA1, $password, $storedSalt, 20);

// Beim Login: Schlüssel erneut ableiten
$inputPassword = 'BenutzerPasswort42';
$derivedKey = mhash_keygen_s2k(MHASH_SHA1, $inputPassword, $storedSalt, 20);

// Zeitkonstanter Vergleich
if (hash_equals($storedKey, $derivedKey)) {
    echo 'Authentifizierung erfolgreich.' . PHP_EOL;
} else {
    echo 'Falsches Passwort.' . PHP_EOL;
}
?>
Authentifizierung erfolgreich.

// Wichtig · Fallstricke

Sicherheitshinweis: Die mhash-S2K-Implementierung führt intern nur eine einzelne Hash-Runde durch (ohne Iterationen), was sie gegenüber modernen Brute-Force-Angriffen deutlich anfälliger macht als Funktionen wie password_hash(), hash_pbkdf2() oder sodium_crypto_pwhash(). Für neue Projekte und sicherheitskritische Anwendungen sollte nicht mhash_keygen_s2k() verwendet werden.

Der Salt muss exakt 8 Bytes lang sein. Verwende stets random_bytes(8) zur Erzeugung, um Vorhersagbarkeit auszuschließen. Den Salt darf man zusammen mit dem abgeleiteten Schlüssel speichern – er muss nicht geheim bleiben.

Die mhash-Erweiterung ist ab PHP 5.3.0 in die hash-Erweiterung integriert, steht aber unter Umständen nicht auf allen Systemen zur Verfügung. Prüfe die Verfügbarkeit mit function_exists('mhash_keygen_s2k').