Signatur
Beschreibung
sodium_crypto_generichash_keygen() generiert einen zufälligen Schlüssel mit der optimalen Länge für die BLAKE2b-Hash-Funktion (SODIUM_CRYPTO_GENERICHASH_KEYBYTES = 32 Byte). Der Schlüssel kann anschließend an sodium_crypto_generichash() übergeben werden, um einen schlüsselgebundenen (keyed) Hash zu erzeugen — also einen MAC-ähnlichen Fingerabdruck einer Nachricht.
Im Gegensatz zu einem einfachen Hash ohne Schlüssel kann ein schlüsselgebundener BLAKE2b-Hash nur von Parteien verifiziert werden, die den Schlüssel kennen. Das ist nützlich für die Integritätsprüfung von Daten, bei der Authentizität ebenfalls gewünscht ist, ohne auf schwergewichtige HMAC-Konstruktionen zurückgreifen zu müssen.
Die Funktion nutzt intern den CSPRNG des Betriebssystems (z. B. /dev/urandom unter Linux) und ist damit für den produktiven Einsatz geeignet. Der zurückgegebene Schlüssel sollte geheim gehalten und sicher gespeichert werden.
Rückgabewert
SODIUM_CRYPTO_GENERICHASH_KEYBYTES (32 Byte) zurück, der als zufälliger Schlüssel für sodium_crypto_generichash() verwendet werden kann.Beispiele
Schlüssel erzeugen und schlüsselgebundenen Hash berechnen
<?php
// Zufälligen Schlüssel erzeugen
$key = sodium_crypto_generichash_keygen();
$nachricht = 'Wichtige Nachricht';
// Schlüsselgebundenen BLAKE2b-Hash berechnen
$hash = sodium_crypto_generichash($nachricht, $key);
echo 'Schlüssel (hex): ' . sodium_bin2hex($key) . PHP_EOL;
echo 'Hash (hex): ' . sodium_bin2hex($hash) . PHP_EOL;
Schlüssel persistent speichern und wiederverwenden
<?php
// Schlüssel einmalig erzeugen und Base64-kodiert speichern
$key = sodium_crypto_generichash_keygen();
$keyBase64 = sodium_bin2base64($key, SODIUM_BASE64_VARIANT_ORIGINAL);
file_put_contents('/var/secrets/generichash.key', $keyBase64);
// Später: Schlüssel laden und Hash verifizieren
$gespeicherterKey = sodium_base642bin(
trim(file_get_contents('/var/secrets/generichash.key')),
SODIUM_BASE64_VARIANT_ORIGINAL
);
$nachricht = 'Zu prüfende Nachricht';
$erwartet = sodium_crypto_generichash($nachricht, $gespeicherterKey);
// Eingehenden Hash empfangen (hier simuliert)
$empfangen = $erwartet;
if (hash_equals($erwartet, $empfangen)) {
echo 'Hash ist gültig.' . PHP_EOL;
} else {
echo 'Hash-Prüfung fehlgeschlagen!' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Der erzeugte Schlüssel ist ein Geheimnis und darf niemals öffentlich übertragen oder im Klartext geloggt werden. Bei der Speicherung empfiehlt sich ein sicherer Speicher wie ein Secret-Manager oder eine verschlüsselte Konfiguration.
Der Schlüssel hat eine feste Länge von SODIUM_CRYPTO_GENERICHASH_KEYBYTES (32 Byte). Eigens erzeugte Schlüssel anderer Länge können zwar an sodium_crypto_generichash() übergeben werden (solange sie zwischen SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN und SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX liegen), sollten jedoch bevorzugt mit dieser Funktion erzeugt werden, um die empfohlene Länge sicherzustellen.
Für den Vergleich zweier Hashes immer hash_equals() oder sodium_memcmp() verwenden, um Timing-Angriffe zu vermeiden.