Signatur
Beschreibung
ssdeep_fuzzy_compare() berechnet den Übereinstimmungsgrad zweier Fuzzy-Hash-Signaturen, die zuvor mit ssdeep_fuzzy_hash() oder ssdeep_fuzzy_hash_filename() erzeugt wurden. Der zurückgegebene Wert liegt zwischen 0 (keine Ähnlichkeit) und 100 (identisch).
ssdeep (auch bekannt als Context Triggered Piecewise Hashing, CTPH) ist ein Verfahren, das – im Gegensatz zu kryptografischen Hashfunktionen wie SHA-256 – die Ähnlichkeit zweier Dateien oder Zeichenketten messen kann. Das macht es besonders nützlich bei der Malware-Analyse, Plagiaterkennung und der Duplikatsuche in großen Datenmengen.
Ein typischer Anwendungsfall ist die Erkennung leicht abgewandelter Dateivarianten: Zwei Dateien, die sich nur minimal unterscheiden, erhalten sehr ähnliche Fuzzy-Hashes und damit einen hohen Vergleichswert. Ein Wert von z. B. 80 deutet auf eine starke Ähnlichkeit hin, während 0 bedeutet, dass die Signaturen völlig unterschiedlich sind oder die Blockgrößen nicht kompatibel sind.
Die Funktion steht über die PECL-Erweiterung ssdeep zur Verfügung und muss entsprechend installiert und aktiviert sein. Ohne die installierte libfuzzy-Bibliothek ist die Erweiterung nicht nutzbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $signature1 Pflicht | string | Die erste Fuzzy-Hash-Signatur im ssdeep-Format, z. B. erzeugt durch ssdeep_fuzzy_hash(). |
|
| $signature2 Pflicht | string | Die zweite Fuzzy-Hash-Signatur im ssdeep-Format, die mit der ersten verglichen werden soll. |
Rückgabewert
0 bedeutet keine Ähnlichkeit oder inkompatible Blockgrößen; 100 bedeutet vollständige Übereinstimmung. Im Fehlerfall (z. B. ungültige Signaturen) wird ebenfalls 0 zurückgegeben.Beispiele
Zwei ähnliche Zeichenketten vergleichen
<?php
// Zwei nahezu identische Texte
$text1 = str_repeat('Das ist ein Testdokument fuer ssdeep. ', 100);
$text2 = str_repeat('Das ist ein Testdokument fuer ssdeep. ', 100) . ' Kleine Änderung am Ende.';
$hash1 = ssdeep_fuzzy_hash($text1);
$hash2 = ssdeep_fuzzy_hash($text2);
echo "Hash 1: " . $hash1 . PHP_EOL;
echo "Hash 2: " . $hash2 . PHP_EOL;
$score = ssdeep_fuzzy_compare($hash1, $hash2);
echo "Ähnlichkeitswert: " . $score . " / 100" . PHP_EOL;
// Ausgabe: Ähnlichkeitswert: 98 / 100 (oder ähnlich hoch)
Malware-Varianten-Erkennung anhand von Datei-Hashes
<?php
// Bekannte Malware-Signatur aus einer Datenbank
$knownMalwareSignature = '96:abc123xyz:def456uvw';
// Signatur einer verdächtigen Datei
$suspiciousHash = ssdeep_fuzzy_hash_filename('/pfad/zur/verdaechtigen/datei.exe');
if ($suspiciousHash === false) {
echo 'Fehler beim Hashen der Datei.' . PHP_EOL;
exit(1);
}
$similarity = ssdeep_fuzzy_compare($knownMalwareSignature, $suspiciousHash);
if ($similarity >= 70) {
echo "WARNUNG: Die Datei ähnelt bekannter Malware zu {$similarity}%!" . PHP_EOL;
} elseif ($similarity > 0) {
echo "Geringe Ähnlichkeit festgestellt: {$similarity}%." . PHP_EOL;
} else {
echo "Keine Ähnlichkeit mit bekannter Malware." . PHP_EOL;
}
// Wichtig · Fallstricke
Installationsvoraussetzung: Die Funktion ist nur verfügbar, wenn die PECL-Erweiterung ssdeep installiert und in der php.ini aktiviert ist (extension=ssdeep.so). Zusätzlich muss die C-Bibliothek libfuzzy auf dem System vorhanden sein.
Inkompatible Blockgrößen: ssdeep kann nur Signaturen vergleichen, deren Blockgröße übereinstimmt oder im Verhältnis 1:2 steht. Sind die Blockgrößen zu unterschiedlich, gibt die Funktion 0 zurück, auch wenn die Inhalte ähnlich sein sollten. Dies ist kein Fehler, sondern systemimmanent.
Kein kryptografischer Schutz: ssdeep-Hashes sind nicht für sicherheitskritische Anwendungen wie Passwort-Hashing oder Integritätsprüfungen geeignet. Sie dienen ausschließlich der Ähnlichkeitsmessung.