Signatur
Beschreibung
sodium_crypto_shorthash berechnet einen 64-Bit-Hash (8 Byte) einer beliebigen Nachricht unter Verwendung eines geheimen Schlüssels. Intern wird der Algorithmus SipHash-2-4 verwendet, der für hohe Geschwindigkeit bei kurzen Eingaben optimiert ist. Die Funktion eignet sich hervorragend für Hash-Tabellen, Caches oder Message-Authentifizierung in Performance-sensitiven Szenarien, bei denen nur ein vertrauenswürdiger Code-Pfad den Schlüssel kennt.
Da der Hash schlüsselabhängig ist, kann ein Angreifer ohne Kenntnis des Schlüssels keine Kollisionen erzwingen (Hash-Flooding-Angriffe werden damit verhindert). Der Schlüssel muss genau SODIUM_CRYPTO_SHORTHASH_KEYBYTES Byte lang sein (16 Byte).
Wichtig: Der Ausgabe-Hash ist nur 8 Byte kurz und damit nicht für kryptographische Zwecke wie Passwortspeicherung, digitale Signaturen oder kollisionsresistente Hashes geeignet. Für solche Zwecke sollte stattdessen sodium_crypto_generichash (BLAKE2b) verwendet werden.
Einen neuen Schlüssel erzeugt man bequem mit sodium_crypto_shorthash_keygen().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $message Pflicht | string | Die zu hashende Nachricht beliebiger Länge. | |
| $key Pflicht | string | Der geheime Schlüssel, der genau SODIUM_CRYPTO_SHORTHASH_KEYBYTES (16) Byte lang sein muss. Am einfachsten mit sodium_crypto_shorthash_keygen() erzeugen. |
Rückgabewert
SODIUM_CRYPTO_SHORTHASH_BYTES (8 Byte) zurück. Bei ungültiger Schlüssellänge wird eine SodiumException geworfen.Beispiele
Einfacher Kurz-Hash mit zufälligem Schlüssel
<?php
// Schlüssel einmalig erzeugen und sicher speichern (z. B. in einer Umgebungsvariable)
$key = sodium_crypto_shorthash_keygen();
$message = 'Hallo Welt';
$hash = sodium_crypto_shorthash($message, $key);
// Für die Ausgabe in Hex konvertieren
echo bin2hex($hash) . PHP_EOL;
// Beispielausgabe: a3f2c1d4e5b60782 (zufällig, abhängig vom Schlüssel)
Hash-Flooding-Schutz für eine einfache Hash-Tabelle
<?php
// Schlüssel aus sicherer Konfiguration laden
$key = sodium_hex2bin(getenv('SHORTHASH_KEY'));
$buckets = [];
$einfuegen = function (string $wert) use (&$buckets, $key): void {
// 8-Byte-Hash als Bucket-Index verwenden
$hashBin = sodium_crypto_shorthash($wert, $key);
$index = unpack('P', $hashBin)[1]; // 64-Bit-Integer
$buckets[$index][] = $wert;
};
$einfuegen('Apfel');
$einfuegen('Banane');
$einfuegen('Kirsche');
foreach ($buckets as $idx => $werte) {
echo "Bucket $idx: " . implode(', ', $werte) . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- SipHash-2-4 ist kein kryptographisch sicherer Hash im Sinne von Kollisionsresistenz oder Preimage-Resistenz ohne Kenntnis des Schlüssels. Für sicherheitskritische Hashes (z. B. digitale Signaturen)
sodium_crypto_generichashverwenden. - Der Schlüssel sollte geheim gehalten und nicht fest im Quellcode stehen (stattdessen Umgebungsvariablen oder einen Secret-Manager verwenden).
- Bei falscher Schlüssellänge wirft die Funktion eine
SodiumException— diese stets abfangen. - Der Hash-Wert ist schlüsselabhängig: Gleiche Nachrichten mit unterschiedlichen Schlüsseln ergeben vollständig verschiedene Hashes.