Signatur
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
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;
}
Ä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.';
}
// 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.