Doku - Hochschule Wismar

Werbung
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ü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ü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> </td>
<td> </td>
< /tr>
<tr>
<td> </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> </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> </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
Herunterladen