Systemvoraussetzung
- Linux
- Windows
- PHP 4 >= 4.2.0
- PHP 5
Datei(en)
md5.php
Problem
Sie haben im vorangegangenen Beispiel gesehen, wie Prüfsummen von Dateien
erstellt werden können. Diese Methode ist allerdings nur für die Übermittlung
von Daten geeignet, also ob sie vollständig übertragen wurden.
Wenn Sie einen wirklichen Schutz benötigen, also hundertprozentig sicher
sein wollen, dass Ihre Dateien nicht manipuliert wurden, müssen Sie auf eine
kryprografische Hash-Funktion
wie z. B. MD5 zurückgreifen.
Sicher ist Ihnen das ein oder andere Mal aufgefallen, dass Webseitenbetreiber,
die eine Software zum Download anbieten, in Klammern einen MD5-Code
mit
angeben. Hierbei handelt es sich um die Prüfsumme – der Webseitenbetreiber
will damit sicher gehen, dass jede Person, die diese Datei besitzt (auch wenn
Sie nicht direkt von der eigenen Website, sondern von einem Mirror geladen
wurde), auch wirklich die originale Datei vorliegen hat und keine manipulierte
Datei, die z. B. einen Virus enthält.
Lösung
Wie erwähnt müssen wir bei dieser Problemstellung auf die kryprografische
Hash-Funktion
zurückgreifen. In unserem Beispiel werden wir daher mittels
MD5 (Message Digest Algorithm 5) eine derartige Prüfsumme erstellen.
MD5 ist eine weit verbreitete kryptografische Hash-Funktion,
die einen 128-Bit-Hash-Wert
erzeugt. Wie auch im vorherigen Beispiel werden wir jeweils für eine
Datei eine Prüfsummendatei erzeugen, allerdings müssen Sie diese Prüfsumme
online neben oder unter Ihrer Downloaddatei selbst einpflegen. Die erstellten
Dateien sind lediglich für Sie, damit Sie jederzeit die MD5-Prüfsumme
zur
Hand haben.
Natürlich könnten Sie auch die sfv-Datei
mit der Prüfsumme zum Download
anbieten, in der Regel wird es aber nicht gemacht. Mit der Prüfsumme von Ihrer
Webseite kann man jetzt Ihre Software von einem beliebigen Server weltweit
downloaden und überprüfen, ob es sich um die original von Ihnen erstellte
Datei handelt.
Inhalt der .md5.sfvDatei
; Erstellt von SELFPHP MD5
; 03.04.2006 06:59:33
;
pecl5.1.2Win32.zip 09571722fd44bec411a64eca8ca383ae |
In unserem Beispiel wurde die Prüfsumme wie folgt erstellt:
Zu prüfende Datei: pecl5.1.2Win32.zip
MD5-Prüfsumme:
09571722fd44bec411a64eca8ca383ae
Die ersten drei Zeilen sind nur Kommentarzeilen, die beinhalten, wer die Datei
erstellt hat und wann sie erstellt wurde. Die vierte Zeile ist das eigentliche
Kernstück der Datei. Zum einen beinhaltet sie den Dateinamen unserer zu
prüfenden Datei und zum anderen die MD5Prüfsumme
als hexadezimale
Repräsentation. Beide Werte sind lediglich mit einem Leerzeichen voneinander
getrennt.
function createMD5($file)
@param string $file
@return mixed
Die Function createMD5() erwartet als einzigen Parameter den Dateinamen
für die Prüfsummenerstellung. Diese könnte z. B. eine ausführbare Datei sein,
also z. B. ein Setupprogramm für Ihre Software.
Im ersten Schritt wird überprüft (34), ob die angegebene Datei existiert. Sollte
die Prüfung erfolgreich sein, wird anhand der Funktion md5_file() (36) direkt
eine MD5-Prüfsumme
erstellt. Alternativ könnten Sie hier auch mit der
Funktion md5() arbeiten, dieses erfordert aber ein paar Programmzeilen mehr
bei der Erstellung der Prüfsumme.
Im nächsten Schritt erstellen wir unsere sfv-Datei
mit den Informationen (38-41)
für eine spätere Prüfsummenvalidierung. Wichtig ist hierbei, dass wir nur
den Dateinamen (41) in die sfv-Datei
speichern. Daher extrahieren wir mit
basename() den Dateinamen aus unserem eventuellen Pfad.
Getrennt von einem Leerzeichen wird unsere MD5-Prüfsumme
in hexadezimaler
Darstellung mit in die Datei gespeichert. Zum Schluss erstellen wir eine
neue sfv-Datei
(43-45),
die als Dateinamen unseren ursprünglichen Dateinamen
und als Dateiendung md5.sfv enthält. Die Funktion gibt bei Erfolg die
MD5-Prüfsumme
zurück (47), ansonsten FALSE.
033: 034: 035: 036: 037: 038: 039: 040: 041: 042: 043: 044: 045: 046: 047: 048: 049: 050: 051: 052: 053: |
function createMD5($file)
{
if(file_exists($file)) {
$md5 = md5_file($file); $crcText .= "; Erstellt von SELFPHP MD5\n"; $crcText .= "; " . date("d.m.Y H:i:s") . "\n"; $crcText .= ";\n"; $crcText .= basename($file) . " " . $md5 . "\n";
$handle = fopen ($file.".md5.sfv", "w"); fputs ($handle, $crcText); fclose ($handle); return $md5; } return false; }
|
Beispiel 12.7: md5.php
function checkMD5($file)
@param string $file
@return mixed
Die Funktion checkMD5() erwartet als einzigen Parameter den Dateinamen
der md5.sfv-Datei.
Diese beinhaltet den Dateinamen für die zu prüfende Datei
sowie die MD5-Prüfsumme.
Wieder überprüfen wir zuerst, ob die md5.sfv-Datei
vorhanden ist (65), bevor wir diese einlesen (67). Die Funktion file() liest
unsere sfv-Datei
zeilenweise in ein Array ein.
Da wir wissen, dass unsere Zeile an der vierten Position ist und somit im Array
den Index 3 hat, ist es jetzt kein Problem, den Wertebereich auszulesen. Wir
trennen also unsere Zeile anhand des Leerzeichen mit der Funktion explode()
(68) und erhalten als Ergebnis ein Array mit zwei Einträgen.
Im Index 0 (Null) des Arrays befindet sich unser Dateiname und im Index
1 (Eins) unsere MD5-Prüfsumme.
Nachdem wir überprüft haben, ob die zu
prüfende Datei vorhanden ist (10), können wir jetzt direkt mit der Funktion
md5_file() die Prüfsumme der angegebenen Datei erstellen und in die
Variable $md5 (72) einlesen.
Wir vergleichen (74) im nächsten Schritt die gerade erstellte MD5-Prüfsumme
mit der Prüfsumme aus unserer md5.sfv-Datei.
Obwohl die Funktion md5_
file() einen String zurückgibt, würde der direkte Vergleich scheitern. Aus diesem
Grund setzen wir explizit die gerade erstellte Prüfsumme mit settype()
auf „string“ und prüfen die beiden Werte.
Sollte der Vergleich erfolgreich sein, wird die Funktion TRUE zurückliefern,
also dass die Datei nicht beschädigt ist, ansonsten FALSE.
063: 064: 065: 066: 067: 068: 069: 070: 071: 072: 073: 074: 075: 076: 077: 078: 079: 080: 081: 082: 083: 084: 085: |
function checkMD5($file)
{
if(file_exists($file)) {
$sfvString = file($file); $sfv = explode(" ", $sfvString[3]); if(file_exists($sfv[0])) {
$md5 = md5_file($sfv[0]); if(settype($md5, "string") == $sfv[1]) return true; else return false; } } return false; }
|
Beispiel 12.8: md5.php
Bei der Überprüfung ist es völlig egal, welchen Dateityp Sie überprüfen möchten.
Sie sollten allerdings die md5.sfv-Dateien
an einem sicheren Ort aufbewahren,
da diese die Prüfsummen enthalten. Jeder Besucher Ihrer Webseite,
vorausgesetzt Sie listen die MD5-Prüfsumme
bei Ihren Downloads mit auf,
kann jetzt selbst prüfen, ob es sich bei der Datei um die original erstellte Datei
handelt.
087: 088: 089: 090: 091: 092: 093: 094: 095: 096: 097: 098: 099:
| // Name der Datei
$fileCRC = 'pecl-5.1.2-Win32.zip';
// Name der sfv-Datei $fileSFV = 'pecl-5.1.2-Win32.zip.md5.sfv';
$md5Sum = createMD5($fileCRC); echo $md5Sum . '<br>'; if(checkMD5($fileSFV)) echo 'Datei ist unbeschädigt<br>'; else echo 'Datei ist beschädigt.'; |
Beispiel 12.9: md5.php
Wie Sie sehen, kann man mit wenig Aufwand eine sichere Überprüfung vornehmen.
Sie können die Darstellung der Ausgabe selbst beeinflussen. Je nachdem
erhalten Sie von den Funktionen entweder TRUE bei Erfolg, die Prüfsumme
oder FALSE bei Misserfolg zurückgeliefert.
09571722fd44bec411a64eca8ca383ae Datei ist unbeschädigt |
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
|