Signatur
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
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;
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.
// 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().