Teil von  SELFPHP
Professional CronJob-Service

Suche

International PHP Conference


WebTech Conference


:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP?
In über 130.000 Beiträgen finden Sie sicher die passende Antwort!  

 
PHP Summit


Software Architecture Summit


:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 
HTML5 Days


JavaScript Days


:: Qozido ::

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler.   

 
 
Kryptografische Hash-Funktionen (MD5)

Am Ende der Seite finden Sie das komplette Beispiel als Download.

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.




 

Download

Info   ZIP BZIP2 TARGZ
Größe   1.21 Kilobyte 1.38 Kilobyte 1.30 Kilobyte

Alle Beispiele als PHP-Datei(en)

Hier haben Sie die Möglichkeit, sich sämtliche auf dieser Seite gezeigten Beispiele als PHP-Dateien direkt downzuloaden.

Umständliches Copy & Paste ist daher nicht mehr notwendig, da alle Beispiele sofort ausprobiert werden können.

Sie haben bei der Auswahl der bereitgestellten Downloads mehrere Möglichkeiten, je nachdem welches Komprimierungsverfahren Sie bevorzugen.

Zurück zur Übersichtsseite


 




:: Premium-Partner ::

Webhosting/Serverlösungen

Profihost AG weitere Premium-Partner
 

:: SELFPHP Sponsor ::

Kaspersky Labs GmbH weitere Sponsoren
 

:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Webhosting/Serverlösungen

Suchen Sie den für Sie passenden IT-Dienstleister für Ihr Webhosting-Paket oder Ihre Serverlösung?

Sie sind nur ein paar Klicks davon entfernt!


 

Ausgewählter Tipp im Bereich PHP-Skripte


Performance (Zeit) von Befehlen testen

Weitere interessante Beispiele aus dem SELFPHP Kochbuch finden Sie im Bereich PHP-Skripte
 

SELFPHP Code Snippet


Grafik mit base64 kodieren und am Browser ausgeben

Weitere interessante Code Snippets finden Sie auf SELFPHP im Bereich PHP Code Snippets
 
© 2001-2014 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt
© 2005-2014 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de