Start · Sprachen · PHP · Referenz · sodium_crypto_shorthash

sodium_crypto_shorthash

Funktion

Berechnet einen kurzen, schlüsselabhängigen Hash einer Nachricht mittels SipHash-2-4 (64-Bit-Ausgabe).

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_shorthash(string $message, string $key): string

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

Typ
string
Beschreibung
Gibt einen rohen binären String mit einer Länge von 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)
a3f2c1d4e5b60782

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_generichash verwenden.
  • 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.