Hochschule Wismar Fachbereich Wirtschaft Ausarbeitung Kyprographie Verschlüsselung und Authentifizierung in PHP eingereicht von: Andreas Binder Studiengang Wirtschaftsinformatik Matrikel Nr. : 99837 Betreuer: Prof. Dr. J. Cleve Wismar, den June 28, 2004 Contents 1 Einführung in PHP 1.1 Definition . . . . 1.2 Entwicklung . . . 1.3 Vorteile . . . . . 1.4 Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 4 2 Verschlüsselungsfunktionen in PHP 2.1 MD5 (Message Digests) . . . . . . . . . . . 2.1.1 Entwicklung zu MD5 . . . . . . . . . 2.1.2 Die Arbeitsweise von MD5 . . . . . 2.1.3 Die Sicherheit von MD5 . . . . . . . 2.2 Weitere Verschlüsselungsfunktionen in PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 6 8 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Benutzerauthentifizierung 11 3.1 Basic Authentication . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 Authentifizierung durch Formulare . . . . . . . . . . . . . . . . . 13 4 Sichere Datenübertragung im Internet über SSL 15 5 Anhang A: md5.php 17 6 Literaturverzeichnis 20 1 1 1.1 Einführung in PHP Definition PHP ist eine Skriptsprache zur Erstellung dynamischer Websites. Unter dynamischen Webseiten werden Seiten verstanden, deren endgültige, an den Client gesendete Form erst im Augenblick des Abrufes entsteht. So können Daten interaktiv in die Seiten eingebaut werden. 1.2 Entwicklung Die erste Version entwickelte 1994 Rasmus Lerdorf, der eigentlich nur eine Möglichkeit zur Programmierung seines eigenen Webservers suchte. Er nannte seine entwickelte Skriptmaschine ,,Personal Home Page Tools“. Die Applikation stellte er ins Netz und ließ die freie Verbreitung zu. So entstand PHP, als Abkürzung zu ,,Personal Home Page“. Später entwickelten die Open Source Gemeinde die rekursive Version ,,PHP HyperText Preprocessor“. Einen offiziellen Namen gibt es darüber hinaus nicht. Den Weg zum professionellen Programm ging PHP erst 1995. Unter dem Namen PHP/FI (,,Personal Homepage Tools/Form Interface“) wurde die erste wirklich nutzbare Version veröffentlicht. PHP/FI wird als Version 2 angesehen. PHP entwickelte sich seit dieser Zeit rasant weiter. Seit Mitte 1997 wird PHP von einem Team an Programmierern rund um Rasmus Lerdorf weiterentwickelt. Mit der Version 3 stand bereits Anfang 1999 ein System zur Verfügung, das keine Konkurrenz seitens Perl oder ASP mehr fürchten muss. Der nächste Schritt, PHP 4, wurde im Jahr 2000 vollendet. Im Zusammenhang mit PHP 4 ist oft auch von Zend die Rede. Zend ist ein Kunstwort aus ”ZEev“ und ”aNDi“, den Vornamen der Entwickler Zeev Suraski und Andi Gutman. Zend ist aber keine Konkurrenz zu PHP, sondern der Kernel der neuen Version PHP 4. Zend 1.0 sorgt dafür das PHP 4 deutlich schneller und leistungsfähiger als PHP 3 ist. Zusätzlich gibt es einen ”Zend Optimizer“, der die Leistung der Skripte nochmals verbessert. In regelmäßigen Abständen werden immer neue Bibliotheken integriert, was zu einem drastischen Anwachsen der Funktionsanzahl führt. Zum anderen wird PHP immer stabiler und schneller. Diskutiert wird auch zunehmen – über die Zukunft von PHP, über PHP 5 und verschiedene Aktivitäten der Entwickler. Kritisch werden kommerzielle Zusatzprodukte der Zend-Entwickler gesehen, darunter der Zend-Encoder (verschlüsselt PHP-Code) und der ZendCache (beschleunigt die Abarbeitung). Beides Programme, die nicht mehr Open Source sind, sondern gegen einen nicht unerheblichen Betrag verkauft werden. Damit entzündete sich natürlich die Diskussion, wer künftig über den Kern der 2 Sprache mitbestimmen darf. Auch die Forderungen nach einem Applikationsserver – ähnlich Java – werden immer wieder erhoben. Auch hier ist von Zend nichts zu sehen. Einige lehnen derart komplexe Programme ab, weil es den Einsatz erschwert und damit die massenweise Verwendung von PHP behindert. Professionelle Entwickler spüren jedoch die Grenzen, die ihnen PHP setzt und fühlen sich – je nach Systemwelt – zu Microsofts .net oder Suns Java getrieben. Im Laufe der nächsten Monate ist mit der finalen Version von PHP 5 zu rechen. 1.3 Vorteile Der Vorteil von dynamischen Websites, und damit auch von PHP besteht vor allem in der Möglichkeit, auf Nutzereingaben reagieren zu können. Formulare lassen sich sofort auswerten und schon die nächste Seite kann den Inhalt wiedergeben oder Reaktionen darauf zeigen. Zum Erfolg von PHP trug auch die freie Verfügbarkeit bei. Die ist bei den Konkurrenten ASP und bei Perl zwar auch gegeben, aber PHP ist im Gegensatz dazu eine Sprache, deren einziger Zweck das Web ist. ASP kommt mit VBScript daher, einem BASIC-Derivat, das nur schwer an die Bedürfnisse eines Webservers angepasst werden kann. Moderne Sprachelemente wie die objektorientierte Programmierung sind nur unvollkommen umgesetzt. Der größte Nachteil ist aber die Einschränkung auf Microsoft-Plattformen. Perl wurde schon 1986 von Larry Wall entworfen, zu dieser Zeit war das Web noch unbekannt. Die starken Zeichenkettenfunktionen und die freie Verbreitung als Open Source machten Perl den Weg ins Web frei. Leider ist die Lesbarkeit nicht einfach und die Programmierung vor allem für Anfänger sehr kompliziert. Aus der Beobachtung der Nachteile von Perl entstand eine Skriptsprache, die diese vermeidet und dafür alle Vorteile der Konkurrenten in sich vereint – PHP. Zum einen wird die von ASP bekannte einfache Kombination mit HTML genutzt, zum anderen die leistungsstarke und verbreitete C-Syntax, die vielen schon von JavaScript oder Java bekannt ist. Objektorientiertes Programmieren ist ansatzweise möglich, ebenso wie eine gute Modularisierung. PHP besticht außerdem durch einen riesigen Funktionsumfang. Hier kann keine andere Sprache mithalten. Wo immer ein Programmierer ein Problem zu lösen hatte, wurde der Funktionsumfang erweitert. Besonders deutlich wird dies bei den Datenbankfunktionen und der daraus entstandenen guten Unterstützung für die Datenbank MySQL, die wie PHP auch als Open Source verfügbar ist. 3 1.4 Funktionsweise Die Entstehung einer dynamischen Website wird in der nachfolgenden Abbildung erläutert. Zuerst fordert der Nutzer mit seinem Browser ein Skript an. Der Webserver leitet diese Anfrage aufgrund der Dateierweiterung an ein bestimmtes Programm weiter, beispielsweise das PHP-Modul. Dort wird die Seite durchsucht und darin enthaltene Codes werden ausgeführt. Daraus entsteht wiederum HTML-Code, einschließlich der Daten aus Datenbankabfragen oder früheren Nutzereingaben. Die fertige Seite wird dem Webserver zurückgegeben, der sie dann an den Browser sendet. Figure 1: Auslieferung einer dynamischen Website Als Skriptsprache neben PHP sind ASP (Active Server Pages) mit den Sprachen VBScript und JScript, ASP+ mit zusätzlicher Unterstützung für C# und als letztes Perl. Seltener verwendet werden JavaScript (Netscape Webserver) oder Python. 4 2 Verschlüsselungsfunktionen in PHP Verschlüsselung ist ein fester Bestandteil von PHP-Skripten und viele Programmierer haben sich diese Art der Datenverarbeitung in vielen Bereichen als Basis gesetzt. Bei der Speicherung von Passwörtern beispielsweise, muss der Programmierer sehr auf die Sicherheit und Zuverlässigkeit seines Skriptes achten. Gerade die Sicherheit bei Passwörtern und anderen, ähnlich wichtigen und vertraulichen, Daten ist eine höchst empfindliche Angelegenheit. In PHP hat man die Auswahl zwischen Einwegverschlüsselung, das heißt nur Verschlüsselung und keine Entschlüsselung, und Mehrwegverschlüsselung, das heißt Ver- und Entschlüsselung. Standardgemäß werden die Einwegverschlüsselungsmethoden md5() und crypt() sowie die Mehrwegverschlüsselungsmethoden base64 encode() beziehungsweise base64 decode() unterstützt. Weitere Methoden stehen nach Einbindung entsprechender Bibliotheken zur Verfügung. 2.1 MD5 (Message Digests) Die Message Digests sind die am häufigsten eingesetzten Prüfsummenverfahren. Es gibt verschiedene Entwicklungsstufen, wobei alle Verfahren von Ron Rivest von RSA Datasecurity Inc. entwickelt wurden. Sie wurden erschaffen für Applikationen zur digitalen Signatur, in denen große Nachrichten oder Dateien, sicher komprimiert werden müssen, bevor sie mit dem private key signiert werden. Alle Verfahren nehmen eine Nachricht willkürlicher Länge und produzieren einen 128 Bit message digest (kryptografische Prüfsumme), wobei die Struktur der Algorithmen ziemlich ähnlich ist, das Design aber zwischen den Versionen differiert. 2.1.1 Entwicklung zu MD5 MD1 MD1 gelang nie über das Experimentierstadium hinaus und wurde auch nicht veröffentlicht. MD2 MD2 wurde 1989 entwickelt und 1992 im RFC 1319 beschrieben. Über Schwächen des Algorithmus findet sich in der Literatur eine unterschiedliche Auffassung, generell gilt MD2 aber nicht mehr als sicher. MD3 Das Schicksal von MD3 ist ein ähnliches wie das von MD1. Es hatte sehr viele Mängel und die Entwicklung blieb im Experimentierstadium stecken MD4 MD4 wurde von Rivest 1990 entwickelt und dokumentiert in RFC 1320. Es ist insbesondere auf Geschwindigkeit auf 32-Bit-Maschinen optimiert und erzeugt Hash-Werte mit extrem schnellen Funktionen, wobei dies aber auch ein Prob- 5 lem darstellt: RSA selbst veröffentlichte eine Methode, die innerhalb von einer Stunde zwei bis auf ein Zeichen identische Nachrichten erzeugen konnte, die den selben Hash-Wert ergeben.1 Aus diesem Grund sollte MD4 auf keinen Fall mehr eingesetzt werden. MD5 Auch der MD5 wurde von Ron Rivest vom MIT entwickelt und 1992 beschrieben in den RFC 1321. MD5 kann als direkte Weiterentwicklung von MD4 angesehen werden, und hatte das Ziel, die Unsicherheiten seines Vorgängers zu beseitigen. Durch andere Verwendung der Funktionen und dadurch, dass jeder Schritt vom Ergebnis des vorigen abhängt, ist MD5 deutlich langsamer als MD4. 2.1.2 Die Arbeitsweise von MD5 Um die Prüfsumme einer Nachricht oder Datei zu generieren, arbeitet MD5 in 5 Schritten, die nachfolgend beschrieben werden. Schritt 1 Zuerst wird die Eingabedatei mit Bits aufgefüllt (das erste Füllbit ist 1, alle anderen sind 0), so dass nach Auffüllung die Länge der Datei ein Vielfaches von 448 Bit ist. Dieser wird anschließend noch eine 64-Bit-Zahl angehängt, die die Länge der Ursprungsdatei oder Ursprungsnachricht angibt. Somit erhält man eine Länge, die ein Vielfaches von 512 Bit ist und sicherstellt, dass verschiedene beziehungsweise verschieden lange Dateien nach dem Auffüllen nicht identisch sind. Schritt 2 Im 2. Schritt werden vier so genannten Verkettungsvariablen initialisiert mit folgenden Werten: a = 0x67452301 b = 0xefcdab89 c = 0x98badcfe d = 0x10325476 Schritt 3 Die 512-Bit-Eingabeblöcke werden in diesem Schritt in sechzehn 32-Bit-Teilblöcke Mj unterteilt und durch vier Runden geschickt, wobei diese Runden jeweils in gleicher Weise durchlaufen werden. Als erstes werden die Verkettungsvariablen in die Hilfsvariablen A, B, C und D kopiert, so dass sie dem Initialisierungsvektor2 entsprechen. 1 http://www.rsasecurity.com/rsalabs/cryptobytes/index.html Initialisierungsvektor: Eine Zufallssequenz bestimmter Länge, die zum Initialisieren einer Blockchiffrierung in einem bestimmten Modus benötigt wird. Meist entspricht die Länge der Blockgröße des Algorithmus. 2 6 In jeder Runde kommt jeweils eine von vier Funktionen zum Einsatz, in denen ein Eingabeblock über die binären Operationen AND, OR, XOR und NOT mit den Variablen a, b, c und d verknüpft wird: Runde Runde Runde Runde 1: 2: 3: 4: F(X,Y,Z) = (X ∧ Y) ∨ (˜X ∧ Z) G(X,Y,Z) = (X ∧ Z) ∨ (Y ∧ Z̄) H(X,Y,Z) = (X ⊕ Y ⊕ Z) I(X,Y,Z) = Y ⊕ (X ∨ ˜Z) Weiter werden noch 64 Konstanten ti definiert durch ti = * int(sin(i)), die per Addition in das Ergebnis einfließen (Runde 1: i=1...16, Runde 2: i=17...32, Runde 3: i=33...48 und Runde 4: i=49...64). Als dritten vordefinierten Faktor dienen folgende Konstanten ri , die als Linksshift3 um s Stellen auf Ergebnis einwirken: Schritt Runde 1 Runde 2 Runde 3 Runde 4 0 7 5 4 6 1 12 9 11 10 2 17 14 16 15 3 22 20 23 21 4 7 5 4 6 5 12 9 11 10 6 17 14 16 15 7 22 20 23 21 8 7 5 4 6 9 12 9 11 10 10 17 14 16 15 11 22 20 23 21 12 7 5 4 6 14 12 9 11 10 Die Register B, C und D werden nun in Runde 1 durch die Funktion F zusammengefasst und zu dem Inhalt von Register A addiert. Hierzu werden nun ein bestimmtes rundenabhängiges Mj und das zugehörige Ti addiert. Das erhaltene Ergebnis wird um s Stellen linksrotiert und anschließend zu Register B hinzuaddiert. Abschließend werden die Register vertauscht, so dass (A,B,C,D)→(D,A,B,C) zugeordnet wird. Jetzt beginnt die zweite Runde mit der Funktion G, und so weiter. 3 Linksshift: Rotation auf Bitebene um eine bestimmte Anzahl nach links. 7 13 17 14 16 15 15 22 20 23 21 Figure 2: Berechnung der Verkettungsvariablen Schritt 4 Nach Durchlauf der vier Runden werden die Variablen A, B, C und D zu den Verkettungsvariablen a, b, c und d addiert und das Ergebnis konkateniert: A˚B˚C˚D Schritt 5 Die Schritte 3 und 4 werden dann mit allen 512-Bit-Blöcken durchgeführt, wobei das jeweilige Ergebnis aus Runde 4 als Eingabe für A, B, C und D weiterverarbeitet wird. Der letzte 128-Bit-Ausgabeblock ist dann die Prüfsumme aller Datenblöcke 2.1.3 Die Sicherheit von MD5 Rivest gibt den Aufwand, um eine Kollision zu erzeugen, mit 264 Operationen und den Aufwand, zu einem gegebenen Hashwert die zugehörige Nachricht zu finden, mit 2128 an. Es gab viele Angriffsversuche gegen MD5, die keine ernsten Sicherheitsbedenken hervorriefen und das Vertrauen in dieses Verfahren eher verstärkten. Dies wurde allerdings 1996 nachhaltig erschüttert, als Hans Dobbertin zwei 512-Bit-Blöcke fand, die denselben Hashwert ergaben. 8 Nichtsdestotrotz und wahrscheinlich auch, weil noch keine zwei kompletten Nachrichten gefunden wurden auf dies das auch zutrifft, ist MD5 immer noch das am häufigsten angewandte Hashverfahren. 2.2 Weitere Verschlüsselungsfunktionen in PHP Die Bibliothek mcrypt bietet Funktionen zur Ver- und Entschlüsselung aller gängigen Verschlüsselungsverfahren. Nachfolgend werden einige der unterstützen Verfahren beschrieben: Enigma Die Enigma wurde im zweiten Weltkrieg von der deutschen Wehrmacht zur Verschlüsselung ihrer Funksprüche verwendet. Dabei handelte es sich um eine Maschine mit 3 oder 4 Scheiben (Rotoren). Auf beiden Flächen der Scheiben waren je 26 Schleifkontakte angebracht, die die Buchstaben des Alphabets darstellen. Jeder Kontakt auf der linken Seite eines Rotors war mit genau einem Kontakt auf der rechten Seite verbunden, wobei die interne Verdrahtung bei den verschiedenen Scheiben differierte. Eine Chiffierung erfolgte durch Anlegen einer Spannung an einem der linken Schleifkontakte. Je nach Stellung der Rotoren zueinander und der Auswahl der Rotoren selbst lag auf der rechten Seite die Spannung an einem anderen Kontakt an. Nach jedem Schritt der Verschlüsselung wurde zunächst der Eingangsrotor um eine Position weiter rotiert. Nach einer vollen Umrundung (26 Schritte) rückte der zweite Rotor eine Position weiter. Vollendete dieser eine Umdrehung, änderte sich die Stellung des dritten Rotors. Es handelt sich um ein angepasstes Vigenère-Verfahren mit fast unendlich langem Geheimwort Das Schlüsselwort entspricht dabei der Anfangsstellung der Rotoren. DES und TripleDES Mit auf 56 Bit reduziertem Schlüssel wurde das Verfahren 1977 vom U.S. National Bureau of Standards als Data Encryption Standard (DES) genormt. Der Grund der Reduzierung ist bis heute ungeklärt und steter Kritikpunkt an dem Verfahren, da hier der Einfluss und eine Hintertür der NSA (National Security Agency) vermutet wird, die die Entwicklungsunterlagen des Kernstücks von DES lange Zeit unter Verschluss hielt. Heute werden in kritischen Bereichen deshalb Weiterentwilckungen von DES eingesetzt. Wichtigster Vertreter ist TripleDES (DES3), der den DES Algorithmus dreifach anwendet mit einem auf 112 Bit erweiteren Schlüssel. AES Der Advanced Encryption Standards (AES) resultierte aus einer vom US National Institute for Standards and Technology (NIST) initiierten Ausschreibung (1977) zur Ablösung von DES als amerikanischen Standard. 2001 wurde das auf einen Kryptologie-Algorithmus von Rijndael zurückgehende Verfahren offiziell als Nachfolger von DES bestätigt. 9 Im Unterschied zu DES unterstützt das neue Verfahren Schlüssellängen von 128, 192 oder 256 Bit, so dass Brute-Force-Angriffe auch lange Sicht hin unwahrscheinlich werden. Außerdem unterliegt das Verfahren keinerlei Lizenzbestimmungen und kann von jedem implementiert werden. RSA Das von Rivest, Shamir und Adleman entwickelte RSA-Verfahren ist wohl der bekannteste Vertreter asymmetrischer Verfahren und ein Beispiel der Anwendung der Faktorierung zur Erzeugung der Schlüssel. Vorab wird die Schlüssellänge festgelegt. Je länger dieser ist, desto sicherer ist das Verfahren. Allerdings wird es auch langsamer, weshalb beispielsweise die Secure Shell 1024 Bit als Voreinstellung vorschlägt (ssh-keygen). Dieser Wert gilt als sicher und stellt bei heutiger Rechengeschwindigkeit noch keine Bremse dar. Die gewählte Schlüssellänge beeinflusst die Länge der beiden zu erzeugenden Primzahlen p und q. Jede muss mindestens halb so lang wie die Schlüssellänge sein. Die Erzeugung solcher Primzahlen wird per Zufallsgenerator mit anschließendem Primzahltest vorgenommen. Weitere von mcrypt unterstütze Verschlüsselungsverfahren sind: 3-Way, Arcfour, Blowfish, Cast, Gost, Idea, RC2, RC6, Loki, Mars, Panama, Rijndael, Safer, Safer+, Serpent, Skipjack, Twofish, Wake und XTea. 10 3 3.1 Benutzerauthentifizierung Basic Authentication Die Basic Authentication schützt Dokumente oder Verzeichnisse vor nicht erlaubtem Zugriff. Der Client muss sich gegenüber dem Server über einen Benutzernamen und ein zugehöriges Passwort authentifizieren. Darüber wird im Vorfeld eine Vereinbarung getroffen. Die untenstehende Abbildung zeigt wie der Internet Explorer 6.0 SP1 den Nutzer zur Authentifizierung auffordert. Zuzüglich zu Benutzername und Passwort kann man den Zugriff aufgrund der Rechneradresse des Benutzers einschränken. Etwas weiterentwickelt ist die Digest Access Authentication, die im Gegensatz zur Basic Authentication das Passwort und den Benutzernamen nicht im Klartext über das Netz schickt. Figure 3: Basic Authentication beim Internet Explorer 6.0: Aufforderung zur Eingabe von Benutzernamen und Passwort Im Allgemeinen verhindert diese Art der Authentifizierung nur zufällige unberechtigte Zugriffe auf geschützte Bereiche. Bei beiden Methoden kann jeder Unbefugte, der den Übertragungskanal abhört, das jeweilig übermittelte Dokument ohne größeren Aufwand mitlesen. Die Daten werden nicht als Plain-Text übertragen, sondern per Base64 codiert. Allerdings ist Base64 ist keine Verschlüsselung und stellt für Profis keine Hürde dar. Selbst Netzwerk-Sniffer können die Daten in normalen Plain-Text darstellen. Dennoch kann die Codierung in Base64 ein Sicherheitszuwachs bedeuten. Für einen ernsthaften Angriff stellt dieser Schutz keine allzu große Hürde dar. Wer Daten mittels Basic Authentication schützt, muss daher abwägen, wie groß der Schaden maximal werden kann, wenn ein Unberechtigter geschützte Daten abruft. 11 Verzeichnisschutz beim Apache-Webserver einrichten Für den Apache-Webserver gibt es eine Lösung, wenn Zugriff auf die .HTACCESSDatei besteht. Folgende Schritte sind für die Einrichtung des Verzeichnisschutzes notwendig: 1. Erzeugen einer leeren Datei .HTPASSPWD. An der Prompt ist folgendes einzugeben, wobei <tag> durch die entsprechende Angabe ersetzt werden muss und {Aufforderung} eine Ausgabe des Betriebssystems darstellt: htpasswd –c .htpasswd <nutzername> {Password:} <kennwort> {Password:} <kennwort> 2. Wiederholen der Eingabe für jeden weiteren Nutzer ohne den Schalter -c (der steht für create und erzeugt die Datei). Erzeugen einer Datei mit dem Namen .HTACCESS und wie nachstehend modifizieren: AuthAuthoritative Off AuthName ”Admin” AuthType Basic AuthUserFile /[pfad] /.htpasswd require valid-user Die Verwaltung der Nutzerzugriffe wird nun für das entsprechende Verzeichnis durch den Apache erfolgen. 12 3.2 Authentifizierung durch Formulare Das Einblenden des Anmeldefensters ist eine denkbare Methode zur Nutzerkontrolle. Es können aber auch Formulare verwendet werden, die den Eingaben mit einer Datenbank abgleichen und dann die weitere Verarbeitung von Skripten zulassen oder ablehnen. Folgendes Skript zeigt eine einfache Version eines Formulars zur Eingabe von Benutzernamen und Passwort. Der vollständige Quelltext des Skriptes ist dem Anhang A zu entnehmen. Figure 4: Formular zur Überprüfung von Benutzername und Passwort Die registrierten Nutzer werden in einer Datenbanktabelle verwaltet und die Passwörter MD5 einwegverschlüsselt werden. Der Login-Prozess läuft dabei wie folgt ab: 1. Der Benutzer gibt seinen Benutzernamen sowie das Passwort ein und betätigt den Knopf Abschicken. 2. Somit schickt der Benutzer seine Daten an den Webserver, der mit Hilfe von PHP das Passwort mit der Funktion md5() einwegverschlüsselt und das SQL Statement generiert. 3. Das SQL Statement kann nun an den SQL-Server gesandt werden, der die Abfrage verarbeitet und, falls ein Nutzer mit dem Benutzernamen und 13 dem einwegverschlüsselten Passwort in der Datenbank ist, ein entsprechendes Resultat zurückliefern. 4. PHP generiert nun auf dem Webserver ein HTML-Dokument, welches dem obigen entspricht. Abhängig von dem Resultat der Abfrage wird die Nachricht ,,PASSWORT KORREKT“ oder ,,PASSWORT FALSCH“ angehängt. Ein solcher Schutz ist durch normale Nutzer der Website kaum zu durchbrechen. Auch ein Diebstahl der Kennwortdatei wäre wertlos, da der Schlüssel nicht umkehrbar ist. Um auch die Datenübertragung von Benutzername und Passwort durch eine Verschlüsselung zu sichern, wird im nächsten Kapitel die SSL Verschlüsselung vorgestellt. 14 4 Sichere Datenübertragung im Internet über SSL Das SSL Protokoll wurde von Netscape Communcations Corp., CA (USA) entwickelt. SSL legt eine zusätzliche Schicht über die Socket-Ebene. Diese sieht nach oben, d.h. zur Anwendungsschicht hin, wie die übliche Socketebene aus. Gegenüber den eigentlichen Sockets erscheint sie als Anwendung. Dieses Sicherheitsprotokoll ermöglicht Datenverschlüsselung, Echtheitsbestätigung von Servern und die Sicherstellung der Nachrichtenintegrität für TCP/IP Verbindungen. Secure Socket Layer bietet dem Client immer eine Authentifizierung des Servers. Daher benötigt der Betreiber des Servers immer ein Zertifikat. Die Authentifizierung der Client-Seite erfolgt optional und ist nur dann erfolgreich, falls der Client über ein offiziell registriertes Zertifikat verfügt. Ist die SSL-Verbindung zwischen Client und Server hergestellt, werden alle Daten verschlüsselt und damit für Außenstehende unlesbar übertragen. Sämtliche Informationen, sowohl die der HTTP-Anfrage als auch die der HTTP-Antwort, werden vollständig verschlüsselt. Dazu gehört auch die URL, die der Client anfordert, die in Formularen übermittelte Informationen, die Informationen zur Echtheitsbestätigung des HTTP-Zugriffs sowie alle Daten, die der Server an den Client überträgt. SSL nutzt das Public-Key-Verfahren, bei dem mit einem öffentlich zugänglichen Schlüssel codierte Daten nur mit einem ganz bestimmten privaten Schlüssel wieder dechiffriert werden können. Eine Integritätsprüfung in SSL erkennt gegebenenfalls eine Verfälschung der gesendeten Daten. Die technische Umsetzung erfolgt durch symmetrischen und asymmetrischen Verschlüsselungen sowie durch sichere Hashfunktionen. Unterstützt werden dabei die meisten bekannten Vertreter der Verfahren, wie DES, RC4; RSA, DSS; SHA, MD5. Durch die schon angesprochene zusätzliche Schicht über der Socket-Ebene sind weitere Verfahren ohne eine Anpassung der Software implementierbar. Das Protokoll des Verbindungsaufbaus mit SSL verdeutlicht die Zusammenhänge zwischen Schlüsseln, Verschlüsselungsverfahren, Zertifikaten und der Funktionsweise von SSL. Dieser Aufbau gliedert sich in vier Schritte: 1. In der Hello-Phase baut der Client eine Verbindung zum Server auf und teilt ihm mit, welche Kryptographie-Algorithmen er unterstützt. 2. Der Server wählt ein Public-Key-, ein Private-Key- und ein Hash-Verfahren aus, und teilt sie dem Client mit. Gleichzeitig sendet der Server ein Zertifikat, das unter anderem den öffentlichen Schlüssel des Servers enthält. Mit Hilfe dieses Zertifikats kann der Client überprüfen, ob die Antwort tatsächlich vom gewünschten Server stammt. 3. Der Client generiert einen Sitzungsschlüssel für einen Datenaustausch per Private-Key-Verfahren. Aus Geschwindigkeitsgründen werden sogenannte 15 symmetrische Verfahren verwendet. Der dazu notwendige Austausch von Schlüsseln wird durch die Verschlüsselung mit den öffentlichen Schlüsseln der Zertifikate geschützt. Diesen chiffrierten Schlüssel schickt der Client an den Server. 4. In der abschließenden Phase authentifiziert der Client den Server, indem er ihm eine Reihe von mit dem Sitzungsschlüssel chiffrierten zufälligen Testnachrichten schickt, die der Server nur dann korrekt dechiffrieren und bestätigen kann, wenn es sich um den ”echten” Server handelt. In einem optionalen Schritt kann der Server auf vergleichbare Weise den Client authentifizieren. Die Client-Authentifikation funktioniert nur dann, wenn der Client über ein offiziell registriertes Zertifikat verfügt. Damit ist der initiale Verbindungsaufbau abgeschlossen und anschließend können die eigentlichen Daten geschützt übertragen werden. Die zu übertragenden Daten werden in kleine Blöcke geteilt, die zusätzlich noch komprimiert werden können. Damit steigert sich die Geschwindigkeit der Übertragung und auch die Sicherheit wird erhöht. Die Blocknummer wird hinzugefügt und mittels einer Hash-Funktion eine Prüfsumme angehängt. Abschließend wird mit dem symmetrischen Verfahren verschlüsselt. Sollten beim Empfang Ungereimtheiten auftreten, zum Beispiel durch falsche Prüfsummen, so wird dies auf eine versuchte Manipulation zurückgeführt, da dem Protokoll TCP/IP vertraut wird. Daraufhin wird eine verschlüsselte Fehlernachricht versandt und die Verbindung abgebrochen. Netscape- oder Microsoft-Browser unterstützen das Verschlüsselungsverfahren SSL. Je nach Browser zeigen die Symbole (Schlüssel oder Vorhängeschloss) eine ungesicherte Verbindung beziehungsweise eine gesicherte Verbindung an. Die aktuellen Versionen der Browser sind bereits in der Lage ohne zusätzlichen Installationsaufwand eine 128-Bit-Sitzungsschlüssel zu erzeugen. Sowohl der Anbieter von Informationen im Web als auch der Leser sollten abwägen, wie viel Sicherheit für ihre konkrete Anwendung nötig ist. Für vorlesungsbegleitendes Material genügt in der Regel der Schutz, den Basic Authentication bietet. Werden sensitive Daten über das Internet geschickt, z.B. Kreditkartennummern oder Geheimcodes, so sollte dies über eine SSL-Verbindung in Kombination mit einer Zugangsberechtigung gesichert werden. Dabei sollte sich auch der Anwender um Sicherheit bemühen und seinen Browser auf die höchste Verschlüsselungslänge einstellen oder die entsprechende Browsererweiterung aktualisieren. 16 5 Anhang A: md5.php <?php // Datenbankverbindung mysql connect(”localhost”, ””, ””); mysql select db(”test”); ?> <html> <head> <title>Kryptographie - Einwegverschl&uuml;sselung</title> <meta http-equiv=”Content-Type” content=”text/html; charset=iso-88591”> < /head> <body> <p><font size=”4” face=”Verdana, Arial, Helvetica, sans-serif”> Kryptographie - Einwegverschl&uuml;sselung mit MD5</font> < /p> <form name=”form1” method=”post” action=”<?php echo $PHP SELF ?>”> <table border=”0” cellspacing=”0” cellpadding=”0”> <tr> <td width=”200”><font face=”Verdana, Arial, Helvetica, sans-serif”>Benutzername</font></td> <td> <input type=”text” name=”benutzername” value=”<?php echo $benutzername ?>”> < /td> < /tr> <tr> <td><font face=”Verdana, Arial, Helvetica, sans-serif”>Passwort</font></td> <td><input type=”text” name=”passwort” value=”<?php echo $passwort ?>”></td> < /tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> < /tr> <tr> <td>&nbsp;</td> <td><input type=”submit” name=”Submit” value=”Abschicken”></td> < /tr> < /table> < /form> <p> <?php // Ausgabe if (!empty($ POST)) 17 { echo ’<table border=”0” cellspacing=”0” cellpadding=”0”>’; // Ausgabe Passwort (verschlüsselt) echo ’<tr>’; echo ’<td height=”40” width=”200”><font face=”Verdana, Arial, Helvetica, sans-serif”> Passwort (MD5)</font></td>’; echo ’<td><font face=”Verdana, Arial, Helvetica, sans-serif”>’ . htmlentities(md5($passwort)) . ’</font></td>’; echo ’</tr>’; // Ausgabe SQL Statement echo ’<tr>’; echo ’<td height=”40” ><font face=”Verdana, Arial, Helvetica, sans-serif”> SQL Statement</font></td>’; echo ’<td><font face=”Verdana, Arial, Helvetica, sans-serif”>’ . ”SELECT * FROM benutzer WHERE<br>benutzername = \”” . htmlentities($benutzername) . ”\” AND<br>passwort = \”” . htmlentities(md5($passwort)) . ”\”” . ’</font></td>’; echo ’</tr>’; // Benutzerdaten prüfen $result = mysql query(” SELECT * FROM benutzer WHERE benutzername = \”” . $benutzername . ”\” AND passwort = \”” . md5($passwort) . ”\””); if (mysql fetch row($result)) { // Benutzername und Passwort korrekt echo ’<tr>’; echo ’<td height=”40” > <font face=”Verdana, Arial, Helvetica, sans-serif”>PASSWORT KORREKT</font> < /td>’; echo ’<td>&nbsp;</td>’; echo ’</tr>’; } else { // Benutzername oder Passwort falsch echo ’<tr>’; echo ’<td height=”40” ><font face=”Verdana, Arial, Helvetica, sans-serif”> PASSWORT FLASCH</font> < /td>’; echo ’<td>&nbsp;</td>’; echo ’</tr>’; } echo ’</table>’; } ?> 18 < /p> < /body> < /html> 19 6 Literaturverzeichnis Links • mcrypt Handbuch • Ekke - MD5 - Was MD5 ist und wie es funktioniert • Hash-Funktionen • Offizielle PHP Website • PHP 4 - Webserver-Programmierung für Einsteiger - Galileo Computing Bilder • Figure 1: Auslieferung einer dynamischen Website PHP - Grundlagen und Profiwissen S.37 - Jörg Krause; Berlin 2000 • Figure 2: Berechnung einer Verkettungsvariablen http://www.kronos-titan.privat.t-online.de/md5/cryptomd5.html sonstige Quellen • PHP Magazin - Ausgabe 2.04: Titelthema Kryptographie • Semesterarbeitder Philosophisch-naturwissenschaftlichen Fakultät der Universität Bern; Oliver Aeberhard: Sicherheit in verteilten Systemen 20