Start · Sprachen · PHP · Referenz · ssdeep_fuzzy_compare

ssdeep_fuzzy_compare

Funktion

Vergleicht zwei Fuzzy-Hash-Signaturen (ssdeep) und gibt einen Ähnlichkeitswert zwischen 0 und 100 zurück.

Kategorie: crypto

Signatur

ssdeep_fuzzy_compare(string $signature1, string $signature2): int

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

Typ
int
Beschreibung
Ein ganzzahliger Wert zwischen 0 und 100, der den Ähnlichkeitsgrad der beiden Signaturen angibt. 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)
Ähnlichkeitswert: 98 / 100

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.