Signatur
Beschreibung
sodium_crypto_generichash() ist eine flexible kryptografische Hash-Funktion, die auf dem BLAKE2b-Algorithmus basiert. Sie kann sowohl als einfache Hash-Funktion als auch als keyed Hash (ähnlich einem HMAC) verwendet werden. Die Funktion ist ein Teil der libsodium-Bibliothek und steht in PHP seit Version 7.2 nativ zur Verfügung.
Im Unterschied zu md5() oder sha1() ist BLAKE2b für kryptografische Sicherheit ausgelegt: Es ist kollisionsresistent, vorbildresistent und schnell auf moderner Hardware. Wenn ein optionaler $key angegeben wird, verhält sich die Funktion wie eine MAC-Funktion (Message Authentication Code), mit der die Integrität und Authentizität von Daten verifiziert werden kann.
Typische Einsatzgebiete sind: Datei-Integritätsprüfungen, Erstellung von Prüfsummen für Caches oder Datenbanken, Ableitungen von Schlüsseln sowie Authentifizierungs-Tokens. Die Ausgabelänge kann über den Parameter $length flexibel zwischen SODIUM_CRYPTO_GENERICHASH_BYTES_MIN (16) und SODIUM_CRYPTO_GENERICHASH_BYTES_MAX (64) eingestellt werden.
Für Passwort-Hashing ist diese Funktion nicht geeignet – dafür sollte sodium_crypto_pwhash() oder password_hash() verwendet werden, da diese bewusst langsam und ressourcenintensiv sind.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $msg Pflicht | string | Die Nachricht (beliebige Binärdaten oder Zeichenkette), die gehasht werden soll. | |
| $key | string | Optionaler Schlüssel für einen keyed Hash (MAC). Die Länge muss zwischen SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN (16) und SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX (64) Bytes liegen. Wird kein Schlüssel angegeben, verhält sich die Funktion wie ein normaler Hash ohne Authentifizierung. |
|
| $length | int | SODIUM_CRYPTO_GENERICHASH_BYTES | Gewünschte Länge des Hashes in Bytes. Der Standardwert ist SODIUM_CRYPTO_GENERICHASH_BYTES (32). Erlaubt sind Werte von SODIUM_CRYPTO_GENERICHASH_BYTES_MIN (16) bis SODIUM_CRYPTO_GENERICHASH_BYTES_MAX (64). |
Rückgabewert
sodium_bin2hex() oder bin2hex() kodiert werden.Beispiele
Einfacher Hash ohne Schlüssel
<?php
$message = 'Hallo, Welt!';
// Standard-Hash mit 32 Bytes Ausgabe
$hash = sodium_crypto_generichash($message);
echo 'Hash (hex): ' . sodium_bin2hex($hash) . PHP_EOL;
echo 'Länge: ' . strlen($hash) . ' Bytes' . PHP_EOL;
?>
Keyed Hash zur Nachrichtenintegrität (MAC)
<?php
// Schlüssel erzeugen (einmalig, sicher speichern)
$key = sodium_crypto_generichash_keygen();
$data = 'Wichtige Nutzlast: Bestellnummer 4711';
// MAC berechnen
$mac = sodium_crypto_generichash($data, $key);
echo 'MAC (hex): ' . sodium_bin2hex($mac) . PHP_EOL;
// Verifizierung: Hash erneut berechnen und vergleichen
$received_data = 'Wichtige Nutzlast: Bestellnummer 4711';
$expected_mac = sodium_crypto_generichash($received_data, $key);
if (hash_equals($mac, $expected_mac)) {
echo 'Nachricht ist authentisch und unverändert.' . PHP_EOL;
} else {
echo 'WARNUNG: Nachricht wurde manipuliert!' . PHP_EOL;
}
?>
Hash mit benutzerdefinierter Ausgabelänge
<?php
$message = 'Datei-Inhalt zum Prüfen';
// 64-Byte-Hash (maximale Länge, entspricht BLAKE2b-512)
$hash64 = sodium_crypto_generichash($message, '', SODIUM_CRYPTO_GENERICHASH_BYTES_MAX);
echo 'BLAKE2b-512 (hex): ' . sodium_bin2hex($hash64) . PHP_EOL;
// 16-Byte-Hash (minimale Länge)
$hash16 = sodium_crypto_generichash($message, '', SODIUM_CRYPTO_GENERICHASH_BYTES_MIN);
echo 'BLAKE2b-128 (hex): ' . sodium_bin2hex($hash16) . PHP_EOL;
?>
// Wichtig · Fallstricke
Sicherheitshinweise:
- Kein Passwort-Hashing: Diese Funktion ist nicht für das Hashing von Passwörtern geeignet, da sie zu schnell ist. Verwende stattdessen
sodium_crypto_pwhash()oderpassword_hash(). - Timing-sichere Vergleiche: Beim Vergleichen von zwei Hashes stets
hash_equals()verwenden, um Timing-Angriffe zu verhindern. - Schlüssellänge: Bei Angabe eines Schlüssels muss dessen Länge zwischen
SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MINundSODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAXliegen, sonst wird eineSodiumExceptionausgelöst. Zur sicheren Schlüsselerzeugung empfiehlt sichsodium_crypto_generichash_keygen(). - Binärausgabe: Der Rückgabewert ist ein roher Binär-String. Für Datenbankspeicherung oder Ausgabe mit
sodium_bin2hex()oderbase64_encode()konvertieren. - Die Funktion wirft eine
SodiumException, wenn die angegebene Hash-Länge oder Schlüssellänge außerhalb der gültigen Grenzen liegt.