Start · Sprachen · PHP · Referenz · ssdeep_fuzzy_hash

ssdeep_fuzzy_hash

Funktion

Erzeugt einen Fuzzy-Hash (Ähnlichkeits-Hash) aus einem übergebenen String mithilfe des ssdeep-Algorithmus.

Kategorie: crypto

Signatur

ssdeep_fuzzy_hash(string $str): string|false

Beschreibung

ssdeep_fuzzy_hash berechnet einen sogenannten Fuzzy-Hash (auch: Context-Triggered Piecewise Hash, CTPH) aus einem beliebigen String. Im Gegensatz zu kryptographischen Hash-Funktionen wie MD5 oder SHA-256, die bei minimaler Änderung der Eingabe einen völlig anderen Hash liefern, erzeugt ssdeep Hashes, die eine Ähnlichkeit zwischen zwei Eingaben widerspiegeln. Ähnliche Inhalte ergeben ähnliche Hashes.

Typische Einsatzgebiete sind die Malware-Analyse (Erkennung von leicht modifizierten Schadcode-Varianten), die Erkennung von nahezu identischen Dokumenten, Spam-Filterung sowie die digitale Forensik. Mit der Schwester-Funktion ssdeep_fuzzy_compare kann der Ähnlichkeitswert (0–100) zweier Fuzzy-Hashes ermittelt werden.

Die Funktion gehört zur PECL-Erweiterung ssdeep und ist nicht standardmäßig in PHP enthalten. Sie muss separat installiert werden (pecl install ssdeep). Intern verwendet sie die Open-Source-Bibliothek libfuzzy (ssdeep).

Für sehr kurze Strings (wenige Bytes) kann die Funktion keinen sinnvollen Fuzzy-Hash berechnen und gibt in diesem Fall false zurück. Für produktive Sicherheitsanwendungen sollte stets auf den Rückgabewert geprüft werden.

Parameter

Name Typ Default Beschreibung
$str Pflicht string Der Eingabe-String, aus dem der Fuzzy-Hash berechnet werden soll. Kann beliebige Binär- oder Textdaten enthalten.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den berechneten Fuzzy-Hash als String zurück. Der Hash hat das Format blocksize:hash1:hash2, z. B. 3:abc:def. Bei einem Fehler oder zu kurzem Eingabe-String wird false zurückgegeben.

Beispiele

Einfachen Fuzzy-Hash eines Strings berechnen

<?php
$text = str_repeat('Dies ist ein Beispieltext fuer ssdeep. ', 50);
$hash = ssdeep_fuzzy_hash($text);

if ($hash === false) {
    echo 'Fuzzy-Hash konnte nicht berechnet werden.';
} else {
    echo 'Fuzzy-Hash: ' . $hash;
}
Fuzzy-Hash: 48:abc123XYZ...:def456...

Ähnlichkeit zweier fast identischer Strings vergleichen

<?php
$original = str_repeat('Wichtiger Dokumenteninhalt, der analysiert werden soll. ', 40);
$modifiziert = str_repeat('Wichtiger Dokumenteninhalt, der analysiert werden soll. ', 40)
    . 'Nur minimal veraendert.';

$hash1 = ssdeep_fuzzy_hash($original);
$hash2 = ssdeep_fuzzy_hash($modifiziert);

if ($hash1 !== false && $hash2 !== false) {
    $aehnlichkeit = ssdeep_fuzzy_compare($hash1, $hash2);
    echo 'Hash 1:       ' . $hash1 . PHP_EOL;
    echo 'Hash 2:       ' . $hash2 . PHP_EOL;
    echo 'Ähnlichkeit:  ' . $aehnlichkeit . ' / 100' . PHP_EOL;
} else {
    echo 'Fehler beim Berechnen eines Fuzzy-Hashes.';
}
Hash 1: 96:...:... Hash 2: 96:...:... Ähnlichkeit: 95 / 100

// Wichtig · Fallstricke

Installation: Die Funktion ist Teil der PECL-Erweiterung ssdeep und erfordert die systemseitige Installation von libfuzzy sowie die PHP-Erweiterung selbst (pecl install ssdeep). Ohne diese Erweiterung steht die Funktion nicht zur Verfügung.

Sicherheitshinweis: Fuzzy-Hashes sind keine kryptographischen Hash-Funktionen und bieten keine Kollisionsresistenz oder Vorbildresistenz. Sie sind ausschließlich für Ähnlichkeitsvergleiche gedacht und dürfen nicht zur Integritätsprüfung, Passwortspeicherung oder für sicherheitskritische Authentifizierungszwecke verwendet werden.

Mindestlänge: Sehr kurze Eingaben (typischerweise unter einigen Dutzend Bytes) können zu einem Rückgabewert von false führen, da der Algorithmus eine Mindestmenge an Daten benötigt. Der Rückgabewert sollte daher immer geprüft werden.