Start · Sprachen · PHP · Referenz · sodium_crypto_generichash_keygen

sodium_crypto_generichash_keygen

Funktion

Erzeugt einen kryptographisch sicheren, zufälligen Schlüssel für <code>sodium_crypto_generichash()</code> (BLAKE2b).

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_generichash_keygen(): string

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

Typ
string
Beschreibung
Gibt einen binären String der Länge 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 (hex): <32 zufällige Bytes als Hex> Hash (hex): <64 Bytes als Hex>

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;
}
Hash ist gültig.

// 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.