Die PHP-Funktion md5() erzeugt aus einem beliebigen String einen 128-Bit-Hashwert und gibt ihn als 32-stellige Hexadezimalzahl zurück. Der Algorithmus wurde 1991 von Ronald Rivest (RSA) entwickelt und gehört zu den bekanntesten Einweg-Hash-Funktionen. In diesem Tutorial erfährst du, wie md5() funktioniert, wofür du die Funktion noch sinnvoll einsetzen kannst und warum sie für Passwörter längst nicht mehr geeignet ist.

Zum Einstieg wird erklärt, wie der MD5-Algorithmus arbeitet und welche Eigenschaften einen kryptografischen Hash auszeichnen.
Was ist MD5?
MD5 steht für Message-Digest Algorithm 5. Die Funktion nimmt eine Eingabe beliebiger Länge entgegen und erzeugt daraus eine Prüfsumme mit einer festen Länge von 32 hexadezimalen Zeichen. Dieser Vorgang ist eine Einweg-Operation: Aus dem erzeugten Hash lässt sich der ursprüngliche Wert nicht zurückrechnen. Selbst kleinste Änderungen an der Eingabe führen zu einem völlig anderen Hashwert.
graph LR
A["Eingabe: Hallo Welt"] --> B["md5()"]
B --> C["32-stelliger Hex-Hash"]
D["Eingabe: Hallo welt"] --> E["md5()"]
E --> F["Komplett anderer Hash"]
Syntax und Parameter
Die Funktion md5() erwartet einen String als Pflichtparameter und einen optionalen booleschen Wert für die Ausgabe im Binärformat.
<?php
/* Syntax der md5-Funktion */
md5(string $string, bool $raw_output = false): string
/* $string: Der zu hashende Text (Pflichtparameter) */
/* $raw_output: false = 32 Zeichen Hex, true = 16 Byte Binärstring */
Wenn der Parameter raw_output auf true gesetzt wird, gibt die Funktion den Hash als 16 Byte langen Binärstring zurück. Im Standardfall (false) erhältst du die übliche 32-stellige Hexadezimalzahl.
MD5-Hash erzeugen
Das Erzeugen eines MD5-Hashes ist mit PHP denkbar einfach. Die folgenden Beispiele zeigen die grundlegende Verwendung der Funktion.
<?php
/* Einfachen MD5-Hash erzeugen */
$text = "Hallo Welt";
$hash = md5($text);
echo $hash;
/* Ausgabe: d41aee10dc8e004dad6fb5e23a8bfab6 */
/* Hash mit raw_output als Binärstring */
$raw = md5($text, true);
echo strlen($raw);
/* Ausgabe: 16 */
/* Zwei Strings vergleichen */
$hash1 = md5("PHP Tutorial");
$hash2 = md5("PHP tutorial");
if ($hash1 !== $hash2) {
echo "Die Hashes unterscheiden sich.";
}
/* Groß- und Kleinschreibung erzeugt verschiedene Hashes */
Wie das Beispiel zeigt, reicht bereits die Änderung eines einzigen Buchstabens, um einen vollkommen anderen Hash zu erhalten. Diese Eigenschaft macht MD5 nützlich für Integritätsprüfungen.
md5_file(): Prüfsumme einer Datei berechnen
Neben md5() bietet PHP die Funktion md5_file(), die den Hash direkt aus dem Inhalt einer Datei berechnet. Das ist effizienter, als den gesamten Dateiinhalt zuerst in eine Variable zu laden.
<?php
/* Prüfsumme einer Datei berechnen */
$datei = "dokument.pdf";
$hash = md5_file($datei);
echo "MD5-Prüfsumme: " . $hash;
/* Zwei Dateien auf identischen Inhalt prüfen */
$hash_original = md5_file("original.zip");
$hash_kopie = md5_file("kopie.zip");
if ($hash_original === $hash_kopie) {
echo "Die Dateien sind identisch.";
} else {
echo "Die Dateien unterscheiden sich.";
}
Mit md5_file() lassen sich Dateiübertragungen verifizieren oder doppelte Dateien in einem Verzeichnis aufspüren, ohne den gesamten Inhalt byteweise vergleichen zu müssen.
Warum MD5 für Passwörter unsicher ist
Seit 2004 gilt MD5 als nicht mehr kollisionssicher. Forscher haben bewiesen, dass sich zwei unterschiedliche Eingaben finden lassen, die denselben Hash erzeugen. Darüber hinaus sind MD5-Hashes anfällig für Brute-Force-Angriffe und Rainbow-Table-Attacken, da moderne Hardware Milliarden von MD5-Hashes pro Sekunde berechnen kann. Ein MD5-gehashtes Passwort lässt sich daher in Sekunden knacken. Für die sichere Speicherung von Passwörtern solltest du deshalb ausschließlich moderne Hashing-Verfahren verwenden.
Sichere Alternativen
PHP bietet leistungsfähige Alternativen, die für sicherheitskritische Anwendungen entwickelt wurden.
password_hash() für Passwörter
Die Funktion password_hash() nutzt standardmäßig den bcrypt-Algorithmus und erzeugt automatisch einen zufälligen Salt. In Kombination mit password_verify() ergibt sich ein sicheres System zur Passwortverwaltung.
<?php
/* Passwort sicher hashen mit password_hash() */
$passwort = "MeinSicheresPasswort123";
$hash = password_hash($passwort, PASSWORD_DEFAULT);
echo $hash;
/* Ausgabe: $2y$10$... (bcrypt-Hash mit Salt) */
/* Passwort bei Login verifizieren */
$eingabe = "MeinSicheresPasswort123";
if (password_verify($eingabe, $hash)) {
echo "Passwort ist korrekt.";
} else {
echo "Passwort ist falsch.";
}
hash() für allgemeine Hashes (SHA-256, SHA-512)
Für allgemeine kryptografische Zwecke stellt PHP die Funktion hash() bereit. Sie unterstützt zahlreiche Algorithmen wie SHA-256 und SHA-512, die deutlich kollisionssicherer als MD5 sind.
<?php
/* SHA-256-Hash erzeugen */
$text = "Wichtige Daten";
$sha256 = hash("sha256", $text);
echo $sha256;
/* Ausgabe: 64-stelliger Hexadezimal-Hash */
/* SHA-512 für noch längere Hashes */
$sha512 = hash("sha512", $text);
echo $sha512;
/* Ausgabe: 128-stelliger Hexadezimal-Hash */
Wofür MD5 noch sinnvoll ist
Trotz der kryptografischen Schwächen hat MD5 weiterhin seine Berechtigung in nicht sicherheitskritischen Bereichen. Für Cache-Schlüssel eignet sich MD5 hervorragend, da aus langen URLs oder Abfragen ein kompakter Schlüssel erzeugt werden kann. Bei Dateivergleichen lässt sich über die Prüfsumme schnell feststellen, ob sich eine Datei verändert hat. Auch als ETag-Header in HTTP-Antworten wird MD5 häufig eingesetzt, um dem Browser mitzuteilen, ob sich eine Ressource geändert hat. Ebenso bietet sich MD5 an, um eindeutige Dateinamen für hochgeladene Dateien zu generieren oder Daten in gleichmäßig verteilte Buckets aufzuteilen.
Zum schnellen Ausprobieren verschiedener Hash-Algorithmen steht der MD5- und Hash-Generator als Online-Werkzeug bereit.
Fazit
Die Funktion md5() ist in PHP schnell und unkompliziert einsetzbar. Sie erzeugt zuverlässig einen 32 Zeichen langen Hashwert und eignet sich für Dateivergleiche, Cache-Schlüssel und Integritätsprüfungen. Für die sichere Speicherung von Passwörtern ist MD5 jedoch keine Option mehr. Verwende stattdessen password_hash() mit bcrypt oder die hash()-Funktion mit SHA-256 bzw. SHA-512 für kryptografisch anspruchsvolle Aufgaben. So nutzt du für jeden Anwendungsfall das passende Werkzeug.