Signatur
Beschreibung
ssdeep_fuzzy_hash_filename() berechnet einen Fuzzy-Hash (auch bekannt als Context-Triggered Piecewise Hash, CTPH) einer Datei unter Verwendung des ssdeep-Algorithmus. Im Gegensatz zu kryptografischen Hashes wie MD5 oder SHA-256, die bei kleinsten Änderungen einen völlig anderen Hash erzeugen, erlaubt ein Fuzzy-Hash den Vergleich zweier Hashes hinsichtlich ihrer Ähnlichkeit.
Das Verfahren ist besonders in der digitalen Forensik, bei der Malware-Analyse sowie bei der Erkennung von nahezu identischen Dateien (z. B. leicht veränderte Dokumente oder Binärdateien) von großem Nutzen. Damit lässt sich feststellen, ob zwei Dateien einen gemeinsamen Ursprung haben oder wie stark sie voneinander abweichen.
Die Funktion liest die Datei direkt vom Dateisystem. Der Rückgabewert ist ein String im ssdeep-Format (z. B. 3:AXGBicFlgVNhBGcL6wCrFQEv:AXGHsNhxLsr2C), der anschließend mit ssdeep_fuzzy_compare() verglichen werden kann, um einen Ähnlichkeitswert von 0–100 zu erhalten.
Die Funktion erfordert die PHP-Erweiterung ssdeep (ext-ssdeep), die separat installiert werden muss und die native ssdeep-Bibliothek als Abhängigkeit hat.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $file_name Pflicht | string | Der Pfad zur Datei, aus der der Fuzzy-Hash berechnet werden soll. Die Datei muss lesbar und vorhanden sein. |
Rückgabewert
string zurück. Im Fehlerfall (z. B. Datei nicht gefunden oder nicht lesbar) wird false zurückgegeben.Beispiele
Fuzzy-Hash einer einzelnen Datei berechnen
<?php
// Fuzzy-Hash einer Datei erzeugen
$hash = ssdeep_fuzzy_hash_filename('/var/www/uploads/document.pdf');
if ($hash === false) {
echo "Fehler: Datei konnte nicht verarbeitet werden.";
} else {
echo "Fuzzy-Hash: " . $hash . PHP_EOL;
}
// Beispielausgabe:
// Fuzzy-Hash: 192:abc123XYZdefGHI456jklMNO789pqrSTU:abc123XY
Zwei Dateien auf Ähnlichkeit prüfen
<?php
// Fuzzy-Hashes zweier Dateien berechnen
$hash1 = ssdeep_fuzzy_hash_filename('/var/www/files/original.exe');
$hash2 = ssdeep_fuzzy_hash_filename('/var/www/files/modified.exe');
if ($hash1 === false || $hash2 === false) {
echo "Eine oder beide Dateien konnten nicht verarbeitet werden.";
} else {
// Ähnlichkeit berechnen (0 = vollständig unterschiedlich, 100 = identisch)
$similarity = ssdeep_fuzzy_compare($hash1, $hash2);
echo "Hash 1: " . $hash1 . PHP_EOL;
echo "Hash 2: " . $hash2 . PHP_EOL;
echo "Ähnlichkeitswert: " . $similarity . "/100" . PHP_EOL;
if ($similarity >= 80) {
echo "Warnung: Die Dateien sind sehr ähnlich – mögliche Malware-Variante!";
}
}
// Wichtig · Fallstricke
Erweiterung erforderlich: Diese Funktion ist nur verfügbar, wenn die PHP-Erweiterung ssdeep installiert ist (pecl install ssdeep). Zusätzlich muss die native libfuzzy-Bibliothek auf dem System vorhanden sein.
Sicherheitshinweis: Stellen Sie sicher, dass Dateinamen, die aus Benutzereingaben stammen, vor der Übergabe an diese Funktion validiert und sanitiert werden, um Path-Traversal-Angriffe zu verhindern. Verwenden Sie realpath() und prüfen Sie, ob der resultierende Pfad innerhalb eines erlaubten Verzeichnisses liegt.
Nicht für kryptografische Zwecke geeignet: Fuzzy-Hashes sind keine kryptografischen Hashes und bieten keine Kollisionsresistenz. Sie sollten nicht zur Integritätsprüfung oder zur Passwort-Speicherung eingesetzt werden.
Dateigröße: Sehr kleine Dateien (wenige Bytes) können zu unzuverlässigen oder leeren Hash-Ergebnissen führen, da der CTPH-Algorithmus eine Mindestmenge an Daten benötigt.