Start · Sprachen · PHP · Referenz · sodium_crypto_shorthash_keygen

sodium_crypto_shorthash_keygen

Funktion

Erzeugt einen kryptografisch sicheren Zufallsschlüssel für <code>sodium_crypto_shorthash()</code>.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_shorthash_keygen(): string

Beschreibung

sodium_crypto_shorthash_keygen() erzeugt einen zufälligen, kryptografisch sicheren Schlüssel, der für den SipHash-2-4-Algorithmus (implementiert durch sodium_crypto_shorthash()) benötigt wird. Der zurückgegebene Schlüssel hat eine feste Länge von SODIUM_CRYPTO_SHORTHASH_KEYBYTES (16 Byte).

SipHash-2-4 ist ein schneller, nicht-kryptografischer Hash-Algorithmus, der sich besonders für Hash-Tabellen und kurze Eingaben eignet, bei denen Geschwindigkeit und Kollisionsresistenz wichtig sind. Im Gegensatz zu allgemeinen kryptografischen Hashfunktionen wie SHA-256 setzt SipHash einen geheimen Schlüssel voraus, um Hash-Flooding-Angriffe zu verhindern.

Der generierte Schlüssel sollte sicher gespeichert und niemals öffentlich preisgegeben werden, da die Sicherheitseigenschaften von SipHash-2-4 vollständig auf der Geheimhaltung des Schlüssels basieren. Für die sichere Speicherung empfiehlt sich die Verwendung von Umgebungsvariablen oder einem Secrets-Management-System.

Die Funktion verwendet intern den CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) des Betriebssystems und ist daher für den produktiven Einsatz geeignet.

Rückgabewert

Typ
string
Beschreibung
Gibt einen binären String mit SODIUM_CRYPTO_SHORTHASH_KEYBYTES (16) zufälligen Bytes zurück, der als Schlüssel für sodium_crypto_shorthash() verwendet werden kann.

Beispiele

Schlüssel generieren und SipHash berechnen

<?php
// Einmalig einen Schlüssel generieren und sicher speichern
$key = sodium_crypto_shorthash_keygen();

// Schlüssel als Hex-String speichern (z. B. in Konfiguration oder .env)
$keyHex = sodium_bin2hex($key);
echo 'Schlüssel (hex): ' . $keyHex . PHP_EOL;

// Später den Schlüssel wiederverwenden
$restoredKey = sodium_hex2bin($keyHex);

$message = 'Benutzer-ID: 42';
$hash = sodium_crypto_shorthash($message, $restoredKey);

echo 'Hash (hex): ' . sodium_bin2hex($hash) . PHP_EOL;
Schlüssel (hex): <16 Byte zufälliger Hex-Wert> Hash (hex): <8 Byte SipHash-2-4-Ergebnis>

Schutz von Hash-Tabellen gegen Hash-Flooding

<?php
// Schlüssel beim Anwendungsstart generieren (pro Laufzeit)
$sessionKey = sodium_crypto_shorthash_keygen();

$userInputs = ['admin', 'user1', 'test@example.com'];
$hashTable = [];

foreach ($userInputs as $input) {
    $hash = sodium_bin2hex(sodium_crypto_shorthash($input, $sessionKey));
    $hashTable[$hash] = $input;
    echo sprintf("%-25s => %s\n", $input, $hash);
}

// Da der Schlüssel geheim ist, kann ein Angreifer keine gezielten
// Kollisionen erzeugen, um die Hash-Tabelle zu verlangsamen.
admin => <8-Byte-Hex> user1 => <8-Byte-Hex> test@example.com => <8-Byte-Hex>

// Wichtig · Fallstricke

Sicherheitshinweis: Der von sodium_crypto_shorthash_keygen() erzeugte Schlüssel darf niemals öffentlich zugänglich sein. Wird er kompromittiert, kann ein Angreifer gezielte Hash-Kollisionen berechnen und damit Hash-Flooding-Angriffe durchführen.

Nicht für kryptografische Signaturen geeignet: SipHash-2-4 ist ein Message Authentication Code (MAC) für kurze Nachrichten und Hash-Tabellen, aber kein kryptografisch sicherer Hash. Für digitale Signaturen oder Passwort-Hashing sollten stattdessen sodium_crypto_sign_keygen() bzw. sodium_crypto_pwhash() verwendet werden.

Schlüssellänge: Die Länge beträgt immer genau SODIUM_CRYPTO_SHORTHASH_KEYBYTES (16 Byte). Ein manuell gekürzter oder verlängerter Schlüssel führt zu einem Fehler in sodium_crypto_shorthash().