Signatur
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
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ü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;
}
?>
// 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').