md5_file()
Artikel über die PHP-Funktion md5_file(), die den MD5-Hash einer Datei berechnet. Nützlich für Dateiverarbeitung, Integritätsprüfung und Deduplizierung.
Die PHP-Funktion md5_file() liest eine Datei und gibt den MD5-Hash ihres Inhalts als 32-stelligen hexadezimalen String zurück. Im Gegensatz zu md5(), das einen bereits im Speicher vorhandenen String hasht, liest md5_file() die Datei direkt von der Festplatte — so können Sie eine Datei beliebiger Größe mit einem Fingerabdruck versehen, ohne den gesamten Inhalt zuerst in eine Variable laden zu müssen.
Diese Seite behandelt die Syntax, beide Ausgabemodi, die praktischen Anwendungsfälle von md5_file() (Integritätsprüfung, Änderungserkennung, Deduplizierung), mögliche Fallstricke und Situationen, in denen MD5 das falsche Werkzeug ist.
Syntax
md5_file(string $filename, bool $binary = false): string|false| Parameter | Beschreibung |
|---|---|
$filename | Pfad zur zu hashenden Datei. Kann ein lokaler Pfad oder eine Stream-Wrapper-URL (http://, php://, etc.) sein, wenn Wrapper aktiviert sind. |
$binary | Bei false (Standard) wird ein 32-stelliger Kleinbuchstaben-Hex-String zurückgegeben. Bei true werden rohe 16 Byte Binärdaten zurückgegeben. |
Rückgabewert: den MD5-Hash bei Erfolg oder false, wenn die Datei nicht gelesen werden kann. (Vor PHP 8.0 hieß das zweite Argument $raw_output.)
Einfaches Beispiel
Der Hash wird aus den Bytes der Datei berechnet, daher liefert eine Datei mit dem exakten Text Hello, World! (ohne abschließenden Zeilenumbruch) immer denselben Digest:
Ausgabe:
65a8e27d8879283831b664bd8b7f0ad4Da MD5 deterministisch ist, liefert das Hashen desselben Inhalts überall — auf jeder Maschine, in jeder Sprache — diesen identischen Wert. Diese Eigenschaft macht die Funktion für die unten beschriebenen Anwendungsfälle nützlich.
Dateiintegrität prüfen
Der häufigste Anwendungsfall ist die Überprüfung, ob eine heruntergeladene Datei mit einer veröffentlichten Prüfsumme übereinstimmt. Vergleichen Sie den berechneten Hash mit dem erwarteten Wert mithilfe von hash_equals() (ein zeitsicherer Vergleich) anstatt ==:
<?php
$expected = "65a8e27d8879283831b664bd8b7f0ad4";
$actual = md5_file("example.txt");
if ($actual === false) {
echo "Could not read the file.";
} elseif (hash_equals($expected, $actual)) {
echo "File is intact.";
} else {
echo "File is corrupted or has been modified.";
}
?>Änderungen erkennen und deduplizieren
Das Speichern des Datei-Hashs ermöglicht eine einfache spätere Überprüfung, ob sich die Datei geändert hat: erneut hashen und mit dem gespeicherten Wert vergleichen. Zwei Dateien mit demselben Hash sind (mit überwältigender Wahrscheinlichkeit) byteweise identisch, was md5_file() zum Auffinden von Duplikaten nützlich macht:
<?php
$a = md5_file("photo1.jpg");
$b = md5_file("photo2.jpg");
echo ($a === $b) ? "Duplicate files\n" : "Different files\n";
?>Rohe Binärausgabe
Übergeben Sie true als zweites Argument, um die 16 rohen Bytes statt der 32 Hexadezimalzeichen zu erhalten. Dies ist nützlich, wenn Sie den Hash kompakt in einer BINARY(16)-Datenbankspalte mit fester Breite speichern möchten:
<?php
$raw = md5_file("example.txt", true);
echo strlen($raw); // 16 (bytes) instead of 32 (hex chars)
echo bin2hex($raw); // 65a8e27d8879283831b664bd8b7f0ad4
?>Fehlerbehandlung
Wenn der Pfad fehlt oder nicht lesbar ist, gibt md5_file() false zurück und gibt eine Warnung aus. Prüfen Sie immer, ob die Datei vorhanden ist, bevor Sie sie hashen, um einen klaren Fehler ausgeben zu können:
<?php
$filename = "example.txt";
if (!is_readable($filename)) {
echo "File not found or not readable.";
} else {
echo md5_file($filename);
}
?>Wann MD5 nicht verwendet werden sollte
MD5 ist schnell und geeignet für nicht sicherheitsrelevante Aufgaben wie Änderungserkennung, Caching-Schlüssel und Deduplizierung. Für Sicherheitszwecke ist es gebrochen: Angreifer können zwei verschiedene Dateien mit demselben MD5-Hash erstellen (eine Kollision). Verwenden Sie es nicht zum:
- Speichern von Passwörtern (verwenden Sie
password_hash()), - Schutz vor böswilliger Manipulation einer Datei.
Für manipulationssichere Fingerabdrücke bevorzugen Sie einen SHA-2-Family-Digest über hash_file():
<?php
echo hash_file("sha256", "example.txt");
?>Verwandte Funktionen
md5()— einen String statt einer Datei hashen.sha1_file()— SHA-1-Hash des Dateiinhalts.crc32()— schnelle 32-Bit-Prüfsumme zur Fehlererkennung.file_get_contents()— eine gesamte Datei in einen String einlesen.
Zusammenfassung
md5_file() gibt den MD5-Digest des Inhalts einer Datei zurück — standardmäßig als Hex-String oder als rohe Binärdaten mit $binary = true. Die Funktion ist ideal für Integritätsprüfung, Änderungserkennung und Deduplizierung, sollte jedoch nie für sicherheitskritische Aufgaben verwendet werden, bei denen ein SHA-2-Hash über hash_file() die richtige Wahl ist.