DIPLOMARBEIT Flexibles Datenbankmodell ” für TrustCenter“ von Frank Homann am Fachgebiet für Theoretische Informatik von Prof. Dr. rer. nat. Johannes Buchmann Betreuer: Dipl. Inform. Marcus Lippert Technische Universität Darmstadt (TUD) – Fachbereich Informatik – Vorwort Zu Beginn dieser Arbeit möchte ich meiner Familie danken, insbesondere meiner Mutter, die mich im Laufe meines Studiums stets unterstützte. Des weiteren danke ich meinem Betreuer und Ansprechpartner für diese interessante Arbeit – Marcus Lippert. Formaler Hinweis Hiermit versichere ich, die vorliegende Diplomarbeit selbstständig, ohne Hilfe Dritter und nur mit den angegebenen Quellen und Hilfsmitteln angefertigt zu haben. Alle Stellen, die aus den Quellen entnommen wurden, sind als solche kenntlich gemacht worden. Diese Arbeit hat in gleicher oder ähnlicher Form noch keiner Prüfungsbehörde vorgelegen. Frank Homann, Oktober 2004 Kontaktadresse Annastr. 48 64673 Zwingenberg eMail: [email protected] –2– Inhaltsverzeichnis Vorwort 2 Inhaltsverzeichnis 3 Einleitung 6 1 Einführung in Kryptographie und Computer-Sicherheit 1.1 Wozu Kryptographie? . . . . . . . . . . . . . . . . . . . . 1.1.1 Schutzziele . . . . . . . . . . . . . . . . . . . . . . . 1.2 Kryptographische Verfahren . . . . . . . . . . . . . . . . . 1.2.1 Symmetrische Verschlüsselung . . . . . . . . . . . . 1.2.2 Asymmetrische Verschlüsselung . . . . . . . . . . . 1.2.3 Verschlüsselung in der Praxis . . . . . . . . . . . . 1.2.4 Hybridverfahren . . . . . . . . . . . . . . . . . . . . 1.2.5 Hash und MAC . . . . . . . . . . . . . . . . . . . . 1.2.6 Signatur . . . . . . . . . . . . . . . . . . . . . . . . 1.2.7 Kryptosysteme und Schutzziele . . . . . . . . . . . 1.3 Angriffsformen, Abwehrmaßnahmen und Anwendungen . . 1.3.1 Angriffsziele . . . . . . . . . . . . . . . . . . . . . . 1.3.2 Grundlagen von Angriffen . . . . . . . . . . . . . . 1.3.3 Angriffe auf die Mathematik . . . . . . . . . . . . . 1.3.4 Angriffe auf Protokoll-Strukturen . . . . . . . . . . 1.3.5 Seitenkanal-Angriffe ( Side Channel Attacks“) . . . ” 1.3.6 Brechen von Schlüsseln oder Kryptoverfahren . . . 1.3.7 Anwendungen und Protokolle . . . . . . . . . . . . 1.4 Public Key-Infrastrukturen (PKI) . . . . . . . . . . . . . . 2 TrustCenter FlexiTrust 2.1 Ziele und Aufgaben von PKIs und TrustCentern . . . 2.2 Zertifikate und ihre Bedeutung . . . . . . . . . . . . . 2.2.1 Kommunikation mit Zertifikaten . . . . . . . . 2.2.2 Schutzziele und Zertifikate . . . . . . . . . . . 2.3 TrustCenter-Struktur auf Basis von FlexiTrust . . . . 2.3.1 Komponentenmodell auf Basis von FlexiTrust 2.4 Registration Authority . . . . . . . . . . . . . . . . . 2.5 Key Authority . . . . . . . . . . . . . . . . . . . . . . 2.6 Certificate Management Authority . . . . . . . . . . 2.7 Directory Service . . . . . . . . . . . . . . . . . . . . 2.7.1 Aufgabe von Verzeichnisdiensten . . . . . . . 2.7.2 DAP und X.500 . . . . . . . . . . . . . . . . . 2.7.3 LDAP und X.509 . . . . . . . . . . . . . . . . 2.7.4 LDAP Lösungen . . . . . . . . . . . . . . . . 2.7.5 Multiple Zertifikate . . . . . . . . . . . . . . . 2.7.6 Distinguished Names . . . . . . . . . . . . . . 2.8 Time Stamp Service . . . . . . . . . . . . . . . . . . –3– . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 10 10 11 13 14 14 15 15 16 16 17 17 18 19 20 20 21 . . . . . . . . . . . . . . . . . 22 22 23 25 25 25 26 27 28 29 29 30 30 31 33 35 35 36 INHALTSVERZEICHNIS 3 Einführung in Datenbanksysteme 3.1 Grundlagen Datenbanksysteme . . . . . . . 3.2 Datenbank Management-System (DBMS) . . 3.2.1 Datenunabhängigkeit . . . . . . . . . 3.3 Transaktionen . . . . . . . . . . . . . . . . . 3.3.1 Trigger und Coupling Modes . . . . . 3.3.2 Concurrency Control . . . . . . . . . 3.3.3 Recovery und Backup . . . . . . . . . 3.4 Datenmodelle . . . . . . . . . . . . . . . . . 3.4.1 Grundlagen von Datenmodellen . . . 3.4.2 Objekte und Konstruktoren . . . . . 3.4.3 Beziehungen . . . . . . . . . . . . . . 3.4.4 Relationale Datenbanken . . . . . . . 3.4.5 Schlüssel . . . . . . . . . . . . . . . . 3.5 Script Query Language (SQL) . . . . . . . . 3.5.1 Datenzugriff und Datenmanipulation 3.5.2 Strukturmanipulation . . . . . . . . . 3.6 Applikationsentwicklung . . . . . . . . . . . 3.7 Hardware- und Softwareauswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Datenbankapplikationen für TrustCenter 4.1 Datenbanken und Datenhaltung in TrustCentern . . . . . . . . . . . . . 4.1.1 Registrierungsdaten und Zertifikate . . . . . . . . . . . . . . . . 4.1.2 Import und Export von Daten . . . . . . . . . . . . . . . . . . . 4.2 Praktische Aspekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 TrustCenter an einer Universität . . . . . . . . . . . . . . . . . 4.3 TrustCenter-Implementierung mit Java . . . . . . . . . . . . . . . . . . 4.3.1 Datenbankzugriffe unter Java mittels JDBC . . . . . . . . . . . 4.4 Konzept der FlexiTrust-OpenRA . . . . . . . . . . . . . . . . . . . . . 4.4.1 Datenbank-Abläufe rund um die OpenRA . . . . . . . . . . . . 4.4.2 Erweiterungsmöglichkeiten für das OpenRA-Konzept . . . . . . 4.5 Persistierung von Daten . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.1 Datengattungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.2 Entwickeln von Datenbankapplikationen für TrustCenter . . . . 4.5.3 Einrichten von Datenbanken und logischen Strukturen . . . . . 4.5.4 Ziele der Persistierung allgemein und in einem TrustCenter . . . 4.6 Möglichkeiten zur Persistierung und Repräsentation . . . . . . . . . . . 4.6.1 Persistierungsmöglichkeiten im Überblick . . . . . . . . . . . . . 4.6.2 Repräsentationsschichten für einstufige und mehrstufige Objekte 4.7 Objekt-basierte Java-Lösungen . . . . . . . . . . . . . . . . . . . . . . . 4.7.1 Manuelle Persistierung mit reinem JDBC . . . . . . . . . . . . . 4.7.2 Serialization“ . . . . . . . . . . . . . . . . . . . . . . . . . . . . ” 4.7.3 JDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8 Datenbank-basierte Lösungen . . . . . . . . . . . . . . . . . . . . . . . 4.8.1 Datenzugriffe über Cursor . . . . . . . . . . . . . . . . . . . . . 4.8.2 Steuer- bzw. Hilfstabellen . . . . . . . . . . . . . . . . . . . . . 4.8.3 Dynamische Strukturen bzw. Tabellendefinitionen . . . . . . . . 4.9 Bewertung der Persistierungslösungen . . . . . . . . . . . . . . . . . . . –4– . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 37 37 38 39 39 40 40 40 41 41 42 43 43 45 46 49 50 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 52 54 55 55 57 57 59 61 62 68 69 69 70 70 71 73 74 75 82 84 87 89 95 95 97 99 104 INHALTSVERZEICHNIS 4.10 Weiterführende Überlegungen . . . . . . . . . . . . . . . . . . . . . . 4.10.1 Administration und Absicherung von Datenbanken . . . . . . 4.10.2 Vergabe von Distinguished Names . . . . . . . . . . . . . . . . 4.10.3 Multiple Zertifikate und multiple Distinguished Names . . . . 4.10.4 Multiple TrustCenter . . . . . . . . . . . . . . . . . . . . . . . 4.10.5 Unterstützen des Verzeichnisdienstes . . . . . . . . . . . . . . 4.10.6 Erstellen von Datenbank-Berichten bzw. Datenbank-Auszügen 4.10.7 Wahl des Datenbanksystems und Spezialisierungsbeispiel . . . 4.10.8 Bedeutung von Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 106 108 110 111 112 112 113 114 A Anhang 117 A.1 Beigefügte Software bzw. Dateien . . . . . . . . . . . . . . . . . . . . . . . 117 A.1.1 Beispiel-Datenbank . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 A.2 Technische Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Literaturverzeichnis 119 Abbildungsverzeichnis 122 Index 123 –5– Einleitung Diese Arbeit ist in den Kontext des bereits vorhandenen OpenRA- bzw. TrustCenter-Projektes (FlexiTrust), entstanden in der Arbeitsgruppe von Prof. J. Buchmann1 , einzuordnen. Allgemein formuliert handelt die vorliegende Arbeit zum Teil von der Persistierung von Daten innerhalb eines TrustCenters, genauer von der Analyse sowie den Zielen und Aufgaben des hinter einem TrustCenter liegenden Datenbankmodells. Daher spielen neben den Konzepten der TrustCenter-Datenbank und der Datenbankapplikation an sich auch Sicherheitsaspekte eine essentielle Rolle. Die Daten, welche bei einem TrustCenter-Produkt, das für verschiedene Anwendungskontexte geeignet sein soll, verarbeitet werden müssen, können in der Praxis stark variieren. Die Art der Persistierung dieser Daten, betrifft daher einerseits die Flexibilität und Effizienz in der Anwendungsentwicklung für einen bestimmten individuellen Anforderungsbereich und andererseits die Effizienz im laufenden Betrieb des TrustCenters. Des weiteren müssen beispielsweise Änderungen und Wartung möglich und auf flexible Weise durchführbar sein. All diese Aspekte werden gleichermaßen bezogen auf TrustCenter im Allgemeinen sowie auf FlexiTrust diskutiert. Im letztgenannten Falle werden an entsprechender Stelle ebenfalls einige Erweiterungs- und Verbesserungsmöglichkeiten aufgezeigt, welche nicht nur eine Verfeinerung sondern ebenso eine Weiterentwicklung von FlexiTrust im Sinne praktischer TrustCenter- und PKI-Aspekte darstellen. Zum Verständnis der vorliegenden Arbeit wird lediglich Grundwissen im Bereich der Informatik vorausgesetzt. Infolgedessen beginnt diese Arbeit mit Einführungen zu den Themen Kryptographie und TrustCenter und enthält des weiteren eine Einführung in das Gebiet der Datenbanksysteme. Anschließend folgt mit der Diskussion verschiedener Datenbankkonzepte und Persistierungsmöglichkeiten in Kapitel 4 der eigentliche Kern der Arbeit. Für weitere und ergänzende Details zu den im Folgenden beschriebenen Verfahren und Systemen sei u.a. auf das Literaturverzeichnis (ab Seite 119) verwiesen. 1 Für weitere Details sei auf das Fachgebiet von Prof. J. Buchmann an der TU Darmstadt bzw. auf folgende Arbeiten verwiesen: Vor allem [Dam01], [Sch01], [Kan04] sowie [Zoe02], [Zoe03]. –6– 1 Einführung in Kryptographie und Computer-Sicherheit 1.1 Wozu Kryptographie? Unter dem Begriff Kryptographie findet man im Duden (1993) zwei Erläuterungen: Kryptographie zum einen als die aus der Psychologie stammende Bezeichnung für eine absichtslos ” entstandene Kritzelzeichnung bei Erwachsenen“ und zum anderen als ein veraltetes Wort für ” Geheimschrift“. In der Tat umfaßt der Begriff Kryptographie heutzutage wesentlich mehr als lediglich den geheimen Austausch von Nachrichten. Jedoch hat er historische Wurzeln und ist keineswegs eine Erfindung der jüngsten Phase der Neuzeit. So wurde beispielsweise schon zu den Zeiten Cäsars ein Buchstaben-Tauschsystem verwendet, um streng geheime Botschaften (etwa über Kriegsstrategien) über große Strecken zu transportieren. Diese Methode ist natürlich sehr einfach und dem heutigen Technologie- und Bildungsstand weit unterlegen. Abbildung 1: Einfache Verschlüsselung mit Buchstaben-Tauschsystem Abbildung 1 zeigt ein Beispiel für ein mögliches Tauschsystem: Ein a“ in der zu übertra” genden Nachricht (Klartext) wird in der verschlüsselten Nachricht (Verschlüsselungstext) zu einem c“ usw. So wird also eine Mitteilung wie HALLO AXEL“ zu JCNNQ CZGN“. ” ” ” Anwendungen von Verschlüsselungstechniken liegen jedoch nicht nur in militärischen Bereichen. Wenngleich der Austausch von Nachrichten bei Militärs, Staatsmännern, Geheimdiensten etc. meist äußerst sicherheitskritisch ist2 . Aber in vielen Fällen besteht auch in der Industrie oder bei Privatleuten die Notwendigkeit bzw. der Wunsch, daß Mitteilungen von einer Partei A zu einer anderen Partei B nicht mitgelesen, belauscht oder ausspioniert werden können. Die Kryptographie hat heute allerdings weit mehr Aufgaben als die Verschlüsselung an sich. Denn viele andere Sicherheitsaspekte spielen mittlerweile eine wichtige Rolle. Man spricht hier allgemein von Schutzzielen, auf welche im nächsten Abschnitt 1.1.1 eingegangen wird. Es gibt dazu zahlreiche Anwendungsgebiete, wie z.B. die elektronische Kommunikation, der elektronische Geldverkehr oder die elektronische Unterschrift als Ersatz für das analoge“ also ” handschriftliche Signum. Dabei handelt es sich nicht ausschließlich um Anwendungen die mit einem Personal Computer in Verbindung stehen. Längst haben eingebettete Systeme Einzug in unser tägliches Leben gehalten. Das sind Computersysteme, die in ein technisches System eingebettet sind, welches nach außen hin aber nicht wie ein Computer in Erscheinung tritt. Beispiele hierfür sind das Handy oder die Wegfahrsperre, aber auch Kredit- oder EC-Karte fallen in das Anwendungsgebiet der Kryptographie. Selbstverständlich ist sie teilweise mehr, teilweise weniger auch Teil der allgemeinen Computer-Sicherheit. Darunter fallen zahlreiche Themenbereiche wie Schutz vor Computerviren und Trojanern3 , sichere Netzwerkkonfigurationen, Digitale Wasserzeichen4 oder Sicherheitspoliti2 Als historisches Beispiel sei hier die Nachrichtenübermittlung im Zweiten Weltkrieg erwähnt. Die Deutschen benutzen zur Verschlüsselung von geheimen Nachrichten die kryptographische Maschine“ Enigma. Diese wurde von den Alliierten sozusagen ” egalisiert (mit Hilfe der Kryptoanalyse) und der Nachrichtenverkehr konnte somit mitgelesen bzw. mitgehört werden. Ähnliches gelang den USA mit japanischen Verschlüsselungsmethoden, was insgesamt sicher zur Verkürzung des Krieges beitrug. 3 Dabei finden verschiedenste Sicherheitsaspekte Bedeutung, wie z.B. vollständige Systemausfälle oder Ausspähen von Paßwörtern mittels sogenannter Keylogger . 4 Digitale Wasserzeichen werden u.a. dazu eingesetzt das Urheberrecht verschiedener digitaler Medien zu wahren bzw. nachzuweisen, wie z.B. bei Musik, Bildern oder Videos. –7– 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT ken etc., auf welche hier aber nicht weiter eingegangen werden soll.5 In der heutigen Zeit sind also die Kryptographie und ihre verwandten Gebiete nicht alleine in die wissenschaftlichen Bereiche der Informatik und Mathematik einzuordnen, sondern beispielsweise auch in die Elektrotechnik oder Physik6 . 1.1.1 Schutzziele Im vorherigen Abschnitt wurde geschildert, welche Anwendungsgebiete in den Bereich der Kryptographie fallen. Für solche Anwendungen kann man allgemein folgende sieben Schutzziele definieren: • Authentizität: Durch Authentizität wird eine Identität bestätigt bzw. deren Echtheit gewährleistet. Dazu muß natürlich der Nachweis einer bestimmten Identität, z.B. von einer Person oder auch eines Rechners, erbracht werden. Dies wird etwa bei Rechnernetzen benötigt, um Unbefugten den Zugang vom Internet aus zu verwehren7 . Weitere Anwendungen sind z.B. Home-Banking oder Bestimmen des Urhebers einer eMail. Eine Nachricht läßt sich also als authentisch bezeichnen, wenn die Authentifikation erfolgreich war. Allgemeine Hilfsmittel für das Nachweisen einer Identität (authentisieren), um Bestätigung dieser vom Kommunikationspartner zu erhalten (authentifizieren), sind: – Biometrische Merkmale (z.B. Fingerabdruck), – Spezielle Fähigkeiten (z.B. die eigenhändige Unterschrift oder der Tastaturanschlag), – Wissen (z.B. Paßwort), – Besitz (z.B. persönlicher Schlüssel, Codekarte), – Kombinationen aus den vorherigen Punkten je nach Anwendungsfall. • Integrität/Unveränderlichkeit: Oftmals ist es nicht nur wünschenswert, den Urheber einer Übermittlung bestimmen zu können, sondern man möchte auch sicher stellen, daß die betreffende Übermittlung auf dem Übertragungsweg nicht verändert wurde. Denn es kann gefährlich sein, wenn man dem eigentlichen Urheber vertraut, sich aber ein Angreifer unbemerkt in die Kommunikation mit diesem eingeschaltet hat. Dies gilt z.B. beim Herunterladen von Computer-Software aus dem Internet, beim Lesen von eMails oder dem Absenden einer Bestellung beim Online-Einkauf. • Datiertheit/Datierung : Der Nachweis, daß eine bestimmte Aktion zu einem bestimmten Zeitpunkt stattgefunden hat oder daß ein gewisser Zustand zu einem gewissen Zeitpunkt vorgelegen hat, kann in einigen Fällen notwendig sein. Dieser Nachweis geschieht normalerweise durch eine dritte Instanz. Ein Beispiel hierfür ist das Eintreffen des Angebots einer Firma zu einer öffentlichen Ausschreibung, was meist zu einer festgelegten Frist geschehen muß. In Streitfällen muß die betreffende Firma nachweisen können, daß ihr Angebot rechtzeitig eingereicht wurde oder auch daß es dabei und zu diesem Augenblick vollständig war. 5 Etwas weiter weg von diesen Bereichen und dennoch mit einigen Überschneidungen zur Kryptographie ist die Steganographie angesiedelt. Diese handelt von den Methoden zum Verbergen der Existenz einer Nachricht, also etwa dem Verstecken einer Textnachricht in einem Bild. Bei digitalen Wasserzeichen macht man sich auch solche Methoden zunutze. 6 Das Standhalten bestimmter kryptographischer Verfahren kann z.B. mit der Entwicklung von speziellen Hochleistungscomputern (etwa Quantencomputer ) stark gefährdet werden. Gleiches kann durch die Entwicklung oder Entdeckung effizienter Algorithmen geschehen, die schwere mathematische Probleme lösen, welche die Grundlage mancher Kryptosysteme bilden. 7 In einem weiteren Schritt wird die Autorisierung vorgenommen. D.h., Rechte, wie etwa das Lesen einer Datei, werden vom Computer-System aufgrund des Nachweises einer Identität, etwa durch Einloggen mittels Benutzernamen und Paßwort, vergeben. –8– 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT • Privatheit/Anonymität: Im Zuge der Technisierung des Alltags ist eine damit verbundene mögliche Überwachung des Menschen beachtenswert. Z.B. ist das Bezahlen von Rechnungen mittels EC- oder Kreditkarte nicht anonym, da immer eine Verbindung zu einer bestimmten Karten- oder gar Kontonummer und vielleicht der zugehörigen dahinterstehenden Identität besteht. Dasselbe gilt für Bestellungen, welche über das Internet getätigt werden. Theoretisch ist es also möglich, sich einen Überblick über das Kaufverhalten einer bestimmten Person zu verschaffen. Durch dieses Beispiel8 sollte die fallweise Notwendigkeit zur Wahrung der Privatsphäre mit kryptographischen Mitteln deutlich geworden sein. Ein konkretes Anwendungsbeispiel ist (politische) Wahlen auf elektronischem Wege umzusetzen. Ein solches Vorhaben muß bestimmte Vorgaben einer nicht-elektronischen Wahl wahren, wie etwa daß die Wahl geheim stattfindet, also daß keine Zuordnung von abgegebener Stimme und Identität möglich ist. • Verbindlichkeit/Nicht-Abstreitbarkeit: Die Verbindlichkeit geht etwas weiter als die Authentizität. Bei der Verbindlichkeit geht es nicht nur darum sich selbst der Identität seines Kommunikationspartners sicher zu sein, sondern dies auch Dritten gegenüber beweisen zu können. Wenn man beispielsweise ein Auto bei einem Händler kauft und dort den Kaufvertrag unterschreibt, kann der Händler dies durch die handschriftlich erfolgte Unterschrift z.B. vor einem Gericht beweisen. Es geht hier also um den digitalen Ersatz“ der eigenen ” Unterschrift für elektronische Kommunikation. Im Falle des Kaufvertrages möchte man eine auch rechtlich anerkannte elektronische Unterschrift, auch digitale Signatur genannt. Dabei sind für deren Gültigkeit Regelungen des Gesetzgebers zu beachten, z.B. Signaturgesetz9 , wozu man meist eine weitere Vertrauensinstanz benötigt. Darauf wird aber in Kapitel 2 über TrustCenter ab Seite 22 noch näher eingegangen. • Verfügbarkeit: In der Vergangenheit zielten einige aufsehenerregende Angriffe auf prominente Internet-Server oder gar Rechnernetze auf deren Verfügbarkeit ab. Dies geschieht folgendermaßen: Ein Server, welcher einen bestimmen Dienst zur Verfügung stellt, wird mit unberechtigten Anfragen überflutet. D.h., er besitzt nicht genügend Kapazität diese Flut von Anfragen abzuweisen, womit der auf dem Server bereitgestellte Dienst zum Erliegen kommt. Folglich können auch die berechtigten Nutzer nicht mehr erfolgreich auf den Server bzw. dessen Dienst zugreifen. Im Zuge der wirtschaftlichen Nutzung des Internets ist die Verfügbarkeit von Diensten, z.B. Online-Shops, ein wichtiges Schutzziel geworden. • Vertraulichkeit: Vertraulichkeit bezeichnet allgemein ausgedrückt den schon geschilderten klassischen Hintergrund der Kryptographie, nämlich schlicht Daten geheimzuhalten. Dies kann etwa bedeuten, Dritte oder Unbefugte vom Mitlesen der Kommunikation zweier Parteien auszuschließen, z.B. bei eMails. Oder man möchte Firmen- bzw. Personendaten oder persönliche Dateien, etwa ein Tagebuch, auf einem Computer nur für sich bzw. entsprechend berechtigte Personen lesbar machen. Ebenfalls kann es wünschenswert sein, daß – auch über Funkverbindungen ins Internet – abgesendete Online-Bestellungen oder heruntergeladene Internet-Inhalte nicht von anderen eingesehen werden können. 8 Dies kann man vielleicht als unbedeutend ansehen. Jedoch sind hiervon auch andere Bereiche außerhalb von eCommerce und elektronischem Geldverkehr betroffen. Etwa bei der Datensicherheit in medizinischen Bereichen spricht man von dem gläsernen ” Menschen“ und bezieht sich hierbei auf die evt. Einführung von Krankenversicherungskarten für Versicherungsnehmer, welche nicht nur Stammdaten (z.B. Adressen oder Versicherungsnummer) sondern auch medizinische Daten oder Akten enthalten könnten. Auch elektronische Fahrausweise birgen eine Art potentieller Kontrollmöglichkeiten in sich, und zwar sobald mit einem solchen Fahrausweis auch eine Verbindung zur Identität des Fahrgastes hergestellt werden kann. So wäre es möglich beispielsweise ein Profil über Teile des Tagesablaufs von Personen zu erstellen. Auf dessen Nutzen soll hier jedoch nicht weiter eingegangen werden. 9 Hierbei existieren mittlerweile z.B. deutsche aber auch EU-Richtlinien. –9– 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Zwischen den beschriebenen Schutzzielen bestehen verschiedene und unterschiedlich starke Abhängigkeiten. So ist es beispielsweise nicht sinnvoll, die Authentizität einer Nachricht zu gewährleisten ohne deren Integrität. Um diese Schutzziele zu gewährleisten benötigt man natürlich weitere Mittel als die reine Verschlüsselung. Die grundlegenden Techniken dafür, die im nächsten Abschnitt genauer erläutert werden, sind (siehe [Buc04], [Men96]): • Verschlüsselung, • Authentifikation, • Digitale Signatur. 1.2 Kryptographische Verfahren Die Grundlagen fast aller Methoden und Verfahren der Kryptographie (Kryptosysteme) beruhen auf Verschlüsselungstechniken. Allgemein werden bei der Verschlüsselung Klartexte auf sogenannte Schlüsseltexte abgebildet und zwar in Abhängigkeit von dem verwendeten Schlüssel. Um Texte auf andere Texte mathematisch abbilden zu können benötigt man – neben der Umwandlung der Texte in ein Zahlensystem – Verschlüsselungsfunktionen. Damit der verschlüsselte Text wieder lesbar wird, benutzt man die entsprechende Umkehr- oder Entschlüsselungsfunktion. 1.2.1 Symmetrische Verschlüsselung Ein Beispiel für dieses allgemein geschilderte Vorgehen findet sich in Abschnitt 1.1 in Form des Buchstaben-Tauschsystems. Die Verschlüsselungsfunktion ordnet jedem Zeichen des Eingabetextes genau ein anderes Zeichen zu, was nach dieser mathematischen Vorschrift geschieht: e(m) = (m + 2) mod 26. Der Name der Funktion lautet e, die Eingabe m entspricht der Position eines Buchstabens im Alphabet (mit Startposition 0) und das Ergebnis von e angewendet auf jedes Zeichen der Eingabe ist c, der Schlüsseltext. Dies ist nur ein triviales Beispiel und zwar für eine sogenannte symmetrische Verschlüsselung. Die Entschlüsselung erfolgt auf dieselbe bzw. analoge Art wie die Verschlüsselung: d(c) = (c − 2) mod 26. Wobei d hier die Entschlüsselungsfunktion ist und das Ergebnis von d angewendet auf jedes Zeichen der Eingabe ist wiederum m. Das wichtigste für die Ver- und Entschlüsselung allerdings ist der Schlüssel, der in diesem Beispiel bisher außer Acht gelassen wurde. Es handelt sich um die 2“, sie stellt den eigentlichen Schlüssel dieses Verfahrens dar. Er muß beiden ” Kommunikationspartnern genauso bekannt sein wie die verwendeten Funktionen. Man kann in diesem konkreten Falle die Funktionen e und d jedoch auch als identisch betrachten. Daraus resultiert eine einzige Funktion für Ver- und Entschlüsselung: f (m, k) = (m + k) mod 26. Nun ist der Schlüssel k allerdings nicht mehr für beide Seiten gleich, d.h. bei der Verschlüsselung ist k = 2, hingegen ist bei der Entschlüsselung k = −2. Dennoch bezeichnet man dies als symmetrisches Verfahren, weil die Schlüssel quasi gleich, nämlich voneinander leicht oder direkt ableitbar sind. Diese Ableitung wird meist innerhalb der Entschlüsselungsfunktion vollzogen – 10 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT bzw. in dieser integriert. Bei symmetrischen Verfahren spricht man daher von dem geheimen Schlüssel. Abbildung 2 faßt den eben erläuterten Weg z.B. einer verschlüsselten Nachricht von A nach B noch einmal zusammen. Abbildung 2: Symmetrische Verschlüsselung Beispiele für aktuelle symmetrische Verfahren sind: AES, RC4, IDEA, DES, 3-DES. Teil eines solchen kann heutzutage z.B. die Matrizenmultiplikation sein, wobei Matrix und Inverse dann die bzw. den Schlüssel bilden (siehe [Buc04], [Men96]). 1.2.2 Asymmetrische Verschlüsselung Aus vielerlei Gründen, die im nächsten Abschnitt 1.2.3 genauer erläutert werden, bringen symmetrische Verfahren in der Praxis gewisse Probleme mit sich aber auch Vorteile. Ein wesentlicher Nachteil ist es jedoch oftmals, daß auf beiden Seiten der Kommunikation der selbe Schlüssel vorhanden sein muß. Bei asymmetrischer Verschlüsselung hingegen hat jeder Kommunikationspartner ein Schlüsselpaar, welches jeweils aus einem sogenannte privaten und einem öffentlichen Schlüssel besteht. Der Unterschied zu dem geheimen Schlüssel bei der symmetrischen Variante ist die Unabhängigkeit der Schlüssel voneinander. Diese sind zwar ein Paar, denn Ver- und Entschlüsselung muß weiterhin funktionieren, allerdings läßt sich aus dem öffentlichen nicht der – 11 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT private Schlüssel berechnen. Die mathematischen Grundlagen bzw. die Algorithmen der asymmetrischen Verfahren beruhen im Allgemeinen auf schwer lösbaren mathematischen Problemen, z.B. der Primfaktorzerlegung großer Zahlen oder diskreten Logarithmen. Es war bisher noch nicht beweisbar, daß ein solches Verfahren sicher ist. Allenfalls läßt sich zeigen, daß ein bestimmtes Verfahren genauso schwer zu brechen, wie das zugrundeliegende Problem lösbar ist. Im Grunde funktioniert die asymmetrische Verschlüsselung ähnlich der symmetrischen. Der Unterschied liegt in der Verwendung der Schlüssel. Möchte man jemandem z.B. eine vertrauliche Nachricht zukommen lassen, so verschlüsselt man diese mit dem öffentlichen Schlüssel des Kommunikationspartners. Dies kann jeder tun, da der Schlüssel wie schon erwähnt öffentlich ist. Aber nur mit dem passenden privaten Schlüssel läßt sich die Nachricht wieder entschlüsseln. Dies kann folglich nur der alleinige Besitzer des privaten Schlüssels. Mit dem öffentlichen Schlüssel alleine kann also niemand etwas anfangen. Auch hier faßt die Abbildung 3 den eben erläuterten Weg z.B. einer verschlüsselten Nachricht von A nach B noch einmal zusammen. Abbildung 3: Asymmetrische Verschlüsselung Beispiele für aktuelle asymmetrische Verfahren sind RSA oder ElGamal. Ein Schlüsselaustauschverfahren ist Diffie-Hellman, welches eng mit ElGamal zusammenhängt. Grundlage dieser sind, wie schon beschrieben, ineffizient10 lösbare mathematische Probleme (Details siehe 10 Eine genauere Betrachtung bzw. Einordnung eines Problems in eine solche Kategorie, wie etwa polynomielle oder exponentielle – 12 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT [Buc04], [Men96]). Ein weiteres im Moment sehr aktuelles Verfahren ist das Elliptic Curve Cryptosystem (ECC). Dessen Vorteil ist, daß es auf einem schwereren mathematischem Problem basiert. Dadurch sind kleinere Schlüssel notwendig als z.B. in RSA, wird die Ausführung von Operationen effizienter und ist das ECC für Hardware-Implementierungen besonders attraktiv. 1.2.3 Verschlüsselung in der Praxis In den vorherigen Abschnitten 1.2.1 und 1.2.2 wurden zwei grundlegende Verschlüsselungsmethoden vorgestellt, die hier nun ein wenig verglichen werden sollen. Ein wesentlicher Unterschied ist die Art der verwendeten Schlüssel. Ein symmetrischer Schlüssel muß immer beiden Kommunikationspartnern bekannt sein. D.h., bevor man z.B. die erste verschlüsselte Nachricht austauschen kann, muß man sich auf einen gemeinsamen geheimen Schlüssel einigen bzw. diesen auf irgendeine Weise austauschen. Da man verschlüsselt, wenn man mittels eines unsicheren Übertragungsweges kommunizieren möchte, macht das Verschicken des geheimen Schlüssels über einen solchen Kanal wenig Sinn. Des weiteren muß man mit jedem Partner einen Schlüssel austauschen, was zum sogenannten Schlüsselaustauschproblem führt: Bei n Nutzern, von denen jeder mit jedem anderen vertraulich kommunizieren will, benötigt man insgesamt n ∗ (n − 1) 2 Schlüssel, welche natürlich auch gegenseitig ausgetauscht werden müssen11 . Außerdem muß jeder dieser Schlüssel sorgfältig aufgehoben werden, da es sich ja um geheime Schlüssel handelt. Bei der asymmetrischen Variante bestehen diese Probleme nicht, dafür andere. Im Folgenden sind die Vor- und Nachteile symmetrischer und asymmetrischer Verschlüsselungstechniken zusammengefaßt. Vorteile asymmetrischer gegenüber symmetrischen Verfahren • Kein Austausch geheimzuhaltender Schlüssel notwendig, • öffentliche Schlüssel nur bedingt sicherheitskritisch, • nur ein Schlüsselpaar pro Person. Probleme bzw. Nachteile asymmetrischer Verfahren • Langsame Berechnungen (im Verhältnis zu symmetrischen Verfahren ca. 1:70), • Nachweisen der Identität zu einem öffentlichen Schlüssel, • große Schlüssellängen (typisch sind z.B. AES mit 128Bit ggü. RSA mit 1024Bit), • keine Gruppenschlüssel (geheime symmetrische Schlüssel können einfach an mehrere Personen verteilt werden). Vorteile symmetrischer gegenüber asymmetrischen Verfahren • Schnelle Berechnungen/sehr effizient. Laufzeit, sei z.B. der theoretischen Informatik vorbehalten. 11 Auch dafür gibt es Lösungen, z.B. ein Key Distribution-Server als zentrale Stelle für die Schlüsselverteilung. – 13 – 1 1.2.4 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Hybridverfahren Nicht zuletzt aufgrund der bekannten Vor- und Nachteile jeder Verfahrensweise kommen in der Praxis oftmals keine reinen symmetrischen oder asymmetrischen Verfahren zum Einsatz, sondern Hybridverfahren. Auf diese Weise will man die Vorteile beider Möglichkeiten kombinieren. Bei der hybriden Verschlüsselung wird zunächst wie in Abbildung 2 gezeigt vorgegangen: Eine Nachricht wird symmetrisch verschlüsselt. Der benutzte Schlüssel ist allerdings meist ein Einmal-Schlüssel, ein sogenannter Sitzungsschlüssel oder Session-Key. Dieser wird anschließend wie in Abbildung 3 gezeigt asymmetrisch verschlüsselt, z.B. mit einem öffentlichen Schlüssel oder auch mit mehreren. Der asymmetrisch verschlüsselte Sitzungsschlüssel wird zusammen mit der verschlüsselten Nachricht übertragen. Geht die Nachricht an mehrere Empfänger, wird mit jedem öffentlichen Empfänger-Schlüssel der Sitzungsschlüssel verschlüsselt und alle werden an die Übertragung angehängt. Die Entschlüsselung funktioniert dann natürlich auf dem genau umgekehrten Wege, beginnend mit dem Entschlüsseln des Sitzungsschlüssel mittels des eigenen privaten Schlüssels usw. entsprechend der Abbildungen 3 und 2. 1.2.5 Hash und MAC Oftmals ist es nötig Nachrichten verkleinern zu können und zwar auf effiziente und sichere Art und Weise. Dazu benutzt man kryptographische Hash-Funktionen. Dies sind mathematische Abbildungen die Bitfolgen oder Bitstrings beliebiger Länge auf eine feste Länge n abbilden12 . Dadurch entstehen natürlich Kollisionen, d.h. es existieren Paare (x, x0 ) mit x 6= x0 und h(x) = h(x0 ). Eine Hash-Funktion h ist allerdings wie folgt definiert: h : {0, 1}∗ → {0, 1}n , x 7→ h(x) und (1) h ist eine Einwegfunktion, d.h. schwach kollisionsresistent: Zu einem gegebenem Wert h0 ist es praktisch unmöglich bzw. nicht effizient möglich, ein x zu finden, so daß h0 = h(x). (2) h ist (stark) kollisionsresistent: Es ist praktisch unmöglich bzw. nicht effizient möglich, irgendein Paar (x, x0 ) zu finden mit h(x) = h(x0 ). Beispiele für solche Hash-Verfahren, die eben diesen Anforderungen genügen, sind: DES-CBC, SHA-1 (Secure Hash Algorithmus) und RIPEMD-160. Bei den beiden letztgenannten handelt es sich z.B. um 160-Bit Hashes. Hash-Funktionen werden vor allem bei Signaturen (siehe Abschnitt 1.2.6) eingesetzt. Da die Berechnung eines Ursprungswertes durch Hash-Funktionen gerade verhindert wird, lassen sich Hash-Funktionen nicht für die direkte Ver- bzw. Entschlüsselung nutzen. Dennoch können Hash-Funktionen aufgrund ihrer gezeigten Eigenschaften die Sicherheit mancher Kryptosysteme erhöhen. Eine Erweiterung der Hash-Funktionen ist der Message Authentication Code (MAC). Für die Berechnung des korrekten sogenannten MAC-Tags – ähnlich dem Hash-Wert – ist dabei ein geheimer symmetrischer Schlüssel notwendig. Hiermit ist z.B. Authentifikation möglich, da nur die Kommunikationspartner, welche Inhaber des Schlüssels sind, den entsprechenden Tag erstellen sowie verifizieren, also überprüfen und sich somit authentifizieren können. 12 In diesem Zusammenhang wird auch der Begriff Message Digest verwendet. – 14 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Gängige MAC-Verfahren sind HMAC – wie z.B. HMAC-MD5 und HMAC-SHA-1 mit Basis MD5 bzw. SHA-1, UMAC, DES-CBC mit DES-Schlüssel, keyed MD5 (siehe [Men96]). 1.2.6 Signatur Eine weitere Möglichkeit, um u.a. ebenfalls Authentifikation zu betreiben, leitet sich aus den asymmetrischen Verschlüsselungsverfahren ab. Man kann nämlich die Benutzung der Schlüssel (siehe Abbildung 3) umkehren, womit sich digitale Signaturen erzeugen lassen. Beispielsweise kann man so eine eMail signieren, womit deren Urheber sicher feststeht. Des weiteren existieren reine Signaturverfahren, die sich nicht aus einem asymmetrischen Verschlüsselungsverfahren ableiten, aber daran angelehnte Konzepte verwenden, wie z.B. öffentliche und private Schlüssel. Das Signieren geschieht dadurch, daß man auf eine Nachricht den eigenen privaten Schlüssel anwendet und dementsprechend kann jeder, der den passenden öffentlichen Schlüssel kennt, die so entstandene Signatur verifizieren, also ihre Gültigkeit überprüfen (siehe [Buc04], [Men96]). Ist sie gültig, läßt sich die Nachricht als authentisch bezeichnen. Dies ist also eine Art von Umkehrung des asymmetrischen Verschlüsselungsvorgangs: Nur der Besitzer des privaten Schlüssels kann eine Nachricht signieren, also mit seiner eigenen digitalen Unterschrift versehen. Hingegen kann jeder mit dem öffentlichen Schlüssel diese Signatur überprüfen. Demgegenüber wird bei der Verschlüsselung der öffentliche Schlüssel benutzt, was jeder tun kann. Entschlüsseln kann nur der Inhaber des privaten Schlüssels. Da asymmetrische Verfahren viel langsamer sind als symmetrische, besteht beim Signieren von z.B. großen Dokumenten ein Effizienzproblem. Deswegen macht man sich beim Signieren in der Praxis meist Hash-Funktionen zunutze13 , welche man zuerst, also vor dem Signieren auf das entsprechende Dokument anwendet. Die Signatur wird also indirekt, d.h. über den Hash-Wert, verifiziert. Dies ist sicher, u.a. aufgrund der Eigenschaften der Hash-Funktionen. Abbildung 4 zeigt den gesamten Vorgang beim Erstellen und Verifizieren einer Signatur. Ein Beispiel für ein eingesetztes Verfahren ist der Digital Signature Algorithm (DSA). Es ist selbstverständlich möglich ein Dokument zu Signieren und auch verschlüsselt zu übertragen. Aus verschiedenen Sicherheitsgründen, die hier nicht näher erläutert werden sollen, kommen in der Praxis dann meist verschiedene Schlüssel für Verschlüsselung und Signatur zum Einsatz. Denn beide Vorgänge hängen eng zusammen und um es klar herauszustellen, anders als bei der handschriftlichen Unterschrift ist die digitale Signatur für jedes signierte Dokument unterschiedlich und dennoch exakt zu zuordnen. Dies bringt natürlich einige Vorteile mit sich, z.B. kann der Empfänger einer Signatur diese nicht für Fälschungen bei anderen Dokumenten benutzen, und es läßt sich beim Signieren ein sogenannter Zeitstempel (Time Stamp, siehe Abschnitt 2.8) einfügen. 1.2.7 Kryptosysteme und Schutzziele In Abschnitt 1.1.1 wurden sieben Schutzziele aufgeführt und erläutert. Mit den gezeigten Verfahren auch in Kombination sind diese erfüllbar, was teilweise offensichtlich ist. So ist natürlich mit der digitalen Signatur das Schutzziel der Authentizität, aber auch das der Integrität sicher gestellt. Letzteres bedeutet, bei gültiger Signatur ist das signierte Dokument auch unverändert. Kommt eine dritte Vertrauensinstanz hinzu, z.B. ein TrustCenter, ist mit ihr ebenso die Verbindlichkeit gesichert (siehe Abschnitt 2.2.2). Der MAC hingegen kann nur Authentizität und Integrität bieten. Durch Verschlüsselung erfolgt Vertraulichkeit, wie auch zum Teil die Anonymität in Kombination mit z.B. blinden Signaturen (siehe [Buc04], [Men96]). 13 Bei entsprechend kleinen Dokumenten kann man u.U. auf den Einsatz von Hash-Funktionen verzichten, etwa beim Signieren von IP-Paketen. Dies macht den gesamten Vorgang bzw. Abbildung 4 natürlich etwas weniger komplex. – 15 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Abbildung 4: Erstellen und Verifizieren digitaler Signaturen Anonymität, Verbindlichkeit und Verfügbarkeit sind allerdings schwieriger zu gewährleisten und hängen stark von den jeweiligen Gegebenheiten sowie den darauf anzuwendenden Verfahren ab (siehe u.a. [Eck02]). Die Datiertheit kann durch eine dritte Instanz in Kombination mit deren digitaler Signatur erfüllt werden. Auch hier kann diese Instanz wieder ein TrustCenter sein. 1.3 Angriffsformen, Abwehrmaßnahmen und Anwendungen Dieser Abschnitt ist bewußt kurzgefaßt, aber nach der bisherigen Einführung in kryptographische Methoden notwendig, um einen praktischen Einblick für die theoretisch erläuterten Verfahren und deren Bedeutung für die heutigen Schutzziele zu bekommen. Im Folgenden werden sodann einige Angriffsformen skizziert sowie kurz Implementierungen und Protokolle der in den vorherigen Abschnitten vorgestellten Verfahrensweisen beschrieben, welche erfolgreiche Abwehrmaßnahmen darstellen. 1.3.1 Angriffsziele Ziele von Angriffen sind natürlich die Umgehung von Kryptoverfahren bzw. Kryptosystemen und die damit abgesicherten Daten. In der einfachsten Form zielt ein Angriff also auf die Verschlüsselungstexte bzw. den Klartext sowie die verwendeten Schlüssel ab. – 16 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT In der heutigen Zeit geht dies natürlich einen Schritt weiter und ein Angriff richtet sich meist gegen die aus Abschnitt 1.1.1 bekannten Schutzziele, wie etwa gegen die Authentizität, die Vertraulichkeit oder die Verfügbarkeit, auf welche verschiedene konkrete Systeme und Dienste angewiesen sind. 1.3.2 Grundlagen von Angriffen Der Begriff der Kryptographie ist allgemein definiert als die Lehre von den Methoden zur Ver- und Entschlüsselung, wobei man heutzutage sicher mehr darunter versteht, wie schon in den vorherigen Abschnitten beschrieben. Selbstverständlich existieren aber auch Gegensätze zur Kryptographie. Wichtig ist hierbei die Kryptoanalyse – die Wissenschaft von Methoden zur Decodierung von Nachrichten. Denn natürlich muß man die Qualität kryptographischer Verfahren bewerten und sogar nachweisen können. In der Kryptologie, die eine Verknüpfung von Kryptographie und Kryptoanalyse darstellt, wird dies u.a. auch getan. Damit in Verbindung steht, die Möglichkeiten abzutasten ein Kryptosystem zu brechen (siehe [Eck02]). Nach der kurzen Begriffsklärung geht es im Folgenden um Angriffe auf Kryptosysteme. Ein solcher Angriff kann grundsätzlich auf mindestens drei Arten geschehen: • Auf die zugrundeliegende Mathematik, • auf die Struktur eines Protokolls, • auf die Implementierung14 in Soft- oder Hardware (Seitenkanal-Angriff ). Hierbei kann man wiederum zwei Arten unterscheiden: – Aktive Angriffe (z.B. Manipulation von Hardware), – passive Angriffe (z.B. Aufzeichnen Ein-/Ausgaben, Messen, Abhören). Für praktische Implementierungen gilt das Kerckhoff-Prinzip. Es besagt, daß die Sicherheit eines kryptographischen Verfahrens nur auf der Geheimhaltung des Schlüssels beruhen darf und nicht auf der Geheimhaltung des kryptographischen Algorithmus selbst. Verstöße gegen dieses Prinzip haben in der Vergangenheit bereits zu spektakuläreren Angriffen geführt (siehe z.B. [Nzz01]). Kryptosysteme bzw. Kryptoverfahren müssen demnach nicht nur theoretisch sicher und effizient sein, man benötigt ebenfalls eine sichere Implementierung. Hat man einen sicheren kryptographischen Algorithmus (wie RSA) aber eine schlechte und unsichere Implementierung, ist das resultierende Kryptosystem sinnlos. Theorie und Implementierung müssen also schon recht früh aufeinander abgestimmt werden. 1.3.3 Angriffe auf die Mathematik Die Kryptoanalyse folgt einem einfachen grundlegenden Prinzip: Ein Verschlüsselungstext bzw. eine codierte Nachricht hängt von dem ursprünglichen Klartext ab. Der Klartext wiederum ist nicht zufällig. Aus diesen Feststellungen resultieren einige Angriffsformen auf Kryptosysteme, die durch die zugrundeliegenden mathematischen Verfahren abgewehrt werden müssen. Eine offensichtliche Angriffsmöglichkeit auf ein Kryptosystem bzw. dessen gewährleistete Vertraulichkeit ist das Durchprobieren aller möglichen Schlüsselkombinationen (Brute Force), womit sich beispielsweise auch das Tauschverfahren aus Abschnitt 1.1 leicht brechen läßt. 14 Die Bedeutung von Attacken auf eine Implementierung sei durch folgendes Beispiel verdeutlicht: 1998 gab es eine erfolgreiche Attacke auf DES. Die sogenannte Differential Error Analysis benötigte 20 bis 200 Blöcke codierten Textes, um den DES-Schlüssel zu bestimmen. Hingegen benötigte die beste Nicht-Seitenkanal-Attacke gegen DES etwa 64 Terabytes an Blöcken von Klar- und Verschlüsselungstext (siehe [Osw01]). – 17 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Meist sind Attacken allerdings intelligenter. Es ist z.B. bekannt, daß in jeweiligen Sprachen gewisse individuelle Buchstaben oder Wörter mit einer bestimmten Häufigkeit bzw. in Kombination auftreten. Dazu sind bereits etliche Sprachanalysen bekannt und frei verfügbar, womit sich beispielsweise auch das Tauschverfahren aus Abschnitt 1.1 leicht brechen läßt, aber auch kompliziertere Verfahren. Ebenfalls gibt es eine Reihe von Angriffen, die abhängig von den Möglichkeiten des Angreifers sind, und z.B. auf den Schlüssel des Kryptosystems oder auf die Decodierung der übertragenen Verschlüsselungstexte abzielen. So z.B. die sogenannte Ciphertext-Only Attacke, bei welcher der Angreifer nur den Verschlüsselungstext mitlesen kann. Ist es ihm möglich ohne Kenntnis des Schlüssels den Klartext zu bestimmen, ist das benutzte Kryptosystem völlig unsicher. Ein anderes Beispiel ist die Known-Plaintext Attacke – hier kennt der Angreifer zu einem Verschlüsselungstext aus gewissen Gründen den zugehörigen Klartext – und einige mehr. Ein sicheres Kryptosystem muß all solchen Angriffsmöglichkeiten gewachsen sein. Eine der mächtigsten theoretischen Angriffe, dessen Durchführbarkeit in der Praxis nicht allzu leicht, dennoch alles andere als unmöglich ist, nennt man Man in the Middle. Dabei kann der in der Mitte zweier Kommunikationspartner befindliche Angreifer alle von beiden Seiten übertragenen Daten mitlesen und selbst in diese Kommunikation eingreifen. Die Abwehr eines solchen Angriffs ist schwierig und z.B. das Verfahren von Diffie und Hellman (siehe auch Abschnitt 1.2.2) in der einfachsten Form ist gegen diesen nicht sicher. Denn beim Austausch auch von nur öffentlichen Schlüsseln asymmetrischer Verfahren könnte ein solcher Angreifer seinen eigenen öffentlichen Schlüssel übertragen lassen unter der Vorgabe, dieser gehöre jemand anderem. Auf diese Weise kann der Angreifer dann alle mit diesem seinem öffentlichen Schlüssel verschlüsselten Daten mitlesen. Es existieren natürlich weitaus mehr Angriffsmöglichkeiten, gerade auch in Details der mathematischen Grundlagen, auf denen Kryptosysteme beruhen. Dazu sei hier allerdings auf z.B. [Buc04] oder [Men96] verwiesen. 1.3.4 Angriffe auf Protokoll-Strukturen Bei Protokoll-Strukturen, welche einen anwendungsbezogenen Ablauf von z.B. kryptographischen Methoden festlegen (siehe auch Abschnitt 1.3.7), kann die zugrundeliegende Mathematik genauso angegriffen werden wie im vorherigen Abschnitt geschildert. Denn natürlich kommen in Sicherheitsprotokollen auch die hier gezeigten mathematischen Verfahren zum Einsatz. Zusätzlich existieren Angriffe auf prinzipielle Annahmen sowie Protokollschritte, und auch Attacken wie Man in the Middle lassen sich auf Protokollstrukturen anwenden. Bei Netzwerken und einfachen Netzwerkprotokollen beispielsweise zielen Angriffe oftmals auf Authentizität und Verfügbarkeit (siehe Abschnitt 1.1.1) der Kommunikation ab, z.B. durch: • Spoofing (Vortäuschen einer Absenderadresse, also einer falschen Identität), • Session-Hijacking (Übernehmen einer anderen evt. bereits nachgewiesenen Identität), • Replays (Wiedereinspielen verschlüsselter und Klartext-Nachrichten, z.B. IP-Pakete), • DoS-Attacken (Denial of Service; Überfluten und Ausschalten eines Rechners). Diese Angriffsmöglichkeiten sollen hier nur kurz erwähnt werden. Für Details sei auf z.B. [Boe02], [Bus02] und [Eck02] verwiesen. – 18 – 1 1.3.5 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Seitenkanal-Angriffe ( Side Channel Attacks“) ” Implementierungen in Hardware sind meist stark optimiert, daher sehr effizient und oft genutzt, womit sie natürlich ebenso beachtenswert für Sicherheitsaspekte sind. Dennoch sind Seitenkanal-Angriffe nicht auf Hardware beschränkt, wenngleich sie eher selten auf Software erfolgen. Ein Seitenkanal entsteht im Allgemeinen aus unerwünschter Seiteninformation, welche unbeabsichtigt von der Hardware abgegeben wird. Analysiert wird z.B.: • Stromverbrauch (z.B. von Mikrochips; bekannt als Simple Power Analysis (SPA) und Differential Power Analysis (DPA)15 ), • Zeitverhalten (z.B. Ausführungszeiten von Operationen), • Temperatur (z.B. Veränderung, Anstiege), • Verhalten nach gezielter Beschädigung, • Elektromagnetische Strahlung von Hardware-Modulen (z.B. Tastatur, Kabel, Monitor, Grafikkarte etc.), was hauptsächlich für das Auslesen und Ausspähen von Daten aus der Ferne genutzt wird, wie etwa bei Bildschirmausgaben oder Paßworteingaben. Natürlich existieren auch Attacken gegen Software-Implementierungen, wie z.B. gegen: • Zeitverhalten (z.B. eines Servers), • Löschen von Dateien ohne Überschreiben (verschlüsseltes Dateisystem), • (Pseudo-)Zufallszahlengenerator. Diese Art von Angriffen kann sehr mächtig16 sein und auch in Kombination, z.B. auf Stromverbrauch und Zeitverhalten, auftreten. Schlüssel sind oftmals das Ziel solcher Attacken, deren Grundidee im Folgenden am Beispiel der SPA verdeutlicht werden soll und leicht einzusehen ist: Der augenblickliche Stromverbrauch der Hardware steht im direkten Zusammenhang zur ausgeführten Instruktion und den benutzten Daten17 . So können Operationen, z.B. die Addition, bzw. Schlüssel auf direktem oder indirektem Wege erkannt und abgeleitet werden (siehe [Osw01]). Besondere Maßnahmen gegen Seitenkanal-Angriffe Für Gegenmaßnahmen kann man zum einen auch hier wieder mathematisch vorgehen, wie in den vorherigen Abschnitten erläutert. D.h., man verändert vorhandene oder erstellt neue Algorithmen, die praktische Anforderungen berücksichtigen und diesen genügen. 15 Der Aufwand für die SPA ist verhältnismäßig klein. Notwendig sind ein digitales Oszilloskop und ein Standard-PC, um die gemessenen Daten zu verarbeiten. Ein tiefgehendes Verständnis über die Ausführung ist nicht nötig. Dies bedeutet also, daß nicht nur wenige Fachleute“ einen solchen Angriff durchführen können. Die DPA hingegen erweitert die SPA mit Methoden der ” Statistik und ist daher nicht so einfach anzuwenden. Dennoch ist sie die am häufigsten genutzte, weil erfolgreichste Vorgehensweise gegen Kryptosysteme. 16 Ein gutes Beispiel, um dies zu verdeutlichen, ist das Lesen einer eMail, die verschlüsselt versendet und auf den eigenen Rechner geholt wurde. Um diese eMail einmal lesen zu können, muß sie entschlüsselt und im Klartext am Bildschirm angezeigt werden. Ist der Angreifer in der Lage, z.B. die Bildschirmanzeige in einigen Metern Entfernung zu rekonstruieren, hat er alle vorgenommenen Verschlüsselungsmethoden umgangen. 17 Man betrachte z.B. das unterschiedliche elektrische Verhalten bei der CMOS-Technologie: n-MOS- und p-MOS-Transistoren sind verschieden, aber jeweils verantwortlich für High- und Low-Werte (also logische 1 und 0 in z.B. den verwendeten Daten). Dies läßt sich als Seiteninformation bezeichnen. – 19 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT Die zweite Möglichkeit liegt im Bereich der Hardware selbst: So haben die Hersteller in der Vergangenheit Verbesserung vorgenommen und Lücken auch in Form von Verwundbarkeiten geschlossen. Die Abgabe von Seiteninformation wurde minimiert, womit heute z.B. Chipkarten gegen viele Attacken, wie etwa auf die Temperatur, resistent sind (siehe [Osw01]). 1.3.6 Brechen von Schlüsseln oder Kryptoverfahren Das Brechen von Kryptoverfahren hat nicht zwingend, kann jedoch katastrophale Auswirkungen haben. Dies hängt sehr stark von dem Bereich bzw. dem Anwendungsfall ab (siehe z.B. Seite 7), in welchem sie eingesetzt werden. Es folgen ein paar kleinere Beispiele. Bei der eigenen Signatur gibt es mehr oder weniger kritische Problemfälle. Hat man z.B. ein Dokument digital signiert und verliert seinen privaten Schlüssel bzw. wird dieser oder das benutzte Kryptoverfahren kompromittiert, kann das Dokument mit neuem Schlüssel und bzw. oder neuem Verfahren einfach noch einmal signiert werden. In Vertragsfällen kann das Verlieren eines Schlüssels problematischer sein. Unter Umständen möchte ein Vertragspartner bewußt die Ungültigkeit eines signierten Vertrages herbeiführen. Die Handhabung solcher Fälle hängt stark von den Gegebenheiten ab (siehe Abschnitt 2.2.2). Schwieriger sieht es bei der Verschlüsselung aus, z.B.: Sind die Daten etwa auf dem eigenen Laptop nur verschlüsselt abgelegt, z.B. mittels verschlüsseltem Dateisystem, und geht der Entschlüsselungsschlüssel verloren, sind auch diese Daten vollständig verloren. Hier wird die Beachtung für eine Sicherheitskopie des Schlüssels deutlich. Beim Übertragen von verschlüsselten Nachrichten über einen öffentlichen Kanal, wie dem Internet oder einer Funkverbindung, muß das benutzte Kryptoverfahren zeitlichen Bestand haben. Denn die mitgelesene verschlüsselte Nachricht soll eventuell auch in mehreren Jahren oder Jahrzehnten nicht für einen Angreifer entschlüsselbar sein. Neuerliches Verschlüsseln dieser bereits abgefangenen Nachricht, deren Kryptoverfahren vielleicht später gebrochen wurde, mit einem anderen Kryptoverfahren ist offensichtlich sinnlos. Es kommt auch vor, daß ein Kryptosystem in Laufe der Zeit zwar nicht gebrochen wird, dennoch die benutzten Schlüssel für spätere Angriffe zu kurz geworden sind. Das bedeutet, um das Verfahren (wieder) sicher benutzen zu können, muß die Länge der Schlüssel erhöht werden, was sich natürlich wiederum nur auf die Sicherheit bei der zukünftigen Nutzung auswirkt. U.a. daher muß ein sicheres Kryptosystem von Grund auf zeitlichen Bestand haben. 1.3.7 Anwendungen und Protokolle In diesem Abschnitt sollen kurz einige aktuelle Anwendungen bzw. Clients, also Implementierungen und konkrete Protokolle für kryptographische Verfahren genannt werden. Diese können meist mehrere Schutzziele gewährleisten, also die geschilderten Angriffe erfolgreich abwehren und sind auch kombinierbar. Für weitere Details sei auf [Boe02], [Bus02], [Eck02] verwiesen. Zu beachten ist hierbei, daß auf allen Schichten des OSI-Modelles18 solche Anwendungen oder Protokolle zu finden sind, was natürlich verschiedene Konsequenzen in der Benutzbarkeit und Automatisierung nach sich zieht. PGP (Pretty Good Privacy) ist ein auch als Freeware“ weitverbreitetes Programm, welches ” zum Verschlüsseln und Signieren geeignet ist und etliche genannte Verfahren aus den Abschnitten 1.2.1ff. implementiert hat. Im Gegensatz zu dieser Lösung für eher kleinere und mittlere Anforderungen, ist Kerberos ein Protokoll für große sowie verteilte Dienste und Systeme. 18 Es handelt sich hierbei um das bekannte Modell für die Datenübertragung zwischen Computersystemen, bestehend aus sieben übereinanderliegenden Abstraktionsschichten, welche individuelle Aufgaben und Schnittstellen besitzen. OSI steht für Open Systems Interconnection und ist eine Sammlung von Standards der International Standardisation Organisation (ISO) (Details siehe [Bus02], [Boe02]). – 20 – 1 EINFÜHRUNG IN KRYPTOGRAPHIE UND COMPUTER-SICHERHEIT SSL (bzw. TLS) ist ein Kommunikationsprotokoll, welches zwischen Anwendungs- und Transportschicht angesiedelt ist und somit alle Anwendungen, die darauf zugreifen, absichert. Auf Netzwerk- und Data Link-Schicht finden sich einige Protokolle, z.B. IPSec, u.a. für Vertraulichkeit und Authentifikation, womit sich sogenannte Virtuelle Private Netze (VPN) realisieren lassen. Dabei handelt es sich um die Realisierung von logischen Direktverbindungen zum Datenverkehr über öffentliche Netze wie dem Internet oder Funkverbindungen. 1.4 Public Key-Infrastrukturen (PKI) Dieses Kapitel diente als Einführung in die Kryptographie, wobei auch praktische Aspekte aufgezeigt wurden. Im nächsten Kapitel wird die schon genannte Vertrauensinstanz, das TrustCenter näher erläutert und die damit verbundenen Public Key-Infrastrukturen. Denn damit können noch ausstehende Probleme gelöst werden: Die Schutzziele der Verbindlichkeit und der Datiertheit sowie die sichere Zuordnung von einer Identität zu einem öffentlichen Schlüssel bzw. Public Key. – 21 – 2 TrustCenter FlexiTrust Dieses Kapitel beschreibt die Möglichkeiten zur Realisierung einer PKI mit einem TrustCenter zum einen allgemein und zum anderen speziell bezogen auf das TrustCenter-Produkt Fle” xiTrust“. Dabei ist zu beachten, daß die üblichen und allgemeinen Eigenschaften eines TrustCenters natürlich auch bei FlexiTrust umgesetzt sind. Doch zunächst werden die Ziele und Aufgaben einer PKI im Allgemeinen etwas verdeutlicht.19 2.1 Ziele und Aufgaben von PKIs und TrustCentern In Kapitel 1 wurden verschiedene Kryptoverfahren vorgestellt und deren Vor- und Nachteile erläutert. Wie schon gesehen, kommen in der Praxis meist Hybridverfahren zum Einsatz, um Vorteile aller Varianten zu kombinieren. Einer dieser Vorteile ist die Nutzung von Verfahren mit öffentlichen Schlüsseln. Die essentielle Aufgabe einer PKI ist es nun darauf aufbauend, die Verknüpfung von Personen bzw. Identitäten zu deren öffentlichen Schlüsseln, z.B. mittels Zertifikaten (siehe nächster Abschnitt), sicherzustellen. Zertifikate stellen dabei heute das wichtigste Werkzeug dar. Natürlich besteht die Möglichkeit in einem kleinen Kreis von Personen eine PKI durch persönliche Kontakte“ aufzubauen und gegenseitig Zertifikate auszustellen bzw. Schlüssel ” auszutauschen. Die verbreitete Sicherheitssoftware PGP (Pretty Good Privacy) beispielsweise setzt genau an diesem Punkt an.20 Man spricht hier von Direct Trust. Dabei übernimmt jeder PKI-Teilnehmer selbst das Schlüsselmanagement, womit die Generierung und Verteilung von Schlüsseln gemeint ist. Bei großen Benutzermengen, die sich persönlich unbekannt sind, ist die Lösung des Direct Trust jedoch nicht ausreichend. Denn Vertrauen ist in solchen Gruppen nicht übertragbar. In diesem Falle wird eine unabhängige dritte Instanz benötigt oder eine kleine Menge der solchen, wodurch eine Vertrauensbasis sowie eine Vertrauenshierarchie geschaffen wird. Innerhalb einer solchen hierarchischen PKI gibt es dann nur eine oder wenige Instanzen, welchen wirklich vertraut werden muß. Man spricht von der sogenannten Certification Authority (CA). Man kann sagen, die CA stellt die oberste PKI-Instanz dar, ihr müssen alle PKITeilnehmer vertrauen. Nur sie darf Zertifikate und CRLs (siehe auch Abschnitt 2.2) ausstellen, signieren und veröffentlichen. Ein TrustCenter beispielsweise stellt eine solche Instanz dar. Es registriert Personen, welche an einer PKI teilnehmen bzw. PKI-Mitglieder werden wollen, z.B. auch durch persönliche Überprüfung und stellt diesen sodann ihr individuelles Zertifikat für diese PKI aus (siehe Abschnitte 2.4ff.). Die PKI-Teilnehmer können nun mit Hilfe ihrer Zertifikate untereinander z.B. vertraulich kommunizieren. Das TrustCenter legt dazu, z.B. durch die Schlüsselgenerierung, einige der genutzten kryptographischen Verfahren fest. Dies gewährleistet beste Kontrolle für eingesetzte Algorithmen, Verfahren und deren Schlüssel. Denn Schlüssel beispielsweise sind nicht unabhängig von den zugrundeliegenden Verfahren. Ein bestimmtes Verfahren erzwingt meist bestimmte Schlüsseleigenschaften, und so sind beispielsweise Schlüssel für symmetrische und asymmetrische Verfahren völlig unterschiedlich. 19 Nicht immer sind PKIs vonnöten, also das Nutzen von Public Key-Verfahren. Dies hängt stark von der jeweiligen Anwendungsanforderung ab. Die Grundbuchgerichte Hessens beispielsweise setzen zum Bearbeiten ihrer elektronischen Akten, die auf einem für ganz Hessen zentralen Server abgelegt sind, auf wechselnde Paßwörter zur Authentifikation bzw. Unterschrift. 20 Die Möglichkeiten von PGP gehen allerdings wesentlich weiter, so läßt sich beispielsweise ein Key-Server nutzen (siehe auch Abschnitt 1.2.3). – 22 – 2 TRUSTCENTER FLEXITRUST PKIs, realisiert z.B. mit einem TrustCenter, sind oftmals sehr individuell aufgebaut. Daher legt jede PKI ihre eigene sogenannte Policy oder Sicherheitspolitik öffentlich fest.21 Ein TrustCenter bietet u.a. den besten Schutz vor den Angriffsmöglichkeiten aus Abschnitt 1.3.2ff. Durch entsprechende Sicherheitspolitik beispielsweise ist ein Man in the Middle-Angriff durch eine TrustCenter-PKI leicht abzuwehren. Denn ein zentrales TrustCenter hat es leicht seinen öffentlichen Schlüssel bekanntzugeben und dessen Korrektheit von PKI-Teilnehmern überprüfen zu lassen. So kann es beispielsweise den öffentlichen Schlüssel selbst oder zur Überprüfung des Schlüssels einen Fingerprint 22 verschicken oder über das Internet bzw. in Papierform veröffentlichen. Folglich kann also jeder Signaturen, welche vom TrustCenter, also der Vertrauensinstanz selbst erstellt wurden, verifizieren. Also stellt ein TrustCenter die besten Rahmenbedingungen für die Personalisierung von Schlüsseln, z.B. auch nach gesetzlichen Maßstäben (siehe Abschnitt 1.1.1 über Verbindlichkeit), zur Verfügung. Dazu gehören ebenso nicht-technische Maßnahmen, wie z.B. geschützter Unterbringungsort für TrustCenter-Server oder das Vieraugenprinzip usw.23 Neben den allgemeinen Schutzzielen aus Abschnitt 1.1.1, haben PKIs im speziellen folgende Ziele: • Verknüpfung von Personen zu öffentlichen Schlüsseln, • Verteilung öffentlicher Schlüssel, • Authentizität öffentlicher Schlüssel. Für TrustCenter leitet sich daraus ab bzw. gilt zusätzlich: • Verbindlichkeit, • Datiertheit. Aus diesen Zielen resultieren für das TrustCenter die folgenden Aufgaben: • Veröffentlichung von Teilnehmer-Zertifikaten, • Veröffentlichung von Revokations-/Sperrinformationen (z.B. Certificate Revocation Lists (CRLs) bzw. Sperrlisten), • Veröffentlichungen typischerweise über das Internet. 2.2 Zertifikate und ihre Bedeutung Ein Zertifikat ist eine Art von digitalem Ausweis. Es enthält u.a. den Namen seines Besitzers, den Namen der ausstellenden Behörde (Zertifizierungsstelle, also CA), einen Gültigkeitszeitraum, den öffentlichen Schlüssel des asymmetrischen Schlüsselpaares des Besitzers sowie weitere mögliche Daten. Über die digitale Signatur, welche die CA mit ihrem öffentlichen Schlüssel 21 Als Beispiel sei hier die über ein Java-Framework implementierte FlexiPKI“ aus der Arbeitsgruppe von Prof. Buchmann ” an der TUD erwähnt, welche, wie schon am Namen zu erkennen, ein flexibles System zur Verfügung stellt, kryptographische Verfahren zu benutzen, leicht auszutauschen und zu wählen. Auch eine Failsafe-PKI, also das sichere Ersetzen von gebrochenen Verfahren und Aufrechterhalten der PKI, ist so möglich. 22 Ein Fingerabdruck ist ein eindeutiger und sicherer Hash-Wert (siehe Abschnitt 1.2.5) über ein Dokument, hier über den öffentlichen Schlüssel. 23 Das Festlegen und Durchsetzen solcher Maßnahmen hängt natürlich stark von den jeweiligen Anforderungen ab. Außerdem muß man hervorheben, daß außerhalb von kryptographischen Protokollen der Begriff der Sicherheit sehr stark von den Umgebungsbedingungen und vor allem den Verantwortlichen hinter dem TrustCenter abhängt. Dabei können bestimmte Regeln, z.B. beim Austausch zwischen den TrustCenter-Komponenten und bei der jeweiligen Betreuung einer Komponente im Allgemeinen, eine zentrale Rolle spielen. Zum Vergleich kann man den Ablauf der Bundestagswahlen heranziehen. Betrug ist hier nur bei bewußtem oder unbewußtem Fehlverhalten bzw. fehlerhaftem Kontrollverhalten einer großen Menge der Wahlbetreuer möglich. – 23 – 2 TRUSTCENTER FLEXITRUST über das gesamte Zertifikat bildet, wird der öffentliche Schlüssel eindeutig an seinen Benutzer gebunden. Damit wird also das primäre Ziel von PKIs, die Personalisierung eines öffentlichen Schlüssels erreicht. Die Vorteile sind leicht zu erkennen, denn ein TrustCenter kann so die Vergabe und Nutzung von öffentlichen Schlüsseln steuern. Durch Zertifikate ist es möglich, einen Kreis von Personen für die Teilnahme an einer PKI festzulegen. Dies bedeutet auch, daß man spezielle Personen, z.B. Angreifer, oder spezielle Schlüssel, z.B. gebrochene, von der Kommunikation innerhalb der PKI ausschließen kann. Ein Zertifikat kann beispielsweise Daten wie eine eindeutige Seriennummer oder einen Gültigkeitszeitraum enthalten und den jeweiligen öffentlichen Schlüssel daran binden. Zertifikate lassen sich daher sperren, man spricht hier von Revokation. Der enthaltene öffentliche Schlüssel ist auf diese Weise zwar ebenfalls gesperrt, aber eine Kontrolle, ob dieser z.B. erneut verwendet oder innerhalb einer anderen PKI ebenfalls genutzt wird, ist impraktikabel. Natürlich ist es äußerst sinnvoll, daß für Zertifikate ein einheitlicher Standard unabhängig von der jeweiligen PKI verwendet wird. Dies wird mit dem X.509 -Standard, z.B. in der Version 3, daher auch getan. Ein X.509v3-Zertifikat besteht zum einen aus Standard-Feldern bzw. Standard-Attributen und ist im ASN.1-Format codiert. Des weiteren kann es Extensions enthalten, wobei es sich um frei definierbare Felder handelt. Jeder Zertifikatsaussteller kann unter der Beachtung von Formatregeln zusätzliche Felder und Informationen, eben sogenannte Extensions in ein Zertifikat einfügen. Extensions sind ab Version 3 in einem X.509-Zertifikat erlaubt. Auch hier gibt es schon vordefinierte Standard-Extensions für PKIs. Ein Beispiel für ein Zertifikat unter Verwendung des X.509-Standards findet sich in Abbildung 5. Somit ist eine Veröffentlichung von Zertifikaten im hierarchischen Modell (siehe auch Abbildung 7) sehr einfach. Im Beispiel enthält das Zertifikat den Issuer , also den Aussteller bzw. die CA sowie den Inhaber des Zertifikats als Subject und beide sind über ihren Distinguished Name (siehe Abschnitte 2.7 und 2.7.6) eindeutig identifiziert. Auf Distinguished Names wird im Folgenden noch näher eingegangen, hierbei handelt es sich aber lediglich um eine eindeutige Kennzeichnung. Revokations- bzw. Sperrlisten, also Listen mit revozierten Zertifikaten lassen sich über den Verzeichnisdienst (siehe Abschnitt 2.7) bzw. den Distinguished Name des Issuers ebenfalls leicht erreichen und deren Download, z.B. von einer PKI-Clientsoftware aus, automatisieren. Certificate Data: Version: 3 (0x2) Serial Number: 44 (0x2c) Signature Algorithm: sha1WithRSA Issuer: C=DE, O=TUD, OU=FB20, OU=CDC, CN=FlexiTrustCA Validity Not Before: Nov 19 23:00:00 2002 GMT Not After : Nov 19 23:00:00 2003 GMT Subject: C=DE, O=TUD, OU=FB20, OU=CDC, CN=Juergen Jonny Steinmann [...] --- Öffentlicher Schlüssel als Binärwert --[...] --- Signatur der entsprechenden CA über das gesamte Zertifikat --[...] Abbildung 5: Beispiel für ein Zertifikat mit Distinguished Names – 24 – 2 2.2.1 TRUSTCENTER FLEXITRUST Kommunikation mit Zertifikaten Zur Kommunikation (siehe Abschnitt 2.7) mit einem PKI-Teilnehmer wird nicht dessen öffentlicher Schlüssel sondern dessen Zertifikat gesucht. Benutzt wird natürlich jedoch der darin enthaltene Schlüssel. Ein TrustCenter nimmt die Veröffentlichung der Zertifikate vor (siehe Abschnitt 2.7) und auch die Veröffentlichung von Sperrlisten, welche ungültige Zertifikate und somit ungültige Schlüssel enthalten. Auf diese Weise findet also der Schlüsselaustausch statt – unter Beachtung der jeweiligen Policy. Natürlich werden so ebenfalls für Kryptoverfahren wichtige Schlüsseleigenschaften oder -längen festgelegt. 2.2.2 Schutzziele und Zertifikate Aufgrund der Personalisierung von Schlüsseln durch Zertifikate werden bestimmte Schutzziele überhaupt erst realisierbar und zwar: • Verbindlichkeit, • Authentizität, • Datiertheit (siehe Abschnitt 2.8). Authentizität ist nur dadurch gewährleistet, daß der Absender innerhalb einer Kommunikation bekannt ist. Dies wird nur möglich, wenn der verwendete Schlüssel auch einer Person zugeordnet werden kann (siehe Abschnitt 1.1.1). Verbindlichkeit (siehe auch Abschnitt 1.1.1) beruht somit natürlich auf Authentizität. Doch Verbindlichkeit geht darüber hinaus. Sie verlangt, daß man den Inhalt und Absender eines Kommunikationsvorgangs, z.B. einer eMail, Dritten gegenüber beweisen kann. Dazu benötigt man: • Authentizität, • Verwendung von Public Key-Verfahren bzw. digitalen Signaturen (siehe Abschnitt 1.2.6), • eine Vertrauensinstanz bzw. ein TrustCenter. Wie in Abschnitt 2.1 gezeigt, bietet das TrustCenter die Rahmenbedingung für die Personalisierung von Schlüsseln. Durch digitale Signaturen wird gewährleistet, daß digitale Unterschriften ausschließlich vom Schlüsselinhaber selbst angefertigt werden können. Die Authentizität ist durch die beiden vorherigen Punkte mit eingeschlossen. 2.3 TrustCenter-Struktur auf Basis von FlexiTrust Die spezielle Struktur des TrustCenters FlexiTrust ist in Abbildung 6 zu sehen. Die einzelnen Teile bzw. Komponenten des TrustCenters (bzw. Kürzel in der Abbildung) sind die folgenden: • Registration Authority (RA), • Key Authority (KA), • Certificate Management Authority (CMA), • Directory Service (DS), – 25 – 2 TRUSTCENTER FLEXITRUST • Time Stamp Service (TSS). Wie in der Abbildung zu erkennen, bildet die CMA das Herzstück des TrustCenters, da hier alle Bereiche zusammenfinden. Anlaufstellen zum Kontakt mit dem TrustCenter sind durch die äußeren Pfeilen dargestellt, die inneren Pfeile stellen den internen Ablauf dar. Im Folgenden werden nun die einzelnen fünf Bereiche näher beleuchtet sowie die Abläufe im und um das TrustCenter genauer erläutert. Abbildung 6: Struktur des TrustCenters FlexiTrust 2.3.1 Komponentenmodell auf Basis von FlexiTrust Abbildung 6 zeigt nicht nur die Bestandteile von FlexiTrust sondern auch dessen externe und interne Vorgänge. Das Diskettensymbol soll andeuten, daß Interaktion im betreffenden Falle nicht unmittelbar möglich ist bzw. sein soll (siehe dazu die nächsten Abschnitte), z.B. wegen Sicherheits- oder Korrektheitsprüfungen und Signierungsvorgängen. Von außen hat man drei Zugangsmöglichkeiten zum TrustCenter und zwar über die Komponenten: • Registration Authority, • Directory Service bzw. Verzeichnisdienst, • Time Stamp Service. Die Registration Authority stellt also die Registrierungsautorität dar. Das bedeutet, ein potentieller PKI-Teilnehmer tritt an die RA heran, um die Mitgliedschaft in der PKI zu beantragen. Für den internen Ablauf im TrustCenter FlexiTrust sind alleine die drei Komponenten RA, KA und CMA zuständig, welche zusammen das eigentliche TrustCenter bilden. Natürlich ist es – 26 – 2 TRUSTCENTER FLEXITRUST wichtig, daß die meisten Abläufe zwischen den Komponenten sicher sowie automatisiert vonstatten gehen können. Wie in der Abbildung angedeutet, beginnt beispielsweise die KA ihre Arbeit erst auf Initiierung durch die RA, z.B. bei der Schlüssel-Erzeugung oder -Wiederherstellung, und die RA kann nur indirekt über die KA mit der CMA interagieren. Natürlich existieren verschiedene Möglichkeiten und Modelle für Realisierung eines TrustCenters (siehe auch [Ada02]).24 Im Folgenden wird nun ein konkretes Modell beschrieben und definiert, basierend auf der gezeigten Struktur von FlexiTrust. 2.4 Registration Authority Die RA stellt die zentrale Stelle zur Registrierung von PKI-Teilnehmern dar. Man kann die RA also als Eintrittspforte“ zur PKI bezeichnen. Bei einem PKI-Teilnehmer, im Folgenden ” auch bezeichnet als Entity, handelt es sich jedoch nicht ausschließlich um eine Person. Auch Computer oder Computer-Dienste können Entities sein.25 Die RA initiiert ebenfalls andere TrustCenter-Vorgänge, wie z.B. die Schlüsselerzeugung in der KA. Zur Registrierung an sich gehören, neben dem Erfassen der individuellen Registrierungsdaten bzw. des Registrierungsdatensatzes, viele Aufgaben und Ziele, um die Basis für den TrustCenter-Betrieb zu gewährleisten, wie z.B.: • Annahme von Zertifikatsanträgen, • Annahme von Revokationsanträgen, • Verknüpfen von Registrierungsdaten und Zertifikaten, • Gewährleisten der Vollständigkeit der Registrierungsdaten, • Gewährleisten der Korrektheit der Registrierungsdaten, • Gewährleisten der Vertraulichkeit der Registrierungsdaten, • Schutz vor Manipulation der Registrierungsdaten, • Nachvollziehbarkeit und Nachweisbarkeit aller Abläufe. Diese Aspekte sind nicht bei jeder konkreten RA-Realisierung vorhanden oder gleich und können je nach Ablauf des Registrierungsvorgangs im entsprechenden Anwendungsszenario optional sein. Die Daten, welche von der RA erhoben und gespeichert werden müssen, stellen die erfaßte Identität einer Entity dar, und können verschiedene Sicherheitsanforderungen bzgl. ihrer Herkunft besitzen: • Registrierung ohne Überprüfung (z.B. online), • Registrierung mit Überprüfung (z.B. persönlich durch Ausweis), • Übernahme von vertrauenswürdigen Quellen (z.B. Firmendatenbank), • Mischformen. 24 Die Struktur von bzw. Gewaltenteilung bei FlexiTrust ist sicher nur eine von mehreren Möglichkeiten, auf welche hier allerdings ausführlich eingegangen wird. Aber es wäre ebenfalls denkbar, daß z.B. RA und KA eine einzige Komponente bilden und nicht getrennt werden. 25 In dieser Arbeit ist hauptsächlich die Rede von Personendaten, wenn Registrierungsdaten angesprochen werden. Jedoch ist es auch denkbar, daß Rechner, wie z.B. Workstations in einem Computer-Netzwerk, registriert und für eine PKI zertifiziert werden. Dies beeinflußt die vorgestellten Systeme und Ideen dieser Arbeit jedoch kaum. – 27 – 2 TRUSTCENTER FLEXITRUST Alle, auch nach anderen Modellen aufgebaute, TrustCenter haben gemeinsam, daß Anforderungen und Verfahrensweisen etc. dieser Art, über die jeweilige Sicherheitspolitik des TrustCenters, auch Policy genannt, festgelegt werden. In diesem Modell müssen sie von der RA durchgesetzt werden. Die Erfassung von Daten kann grundsätzlich auf zwei verschiedene Arten durchgeführt werden und zwar zentral oder verteilt, also dezentral. Dabei kann sowohl die Erfassung als auch die Datenhaltung zentral oder dezentral sein – je nach individueller Anwendungsanforderung. Nach der erfolgreichen Registrierung eines PKI-Mitglieds kann die RA sodann Vorgänge bei der KA, wie z.B. Zertifikatserzeugung, initiieren. Durch das Binden der Registrierungsdaten an ein Zertifikat und das Signieren von Zertifikaten durch die KA wird die Personalisierung von Schlüsseln durch das TrustCenter vollzogen und abgeschlossen. Weitere Aspekte und Details zum Registrierungsablauf sowie zu RA-Aufgaben im vorgestellten und definierten TrustCenter-Modell finden sich in Kapitel 4. 2.5 Key Authority Die KA hat die Schlüsselerzeugung und das Schlüsselmanagement zur Aufgabe. Dabei geht es nicht um die Veröffentlichung von Schlüsseln oder Zertifikaten. Die KA stellt eine reine OfflineKomponente dar – zum einen aus Sicherheitsgründen, da Schlüssel hoch sicherheitskritisch sind, und zum anderen weil aufgrund der Struktur von FlexiTrust keine Notwendigkeit besteht, die KA über eine Online-Schnittstelle über das Internet zugänglich zu machen. Die KA hat als einzige Komponente des TrustCenters folgende Eigenschaften: • Besitzer des privaten CA- bzw. Aussteller-Schlüssels, • Möglichkeit zum Einsehen von fremden Privatschlüsseln. Als zentrale Stelle für Schlüssel kommen der KA folgende essentielle Aufgaben zu: • Unterschreiben/Signieren von Zertifikaten, • Unterschreiben von Revokationslisten, • Erzeugung und Auslieferung von Schlüsselpaaren. D.h., die KA übernimmt Aufgaben, deren Ergebnisse nach außen hin sichtbar sind. Dennoch erfolgt die Ausführung der Aufgaben wie schon beschrieben nicht online. Die Ergebnisse wiederum werden nur indirekt und zwar mittels der CMA (siehe nächster Abschnitt) weitergegeben, z.B. per manueller Weitergabe. Die Aufgaben der KA bzgl. Schlüsseln sind Erzeugung, Transport, Zerstörung, Hinterlegung, Speicherung und Wiederherstellung. Dies bedeutet also z.B., daß durch die KA ein Key-Backup möglich wird (vgl. Abschnitt 1.3.6) oder private Teilnehmerschlüssel generiert und verschickt werden, sofern ein Teilnehmer keine eigenen Schlüssel besitzt. Besitzt ein Teilnehmer hingegen schon ein Schlüsselpaar, welches er benutzen möchte, so muß er seinen öffentlichen Schlüssel hinterlegen. Zum Verschicken privater Schlüssel vom TrustCenter an den jeweiligen Teilnehmer bzw. zum sicheren Lagern und Aufbewahren dieser werden Tokens bzw. Personal Security Environments (PSEs) verwendet. Sie gewährleisten, daß ein privater Schlüssel nur vom späteren Besitzer einsehbar wird und daß nur der Besitzer Zugriffs- und Benutzungsberechtigung auf seinen privaten Schlüssel erhält. – 28 – 2 2.6 TRUSTCENTER FLEXITRUST Certificate Management Authority Natürlich kommt der KA eine zentrale, weil sicherheitskritische Aufgabe zu. Da die KA jedoch offline arbeitet, hat die CMA die wichtige Aufgabe die Erzeugnisse der KA zu veröffentlichen. Man kann also sagen, die CMA übernimmt die nach außen hin sichtbaren TrustCenterAufgaben, die schon in Abschnitt 2.1 aufgezeigt wurden. Wie in Abbildung 6 erkennbar ist, ist die CMA also die Online-Schnittstelle nach außen und zwar über die ihr direkt unterstehenden Dienste Directory Service und Time Stamp Service. Über diese Dienste geschieht beispielsweise das Verschicken von Schlüsseln, Veröffentlichen von Zertifikaten und Revokation von Zertifikaten. Hierbei muß erneut hervorgehoben werden, daß diese Vorgänge automatisiert und sicher erfolgen sollen. Dabei ist selbstverständlich auch eine Interaktion von CMA und KA notwendig, z.B. bei Problemen bzgl. eines bestimmten Schlüsselpaares. Des weiteren kommt der CMA eine wichtige Aufgabe während der Verteilung von privaten Schlüsseln bzw. Aktivierung von Teilnehmerkonten der PKI zu. Da die Registrierung eines PKITeilnehmers meist in mehreren Schritten erfolgt, ist die Freischaltung eines Teilnehmerkontos, was z.B. das PKI-Zertifikat oder den Teilnehmer-Entry (siehe Abschnitt 2.7) miteinschließt, recht komplex. Denn dazu muß beispielsweise berücksichtigt werden, ob ein privater Schlüssel erfolgreich und fehlerlos an die entsprechende Person ausgeliefert wurde (siehe z.B. [Kar04] für weitere Details). Bei diesen Vorgängen ist eine Zusammenarbeit zwischen RA und CMA unumgänglich, da der RA für ihre Aufgaben die Datenbank mit den Teilnehmerdaten untersteht. Zusammenarbeit ist allerdings nur indirekt über die KA, welche wiederum von der RA initiiert wird, oder über die TrustCenter-Datenbank (siehe Kapitel 4) möglich. 2.7 Directory Service Wie im vorherigen Abschnitt erläutert, hat die CMA die Aufgabe, TrustCenter-Leistungen nach außen hin zugänglich zu machen. Dies geschieht allerdings nicht direkt, sondern über den der CMA unterstehenden Verzeichnisdienst. TrustCenter-Aufgaben wie z.B. Verteilung öffentlicher Schlüssel und Veröffentlichung von Zertifikaten werden also durch den Verzeichnisdienst ausgeführt. Der Verzeichnisdienst bezieht seine Existenzberechtigung vor allem aus praktischen Gründen. Möchte man eine TrustCenter-PKI aktiv nutzen, also etwa eine eMail an einen anderen PKI-Teilnehmer verschicken, benötigt man dessen öffentlichen Schlüssel bzw. dessen Zertifikat. In manchen Fällen, z.B. wenn man die Person gut kennt, können direktere“ Wege zum ” Austausch von Schlüsseln und Zertifikaten existieren, wie durch persönlichen Austausch, aber oftmals ist dies nicht möglich und gerade bei großen sowie sich unbekannten Benutzergruppen impraktikabel. Daher benötigt man in der Praxis etwas zu einem Telefonbuch oder den Gelbe Seiten“ ” vergleichbares für PKIs, um seinen Kommunikationspartner bzw. dessen Zertifikat einfach finden zu können: Den Verzeichnisdienst. Bei PKIs muß man also auch vor Kommunikationsvorgängen eine Person bzw. deren Zertifikat mittels des Verzeichnisdienstes erst suchen und aufgrund von Revokationen auch stets die weitere Gültigkeit von Zertifikaten, z.B. automatisiert, überprüfen, wobei Revokationslisten ebenfalls über den Verzeichnisdienst bezogen werden. – 29 – 2 2.7.1 TRUSTCENTER FLEXITRUST Aufgabe von Verzeichnisdiensten Die wesentliche Aufgabe eines Verzeichnisdienstes innerhalb einer Public Key Infrastruktur ist es, z.B. über das Internet die Veröffentlichung von Teilnehmer-Zertifikaten vorzunehmen, und damit einher geht selbstverständlich die Veröffentlichung von Revokations- bzw. Sperrlisten, also von Certificate Revocation Lists (CRLs). Allgemein haben Verzeichnisdienste folgende Eigenschaften26 : • sie greifen auf Datenbanken zu und stellen selbst keine Datenbanken dar, • ihre Struktur ist hierarchisch, • Suchen und Lesen sind die am häufigsten benutzten Operationen. Ein Verzeichnisdienst läßt sich also wie folgt charakterisieren: Er stellt eine Schnittstelle dar zwischen Datenbank und Verzeichnis, er übernimmt die Aufbereitung und Bereitstellung der Verzeichnisdaten, er stellt Zugriffs- und Suchmöglichkeiten von außen auf das Verzeichnis zur Verfügung. Es gibt einige Möglichkeiten einen Verzeichnisdienst für PKIs zu realisieren. Das hierfür allerdings gängigste und dominanteste Protokoll für den Einsatz bei Verzeichnisdiensten ist – trotz mancher praktischen Schwierigkeiten – das Lightweight Directory Access Protocol (LDAP) bzw. der X.500 -Standard. Die Entwicklung und Eigenschaften dieses Protokolls, sollen im Folgenden kurz erläutert werden. 2.7.2 DAP und X.500 Der Standard X.500 bezeichnet ein allgemeines Datenmodell, welches Informationen oder Daten in Form eines hierarchisch strukturierten Baumes anordnet. Hierbei handelt es sich um den sogenannten Directory Information Tree (DIT), dessen Knoten als Entry bezeichnet werden. Jeder Entry besteht aus einer Menge von Attributen und jedes Attribut wiederum besteht aus dem Attribut-Typ und einem oder mehr Attributwerten. Des weiteren ist jeder Entry mit einem eindeutigen Namen versehen, dem Distinguished Name (Details siehe Abschnitt 2.7.6), welcher sich aus der hierarchischen Baumstruktur, nämlich aus allen Vorgängern eines Entrys ableitet. Dieser Baum aus dem X.500-Standard ist die allgemeine Definition eines Verzeichnisses und ist folglich auch für die Nutzung außerhalb von PKIs geeignet. Ein gängiges Protokoll zum Zugriff auf einen solchen DIT ist das Directory Access Protocol (DAP). In diesem auch standardisierten Protokoll war bzw. ist die Unterstützung für PKIs bereits enthalten. Es definiert allgemein ausgedrückt die Kommunikation zwischen Directory User Agent (DUA) und Directory System Agent (DSA), also z.B. Client und Server. Das X.500-Modell hat eine Vielzahl von möglichen Anwendungen. Z.B. kann man damit ein einfaches Benutzerverzeichnis realisieren mit Benutzerdaten wie etwa Adresse, Telefonnummer und eMail-Adresse oder ein Druckerverzeichnis in einem Netzwerk mit Informationen über den Standort, die Druckerart, den druckbaren Seiten pro Minute und Zugriffsrechten. Auch ist es möglich den Directory Information Tree über mehrere Server zu verteilen, den Verzeichnisdienst also als verteiltes System zu betreiben oder sinnvoll aufzuteilen. Dies ist vor allem für TrustCenter und verteilte PKIs interessant. 26 Ein Beispiel für einen Verzeichnisdienst außerhalb von Kryptographie und PKIs ist das Domain Name System (DNS), welches die Klartextnamen von Computern in IP-Adressen umsetzt etc. – 30 – 2 2.7.3 TRUSTCENTER FLEXITRUST LDAP und X.509 Da X.500 ein in der Praxis oft eingesetztes Datenmodell ist, sollten PKI-Verzeichnisdienste auf dem X.500-Standard aufbauen. Dadurch entstehen jedoch einige praktische Probleme. Man benötigt ein geeignetes Protokoll zur Kommunikation zwischen PKI-Client und Verzeichnisdienst bzw. -Server. DAP unterstützt zwar vollständig PKIs, ein Problem von DAP allerdings ist dessen Inkompatibilität zum TCP/IP-Protokoll. U.a. diese Probleme löst LDAP, welches sich aus DAP ableitet. Daher ist LDAP das in der Praxis am meisten eingesetzte Protokoll für diese Art von PKI-Anwendung, was nicht zuletzt an der vorhandenen und freien OpenSource-Implementierung des Standards liegt (siehe [Ope04]). Durch den Zusammenhang zu DAP stellt der Zugriff auf X.500-Verzeichnisse kein Problem dar. Jedoch bestehen ebenfalls mit LDAP Probleme bei der Kommunikation innerhalb von PKIs, welche die mittlerweile standardmäßig eingesetzten X.509v3-Zertifikate benutzen. Die Probleme rühren vom Vereinfachungsprozeß her, welcher von DAP zu LDAP stattfand, womit auch die vollständige PKI-Unterstützung von DAP zu LDAP zunächst verloren ging. Dennoch sind X.500 bzw. LDAP sehr stark verbreitete und genutzte Standards. Daher ist es natürlich sinnvoll, daß Verzeichnisdienste für PKIs auf diese zurückgreifen – was sie bereits auch tun, da so keine grundlegende Erneuerung von Software-Infrastrukturen vonnöten ist. Systeme, welche X.500 sowie LDAP auch außerhalb von PKI-Anwendungen nutzen und unterstützen, sind z.B.: • IBM DB2 (Zugriff auf Verzeichnisdienste per LDAP), • Microsoft Exchange (LDAP Directory Gateway), • Microsoft Internet Explorer, • Microsoft Windows 2000 Active Directory Service, • Netscape Browser-Typen, • Novell eDirectory (LDAPv3 in Netware 5 als Zugriffsprotokoll auf die NDS27 ), • Siemens DirX. Des weiteren läßt sich LDAP heute als Standard-Zugriffsmöglichkeit auf Verzeichnisdienste auch über das Internet bezeichnen. Die Eigenschaften von LDAP in Kombination mit X.500 sind im Folgenden zusammengefaßt und überschneiden sich natürlich mit den bereits erläuterten Eigenschaften von DAP: • LDAP setzt direkt auf TCP/IP auf, • LDAP regelt die Kommunikation zwischen Client und X.500-Verzeichnisdienst (z.B. Suchfunktion), • Daten sind als Entrys gespeichert, • jeder Entry hat einen eindeutigen Distinguished Name, • mit dem Distinguished Name ist der Entry im Verzeichnis eindeutig identifizierbar, • X.509-Zertifikatsinhaber und -aussteller haben zusammenhängende Distinguished Names, 27 Die Netware Directory Services wurden für die Verwaltung eines Verzeichnisses für eMail-Adressen in Novell-Netzwerken entworfen. Später entstand daraus eine dezentrale Datenbank für Benutzeraccounts, Zugriffsrechte etc. – 31 – 2 TRUSTCENTER FLEXITRUST • jeder Entry hat einen oder mehrere Attribute, • jedes Attribut hat einen oder mehrere Werte (ungeordnete Menge), • jeder Entry muß das Attribut objectClass besitzen, • objectClass definiert sozusagen den Entry, • Zertifikate sind über das Attribut userCertificate als Binärdaten zugänglich. Abbildung 7: Auszug aus dem LDAP-Tree am Fachbereich Informatik der TUD Abbildung 7 zeigt ein Beispiel für einen LDAP-Tree bzw. -DIT, wie er am Fachbereich 20 der TUD vorkommt. Ein Beispiel für einen hieraus abgeleiteten Distinguished Name ist: C=DE, O=TUD, OU=FB20, OU=cdc, CN=Vangelis Karatsiolis Man beachte, daß ein Entry selbstverständlich aus vielen Attributen und nicht nur aus dem Distinguished Name besteht. Ein Blatt-Entry, also ein Entry auf der CN-Ebene, könnte auch Attribute bzw. Felder mit spezifischeren Informationen zum Zertifikat bzw. zur CRL enthalten, z.B. eMail-Adresse“, Telefonnummer“, Gültigkeitszeitraum“ oder Issuer“. Denn wenn das ” ” ” ” Verzeichnis beispielsweise mit Attribute Extraction erstellt wurde, sucht LDAP in den EntryAttributen. In jedem Falle beinhaltet der Entry das Attribut userCertificate mit einem Wert bestehend aus Binärdaten, welche das Zertifikat des PKI-Benutzers darstellen. Dieses wiederum enthält ebenfalls den Distinguished Name, wie z.B. in Abbildung 5 zu sehen. Es ist überlegenswert, zusätzliche Daten wie Postadresse oder Telefonnummer in einen Verzeichnis-Entry einzufügen. Dies obliegt natürlich der jeweiligen Certification Authority. Allerdings ist es nicht praktikabel solche Daten in ein Zertifikat zu integrieren, in ein VerzeichnisEntry könnte man diese jedoch durchaus einbetten. – 32 – 2 TRUSTCENTER FLEXITRUST An dem konkreten Beispiel eines LDAP-Trees aus Abbildung 7 erkennt man das modellierte hierarchische Vertrauen, z.B. könnte eine TUD-Certification Authority den Fachbereich zertifizieren usw. Dennoch ist beispielsweise auch Cross-Zertifizierung 28 möglich, da die Verzeichnisstruktur bzw. der Verzeichnisdienst nur dafür sorgt, daß PKI-Teilnehmer schnell und eindeutig gefunden werden können und dies unabhängig von der Policy der jeweiligen PKI. Zu beachten ist, daß innerhalb der PKI der Verzeichnisdienst als unsicher bzw. als potentieller Angriffspunkt angesehen wird. Daher wird jede über ihn veröffentlichte Revokationsliste, also CRL von der zuständigen CA signiert, um die Gültigkeit und Korrektheit der Liste zu garantieren. Denn nur der CA wird vertraut – nicht etwa auch dem Verzeichnisdienst – und die veröffentlichten Zertifikate sind ohnehin von der CA ausgestellt sowie signiert. Der Vorgang des Findens eines richtigen und gesuchten Zertifikats ist unter PKI-Gesichtspunkten also nicht trivial. Denn es ist eher impraktikabel, etwa bei Attribute Extraction (siehe Abschnitt 2.7.4) jeden Verzeichnis-Entry zu signieren. D.h., beim Auffinden eines Zertifikats in einem Verzeichnis muß stets überprüft werden, ob es sich dabei auch um das gesuchte Zertifikat handelt29 . Leider hat jedoch LDAP das Problem, daß es grundsätzlich keine Zertifikat- bzw. CRLSuche unterstützt nach einem einfach Schema wie: Bitte das Zertifikat zu dem Teilnehmer mit ” der eMail-Adresse [email protected]“ o.ä. Und dies obwohl X.509v3-Zertifikate eine Komponente SubjectAltName enthalten, wo diese eMail-Adresse exakt vorkommen könnte. Das Problem rührt daher, daß keine Unterstützung in LDAP existiert, um die Attribute eines X.509v3-Zertifikats – und somit die darin enthaltenen Informationen – sozusagen als Attribute des Verzeichniseintrages sichtbar bzw. zugreifbar zu machen. 2.7.4 LDAP Lösungen In Folgenden werden Details zu LDAP, LDAP-Versionen sowie zu praktischen Problemen und Lösungen erläutert, die immer zum Ziel haben, die Verwaltung von und vor allem die Suche nach Zertifikaten mit LDAP zu realisieren. Die Probleme mit LDAP und PKI-Zertifikaten beruhen hauptsächlich darauf, daß obwohl X.509 und X.500 zur selben Familie von Standards gehören, grundlegende Probleme mit der Codierung von LDAP und X.509-Zertifikaten bestehen. Während Zertifikate ASN.1 codiert30 sind, werden bei LDAP einfache ASCII-Strings benutzt. Natürlich lassen sich diese Formate grundsätzlich in einander überführen. Dennoch stellten sich in der Praxis einige schwerwiegende Probleme mit solchen Verfahrensweisen heraus (siehe z.B. [Cha03-1] und [Cha03-2]). Die Probleme rührten u.a. daher, daß es an Unterstützung seitens vieler Firmen fehlte, einen gemeinsamen Standard zu entwickeln. So wies beispielsweise der Browser Netscape Communicator massive Fehler im Umgang mit Zertifikaten auf oder Microsoft unterstützte Bestrebungen der PKIX Working Group im RFC-Standardisierungsprozeß für die IETF nicht. Unabhängig von Standardisierungsprozessen und Modifikationen am LDAP-Protokoll selbst existieren Bemühungen, das OpenLDAP-Projekt (siehe [Ope04]) über LDAP hinaus so zu erweitern, daß die Suche nach X.509v3-Zertifikaten erleichtert wird. Die hierbei auf diese 28 Ein Beispiel für Cross-Zertifizierung wäre die gegenseitige Zertifizierung der TUD-CA und der CA der Universität von Hawaii. mögliche Attacke wäre, daß sich ein Angreifer Schreib-Zugriff auf das Verzeichnis verschafft und es ihm auf diese Weise gelingt, Entrys zu modifizieren. So ist es ihm zwar nicht möglich, Zertifikate zu fälschen, aber u.U. kann er z.B. sein Zertifikat in den Entry eines anderen PKI-Teilnehmers einfügen oder eine Zertifikatssuche auf seinen Verzeichnis-Entry umleiten, indem er falsche Werte in diesen einfügt. Für einen solchen Angriff müßte er natürlich selbst Teilnehmer der PKI sein und ein von der passenden CA ausgestelltes Zertifikat besitzen. 30 Mit Codierung ist in diesem Falle selbstverständlich nicht Verschlüsselung im kryptographischen Sinne gemeint, sondern schlicht das Format zur Datenübertragung. 29 Eine – 33 – 2 TRUSTCENTER FLEXITRUST Weise entstandenen Lösungsansätze wurden größtenteils auch in Standards gefaßt bzw. in den LDAP-Standard integriert. Es gibt also einige Lösungen, welche in verschiedenen Bereichen stattfinden (siehe u.a. [Cha03-1] und [Cha03-2]): Spezifizierung von Standards und Quasi-Standards sowie Implementierungsalternativen in OpenLDAP. Auf diese Weise existieren zwar verschiedene Lösungsmöglichkeiten, andererseits besteht dadurch das Problem, daß sich diese inklusive ihrer Nachteile auch durchsetzen und sich mindestens die wichtigen Hersteller von PKI- bzw. LDAP-Produkten auf bestimmte gemeinsame Lösungen einigen müssen, um Kompatibilitätsprobleme zu vermeiden. Das OpenLDAP-Projekt (siehe [Ope04]) bietet jedoch einen guten Ansatz für die Umsetzung von LDAP- bzw. X.500-Servern und bleibt auch weitestgehend kompatibel mit vorhandenen LDAP- bzw. PKI-Clients. Daher entschied die IETF 2003, daß zwei aktuelle Lösungen, welche sich in OpenLDAP etabliert haben, Standard-Lösungen sein sollen. Bei diesen gibt es vor allem große Unterschiede in der Art der Datenhaltung (siehe auch Abschnitt 4.1). Component Matching soll dabei der Standard-Weg überhaupt werden, um nach X.509v3Zertifikaten in einem Verzeichnis zu suchen. Denn dieser Ansatz ist sehr elegant, da keine gesonderte Datenpflege für das Verzeichnis nötig und eine Zertifikatssuche direkt auf den Zertifikatsattributen ausgeführt wird. Bis sich allerdings Component Matching in den Implementierungen von vorhandenen Servern und Clients durchgesetzt hat – wenn überhaupt, ist Attribute Extraction in Kombination mit dem X.509-attribute Parsing Server eine äußerst brauchbare, weil auch leicht umzusetzende Lösung, und für vorhandene Server und Clients werden damit keine Software-Updates nötig. Component Matching Beim Component Matching werden Zertifikate direkt in dem Verzeichnis-Entry oder in unterschiedlichen Verzeichnis-Entrys des jeweiligen Teilnehmers abgelegt. Die Suche nach Zertifikaten erfolgt dann direkt auf dessen ASN.1-codierten Feldern bzw. Komponenten, also auf dem Binärwert des LDAP-Verzeichnisses, welcher das Benutzer-Zertifikat darstellt. Hier ist zu überlegen, ob es sinnvoll ist, daß man nur nach Attributen im Zertifikat und nicht nach zusätzlichen Informationen, welche nicht im Zertifikat enthalten sind, suchen kann. Um dies zu realisieren, müßte man auf dem Zertifikat und dem Verzeichnis-Entry suchen können. Attribute Extraction Bei der Attribute Extraction werden die Attribute eines Zertifikats extrahiert, also aus dem Zertifikat ausgelesen und als zusätzliche Attribute in dem jeweiligen Verzeichnis-Entry abgelegt. Damit werden die Informationen aus den Attributen des Zertifikats für jeden LDAPClient lesbar, womit ebenfalls eine einfache LDAP-Suche und erfolgreiche Zertifikatsrückgabe möglich wird. Unterstützt wird dieser Vorgang vom X.509-attribute Parsing Server (XPS), der es möglich macht die Attributsextraktion und separate Speicherung automatisiert durchzuführen. Der Nachteil ist offensichtlich die notwendige Aufbereitung der Daten, also die zusätzlich nötige Datenpflege (Zertifikatsattribute und Entry-Attribute müssen übereinstimmen), wenngleich man durch den XPS dabei natürlich unterstützt wird. Ein weiterer möglicher Nachteil ist allerdings die notwendige doppelte Datenhaltung. Da es nicht möglich ist, über LDAP auf eine fremde relationale Datenbank (siehe Kapitel 3) zu – 34 – 2 TRUSTCENTER FLEXITRUST zugreifen, muß die Certification Authority die Daten bzw. Attribute und Attributswerte in ihrer eigentlichen Datenbank und somit in den Zertifikaten sowie zusätzlich im Verzeichnis, welches sie ebenfalls verwaltet, halten (siehe Abschnitt 4.1). Außerdem ist die LDAP-Suche u.U. beschränkt, da diese nur nach den extrahierten und in den Entrys eingefügten Attributen möglich ist. 2.7.5 Multiple Zertifikate Bei PKIs in der heutigen Zeit kommt es sehr oft vor, daß ein PKI-Teilnehmer mehrere Zertifikate besitzt. Die Gründe dafür sind verschieden, z.B.: • Aus Sicherheitsgründen benötigt ein Teilnehmer für Verschlüsselung und Signatur verschiedene Schlüsselpaare und somit Zertifikate. • Ein Teilnehmer ist in mehreren Organisationen tätig oder benutzt mehrere Applikationen. Es gibt nun verschiedene Möglichkeiten, wie man in einem PKI-Verzeichnis mit mehreren Zertifikaten pro Teilnehmer umgehen kann. Man beachte dabei, daß es immer noch einfach möglich sein soll, für eine bestimmte Kommunikation das passende Zertifikat innerhalb des Verzeichnisses zu finden. Die erste Idee ist natürlich, alle Zertifikate eines Teilnehmers in dessen LDAP-Entry abzulegen. Denn das Attribut userCertificate kann offensichtlich in Übereinstimmung mit dem LDAP-Standard mehrere Werte und somit Zertifikate enthalten. Das Problem hierbei ist, daß den Werten bzw. Zertifikaten keine Eigenschaften zugeordnet werden können, da sie nur als ungeordnete Menge angesehen werden. Damit sind sie für die Attribute Extraction nicht unterscheidbar. Eine weitverbreitete Lösungsmöglichkeit ist, den LDAP-Entry zu erweitern und zwar um das Attribut certificateType sowie in einem LDAP-Entry nur ein Zertifikat zu halten. Für den X.500-Baum bzw. das X.500-Verzeichnis gibt es dann drei mögliche Arten des Aufbaus. • Subeinträge: Ein PKI-Teilnehmer erhält ein Verzeichnis-Entry mit seinen Daten und die verschiedenen Zertifikate befinden sich in Untereinträgen. • Geschwistereinträge: PKI-Teilnehmer erhalten mehrere parallele Verzeichnis-Entrys, welche jeweils deren Daten und das jeweilige Zertifikat enthalten. • Applikationsbasierte Einträge: Der Verzeichnisbaum wird nach Anwendungen organisiert. Dabei erhält ein Teilnehmer ebenfalls mehrere Einträge je nach Anwendung. Auch existieren viele Lösungsansätze für verteilte Systeme, und LDAP macht es sogar möglich, mehrere PKIs bzw. PKI-Server mit einander zu verbinden. 2.7.6 Distinguished Names Die DNs haben, wie im vorherigen Abschnitt gesehen, ihren Ursprung beim Aufbau eines Verzeichnisdienstes. Bei TrustCentern kommt ihnen zusätzlich eine essentielle Aufgabe zu, nämlich die Verknüpfung von PKI-Zertifikaten und den Registrierungsdaten bzw. TeilnehmerIdentitäten zu gewährleisten. Daher finden Distinguished Names besondere Beachtung. Denn u.U. muß nicht nur die Gültigkeit einer digitalen Signatur über ein bestimmtes Dokument sondern auch der Urheber der Signatur gerichtlich nachweisbar sein. Daher ist die Eindeutigkeit der Suchkriterien und der Distinguished Names essentiell. Wünschenswerte Eigenschaften von guten Distinguished Names sind die Folgenden: – 35 – 2 TRUSTCENTER FLEXITRUST • Einzigartig bzw. einmalig, • registriert (z.B. Internet-Domains), • benutzerfreundlich31 . Man beachte, daß Distinguished Names innerhalb von PKIs mittlerweile eine etwas andere Bedeutung haben als bei reinen Verzeichnisdiensten. So kann es durchaus vorkommen, daß ein PKI-Teilnehmer mehrere Distinguished Names innerhalb dieser PKI besitzt. Die Einzigartigkeit bzw. Einmaligkeit eines Distinguished Names bedeutet hier jedoch die eindeutige Zugehörigkeit zu einem Registrierungsdatensatz bzw. einer Identität. Abbildung 8 zeigt ein übliches Beispiel für die Vergabe von Distinguished Names – in diesem Falle bei der Rechnerbetriebsgruppe (RBG) des Fachbereich 20 an der TUD. Ein Zertifikat mit Distinguished Names war bereits in Abbildung 5 zu sehen ebenso wie in Abbildung 7 ein LDAP-Verzeichnisbaum mit Distinguished Names. Name der Baumebene Bedeutung, engl. Beschreibung C Country DE O Organization TU Darmstadt OU Organizational Unit FB Informatik OU Organizational Unit Kürzel des Fachgebiets CN Common Name Titel, Vorname und Nachname Abbildung 8: Namensgebung der PKI am Fachbereich Informatik der TUD 2.8 Time Stamp Service Der TSS gewährleistet das Schutzziel der Datiertheit (siehe Abschnitt 1.1.1). Betroffen sind hier beliebige Dokumente, die von einem PKI-Teilnehmer an das TrustCenter gesendet werden können, welches wiederum das entsprechende Dokument signiert (siehe Abbildung 4) und dabei zusätzlich eine Zeitangabe, z.B. 25.08.2004 20:14:56, einfügt. Selbstverständlich läßt sich auch ein vom PKI-Teilnehmer signiertes Dokument mit einem solchen Zeitstempel versehen. Aufgrund der Verwendung der digitalen Signatur ist somit durch das TrustCenter als Vertrauensinstanz gewährleistet, daß zu einem bestimmten Zeitpunkt ein bestimmtes Dokument vorlag evt. mit auch vorhandener Verfasser-Signatur. 31 In der Benutzerfreundlichkeit bei DNs findet sich sicher auch die Nachvollziehbarkeit von TrustCenter-Vorgängen wieder. Ein lesbarer Name als Bestandteil in einem DN eines Zertifikats ist ein Beispiel für Benutzerfreundlichkeit im Gegensatz zu einem bestimmten Nummerncode, da mit einem Namen für einen anderen PKI-Teilnehmer eine gewisse Bedeutung verbunden ist. – 36 – 3 Einführung in Datenbanksysteme Dieses Kapitel dient als Einführung in das Gebiet der Datenbanksysteme (DBS) und kann es demnach nicht vollständig erfassen. Daher wird nur auf die für diese Arbeit notwendigen Aspekte eingegangen, angefangen bei elementaren Sachverhalten. 3.1 Grundlagen Datenbanksysteme Eine Datenbank ist folgendermaßen definiert als: Eine einheitlich beschriebene Darstellung ” eines Weltausschnittes mittels diskreter Daten auf externen und persistenten Speichermedien.“ Dies mag eine recht abstrakte Definition sein, sie trifft allerdings den Kern. Denn im wesentlichen geht es bei Datenbanksystemen um die Persistierung von Daten, d.h. um deren Dauerhaftigkeit. In einem einfachen Falle wird diese durch das Abspeichern in einer Datei auf der Festplatte, welche ein persistentes Speichermedium darstellt, gewährleistet. Im Falle von Datenbanksystemen sind die Daten jedoch zu komplex, als daß man diese auf simple Weise in Dateien speichern könnte. Daher erfolgt die Bearbeitung einer Datenbank nicht direkt sondern ausschließlich über das Datenbank Management-System (DBMS). Damit ist sichergestellt, daß mehrere Anwendungen bzw. Benutzer gleichzeitig auf eine Datenbank, also gemeinsame Datenbestände zugreifen und diese verändern können, ohne daß es zu Konflikten oder Kollisionen kommt. Datenbanken haben schließlich den Zweck für mehrere verschiedene Anwendungen und Benutzer auch bei verteilten Systemen, Daten und somit Informationen zur Verfügung zu stellen. Ein Datenbanksystem hat nach außen hin gesehen im Wesentlichen folgende Bestandteile: • Datenbank Management-System, • Query-Sprache (Daten-Zugriff, Daten- und Struktur-Bearbeitung), • Datenmodell (Repräsentation der Daten). 3.2 Datenbank Management-System (DBMS) In Abbildung 9 ist die Struktur eines DBMS zu sehen, hier nur aus Gründen der Vollständigkeit. Die Eigenschaften eines DBMS lassen sich folgendermaßen zusammenfassen: • Datenunabhängigkeit, • Effizienter Zugriff, • Mehrbenutzerbetrieb (Concurrency Control), • Persistenz der Daten, • Query-Sprache und Query-Optimierung (siehe Abschnitt 3.5), • Sicherheit bei bzw. vor Fehlern und Abstürzen (Recovery/Backup), • Umgang mit Transaktionen (siehe Abschnitt 3.3), • Verwaltung der Daten, • Verwendung von Konsistenzregeln (z.B. auch Redundanzvermeidung), • Zugriffskontrolle. – 37 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Abbildung 9: Struktur eines Datenbank Management-Systems Für viele Anwendungen und Systeme sind diese Eigenschaften nicht zu ersetzen. Ein einfaches Dateisystem beispielsweise kann die meisten dieser Merkmale nicht bereitstellen, wie etwa Datenunabhängigkeit. Natürlich hat die Verwendung von DBMSs auch Nachteile: • Allgemeine DBMSs weniger effizient als spezialisierte Software, • Optimierung nicht für alle konkurrierenden Anwendungen möglich, • Overhead an Funktionen (u.U. nicht benötigte Funktionen), • Personal mit speziellen Qualifikationen nötig. 3.2.1 Datenunabhängigkeit Wenn verschiedene Anwendungen auf dieselbe Datenbank zugreifen, möchte man, daß diese vollständig unabhängig von einander arbeiten können. Daher erhält jede eine individuelle Sicht auf diese Datenbank. Auch sollen die Anwendungen nicht davon beeinflußt werden, wenn sich – 38 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Strukturen an der bzw. um die Datenbank ändern. Jedes Datenbanksystem bietet dazu zwei Formen von Datenunabhängigkeit. • Physische Datenunabhängigkeit: Werden Zugriffswege und Speicherstrukturen der Datenbank modifiziert, sind Anwendungen davon unbeeinflußt. • Logische Datenunabhängigkeit: Wird die logische Struktur (siehe Abschnitt 3.4.1) der Datenbank modifiziert, sind auch davon Anwendungen unbeeinflußt. 3.3 Transaktionen Als Transaktionen bezeichnet man minimale Prozeßeinheiten eines Datenbanksystems und sie überführen dieses per Definition stets von einem konsistenten Zustand in einen anderen konsistenten Zustand. Das bedeutet, eine Transaktion kann sozusagen eine Datenbank nicht zerstören oder Daten ungültig machen und beeinflußt keine andere Transaktion. Folglich sieht“ ” eine Transaktion die Datenbank auch immer nur in einem konsistenten Zustand. Eine Transaktion selbst besteht aus einer Abfolge von elementaren Befehlen bzw. Operationen. Dabei sind Transaktionen sehr gut steuerbar, der Anfang einer Transaktion ist stets mit Begin Of Transaction (BOT) das Ende mit End Of Transaction (EOT) im System gekennzeichnet. Des weiteren werden Änderungen, die von Transaktionen an der Datenbank vorgenommen werden, erst nach dem abschließenden Commit sichtbar bzw. dauerhaft (persistent). Das Commit ist immer der letzte Befehl in einer Transaktion mit einer Ausnahme, dem Abort. Der Abbruch einer Transaktion kann viele Gründe haben, z.B. Konflikt mit einer anderen Transaktion, und ist bis zum Commit möglich. Datenbank Management-Systeme steuern und verwalten Transaktionen. Dabei gewährleisten sie, daß für jede Transaktion die ACID-Eigenschaften gelten. Dieses Akronym leitet sich aus dem Englischen ab und wird im Folgenden erläutert. • Atomarität: Eine Transaktion wird vollständig oder gar nicht ausgeführt. • Konsistenz: Transaktionen erzeugen keine inkonsistenten Datenbankzustände. • Isolation: Erst nach der Beendigung einer Transaktion wird dessen Änderung sichtbar. • Dauerhaftigkeit: Änderungen, die von Transaktionen vorgenommen werden, sind permanent. Bei teilweiser Umgehung des DBMS, also etwa beim direkten Zugriff auf die Datenbank selbst, sind offensichtlich diese Eigenschaften nicht gewährleistet. Der Vorteil bei Verwendung von Transaktionen ist zum einen aus den ACID-Eigenschaften ersichtlich. Zum anderen kann ein DBMS viele Eigenschaften aus Abschnitt 3.2 nur unter der Verwendung von Transaktionen gewährleisten, z.B. Concurrency Control oder Recovery. 3.3.1 Trigger und Coupling Modes Trigger sind eine bei gewissen Anwendungen äußerst wichtige Möglichkeit, um Transaktionen unter bestimmten Bedingungen auszulösen. Es ist z.B. bei Aktiven Datenbanken und Real-time Datenbanken32 möglich, auf vorgegebene Datenbank-Zustände zu reagieren. Dabei kann genau 32 Oftmals wird der Begriff der Echtzeit mit Effizienz bzw. hocheffizienten Rechensystemen gleichgesetzt. Dies ist jedoch falsch, wenngleich Echtzeit-Systeme meist hocheffizient arbeiten können müssen. Jedoch ist ein Echtzeit-System lediglich allgemein definiert als ein System, bei welchem die Korrektheit einer Berechnung nicht nur vom richtigen Ergebnis an sich abhängt sondern ebenfalls von der Rückgabe des Ergebnisses in einer vorgegebenen Zeit bzw. Deadline. Eine Überschreitung dieser Deadline kann ne- – 39 – 3 EINFÜHRUNG IN DATENBANKSYSTEME festgelegt werden, wie und wann diese Reaktion, also das Auslösen einer Transaktion erfolgen soll. Durch Coupling Modes wiederum läßt sich festlegen, auf welche Weise Transaktionen zueinander ausgeführt werden sollen, z.B. nacheinander oder parallel, aber auch Forderungen wie gleichzeitige Beendigung o.ä. sind möglich. Für weitere Details auch zu den Themen Aktive Datenbanken und Real-time Datenbanken sei auf das Literaturverzeichnis (ab Seite 119) verwiesen. 3.3.2 Concurrency Control Das Concurrency Control hat im DBMS eine essentielle Aufgabe und untersteht dem Scheduler (siehe Abbildung 9). Dieser übernimmt die Planung sowie Optimierung des Ablaufs von anstehenden Transaktionen und sorgt vor allem für eine fehlerlose Ausführung. Dabei werden Transaktionen oder Teile von Transaktionen häufig parallel ausgeführt – je nach Correctness Criteria, wonach sich eine gültige Abfolge dieser richtet. Um Konflikte bei der Transaktionsausführung zu vermeiden, zu erkennen sowie aufzulösen, ist die Verwaltung, also Sperrung sowie Zuteilung von Systemressourcen, z.B. Datenbank- oder Speicherbereichen, unumgänglich und ebenfalls Aufgabe des Schedulers. Zu den Themen Concurrency Control und Correctness Criteria existieren reichlich Theorien und Abhandlungen, da diese Themen äußerst komplex sind. Für weitere Details sei auf das Literaturverzeichnis (ab Seite 119) verwiesen. 3.3.3 Recovery und Backup Der Recovery Manager (siehe Abbildung 9) sorgt dafür, daß eine Datenbank immer in einem konsistenten Zustand bleibt, auch bei schweren Fehlern wie z.B. einem Systemabsturz. Dazu muß der Recovery Manager u.a. Logs führen, also Protokolldaten über jegliche Transaktionen festhalten, z.B. über die vorgenommenen Änderungen. Damit ist es möglich, Transaktionen rückgängig zu machen, welche abgebrochen wurden oder Transaktionen erneut auszuführen bzw. abzuschließen. Bei Main Memory-Datenbanksystemen, also bei hocheffizienten Datenbanksystemen, welche auf speziellen Rechnern laufen und sich vollständig im Hauptspeicher befinden, läßt sich der Recovery Manager mit seinen Aufgaben als Bottleneck, also als stark ineffizienter Systemteil bezeichnen. Denn auch oder gerade bei Main Memory-Datenbanken muß deren Konsistenz sichergestellt sein, was natürlich nur durch das zusätzliche Absichern der Protokolldaten und auch der Datenbank auf einen Festspeicher möglich ist. Wie beim Concurrency Control existieren zum Thema Recovery reichlich Theorien und Abhandlungen. Für weitere Details sei auf das Literaturverzeichnis (ab Seite 119) verwiesen. 3.4 Datenmodelle Der Sinn und Zweck von Datenbanken ist es, Informationen (dauerhaft) zu speichern und einen einfachen Zugriff auf diese zu gewährleisten. Nun ist der Begriff der Information nicht weniger abstrakt als der Begriff der Daten, dennoch müssen Informationen oftmals auf eine Datenbank abgebildet werden. Um Informationen in einer Datenbank sinnvoll aufzubewahren, müssen zunächst die zu speichernden Daten ausgewählt werden. Grob ausgedrückt müssen die für eine Datenbank gative (Soft Real-time) oder verheerende (Hard Real-time) Folgen haben. Ein Echtzeit-System garantiert also die Ausführungszeit bzw. Deadline für einen einzelnen Prozeß. Dem hingegen bietet ein hocheffizientes Rechensystem eine schnelle durchschnittliche Ausführungszeit. – 40 – 3 EINFÜHRUNG IN DATENBANKSYSTEME geeigneten Daten in tabellarischer Form darstellbar sein. Es macht z.B. wenig Sinn, einen Brief in einer Datenbank zu speichern. Hingegen kann die Indexierung vieler Briefe auch von einer Datenbank übernommen werden. Man beachte, daß z.B. auch Daten von Straßenkarten oder ähnlich große Datenmengen in Datenbanken abgelegt werden können. Daten sind also die essentiellen Teile einer Information und um sie in einer Datenbank entsprechend abbilden zu können, benutzt man ein passendes Datenmodell. Zusammenhängende Daten werden als Datensatz oder auch Tupel bezeichnet. 3.4.1 Grundlagen von Datenmodellen Ein Datenmodell entsteht allgemein aus drei Bestandteilen: • Logische Struktur(en), • Operatoren, • Korrektheitsbedingungen. Die logischen Strukturen fügen den Daten eine gewisse Semantik hinzu, wobei es sich hierbei um eine statische Eigenschaft des Datenmodells handelt (als Beispiel siehe Abbildung 10). Hingegen handelt es sich bei den Operatoren um sog. dynamische Eigenschaften, da sie Änderungen an den Daten ermöglichen. Korrektheitsbedingungen oder Constraints sorgen für syntaktische sowie semantische Korrektheit der Operatoren und somit der Daten. Mit Hilfe von Korrektheitsbedingungen wird es dem DBMS also möglich, Daten auf z.B. erlaubte Wertebereiche zu prüfen. Für die Erstellung von Strukturen bzw. Strukturmanipulation wird eine Data Definition Language (DDL) verwendet. Die Datenmanipulation, also das Ausführen von Operatoren erfolgt über eine Data Manipulation Language (DML). Zugriffe auf, also das Abfragen von Daten erfolgt über eine Query Language (QL) bzw. eine Query.33 Die gängigste Sprache, welche auch DDL, DML und QL in sich vereint, ist SQL (siehe Abschnitt 3.5). Einnahmen EUR Ausgaben EUR Jahr 300000 400000 2001 280000 300000 2002 310000 300000 2003 ohne Struktur 300000 400000 2001 280000 300000 2002 310000 300000 2003 mit Struktur Abbildung 10: Daten ohne und mit Struktur 3.4.2 Objekte und Konstruktoren Der Begriff der Objekte ist vor allem bekannt aus der objektorientierten Programmierung. Ebenso existiert bei Datenbanksystemen der Begriff des Objekts bzw. der Objektinstanz. Dabei handelt es sich um einen einzelnen konkreten Datensatz, der aber auch verteilt sein kann. Datensätze selbst bestehen aus Merkmalen bzw. Feldern bzw. Attributen. Ein Objekttyp oder auch Klasse ist daher allgemein eine definierte Menge von Attributen. 33 Bei Query handelt es sich um einen üblichen Begriff. Eine mögliche deutsche Entsprechung ist Abfrage, welche auch z.B. von Microsoft bei deutschen Softwareversionen, etwa von Microsoft Access, genutzt wird. – 41 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Ein Beispiel für einen Objekttyp wäre Filme(Titel,Regisseur,Komponist)“, für ein Ob” jekt hierfür ’Forrest Gump’;’Robert Zemeckis’;’Alan Silvestri’“ und wiederum für ein Attribut ” hierfür Komponist“, wobei Alan Silvestri“ einen Attributswert darstellt. ” ” Ähnlich wie bei der objektorientierten Programmierung erstellt man auch bei Datenmodellen komplexe Objekttypen aus weniger komplexen. Dabei werden Attributen zunächst elementare Datentypen zugewiesen, z.B. INTEGER oder CHARACTER. Komplexere Objekttypen werden durch die Konstruktoren Aggregation und Assoziation gebildet. Aggregationen erfolgen durch die Gruppierung von verschiedenen Attributen oder bereits erstellter Objekttypen, z.B. Name(CHARACTER)“ sowie Vorname(CHARACTER)“ zu Kompo” ” ” nist(Name,Vorname)“ usw. wiederum zu Filme(Titel,Regisseur,Komponist)“. Assoziationen ” hingegen sind Mengenaggregationen, werden also aus mehreren gleichartigen Objekten zusammengesetzt, z.B. Kameramann(Name,Vorname)“ zu Film Kamerateam(Kameramann)“. ” ” Es gibt auch Typen bzw. Attribute, die aus vorhandenen abgeleitet und nicht explizit abgespeichert werden. So wird z.B. das Alter einer Person meist in einer Personendatenbank nicht gespeichert sondern nur das entsprechende Geburtsdatum. Das aktuelle Alter errechnet sich dann offensichtlich erst aus der Differenz zwischen aktuellem Datum und Geburtsdatum. Weitere gängige Begriffe, die gerne an Stelle von Objekt und Objekttyp verwendet werden, sind Entity und Entity-Typ, meinen aber dasselbe. Ein Objekttyp läßt sich allerdings auch schlicht als Tabelle bezeichnen bzw. ansehen. 3.4.3 Beziehungen Beziehungen sind ein zentraler Aspekt eines jeden Datenmodells. Selten ist es sinnvoll, alle Daten einer Datenbank in einer Tabelle zu speichern. In Abbildung 11 ist eine Tabelle zu sehen, welche bei einer größeren Anzahl an Datensätzen bzw. Zeilen sowie Attributen bzw. Spalten verschiedene Nachteile durch Redundanz hat, wie Speicherverschwendung und schwierige Datenpflege (z.B. bei Datenänderungen). Daher ist es sinnvoll, die Tabelle T CDCollection“ in diesem Falle aufzubrechen bzw. ” aufzuteilen und zwar in zwei Tabellen T Album(*AlbumID,Artist,Album,Label,Year,Genre)“ ” sowie T Song(AlbumID,Song,Time,No)“. ” T CDCollection Song Artist Time Album No Label Year Genre Theme from Goldfinger Cincin.Pops 02:32 Bond And Beyond 1 Telarc 1991 Orch. James Bond Theme Cincin.Pops 02:20 Bond And Beyond 2 Telarc 1991 Orch. From Russia With Love Cincin.Pops 02:40 Bond And Beyond 3 Telarc 1991 Orch. So excited B.B.King 05:12 Completely Well 1 MCA 1982 Blues No good B.B.King 04:58 Completely Well 2 MCA 1982 Blues You’re losin’ me B.B.King 03:33 Completely Well 3 MCA 1982 Blues Abbildung 11: Nicht-verteilte Tabelle Zwischen den beiden neuen Tabellen besteht nun eine Beziehung durch das neu eingeführte Attribut AlbumID“, welches den Primärschlüssel (siehe Abschnitt 3.4.5) in der Relation ” T Album“ darstellt und ebenso für T Song“ als Verweis auf bzw. Verknüpfung zu T Album“ ” ” ” dient, wobei hier offensichtlich auch die Umkehrung gilt. Auf diese Weise läßt sich ebenfalls die alte Tabelle T CDCollection“ wiederherstellen (siehe auch Abschnitt 3.5.1). ” – 42 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Bei einem solchen Vorgang des Aufteilens ist stets zu beachten, daß dabei Information verloren geht, die im Beispiel durch die Einführung des neuen Attributs AlbumID“ kompen” siert wurde. Derartige Neueinführungen sind nicht zwangsläufig, dennoch oftmals nötig. Des weiteren existieren sogenannte Normalformen, die solche Aufteilungen in bestimmte Kategorien einordnen und klassifizieren. Für weitere Details zu Normalformen sei allerdings auf das Literaturverzeichnis (ab Seite 119) verwiesen. 3.4.4 Relationale Datenbanken Ein sehr einfaches, weil graphisches Datenmodell ist das Entity-Relationship Modell (ERM). In Abbildung 12 ist ein konkretes, aber vereinfachtes Beispiel für ein ERM-Datenmodell einer Banken-Datenbank zu sehen. Im Vergleich zum Beispiel aus Abbildung 11 (siehe auch Abschnitt 3.4.3) ist hier eine sinnvolle Verteilung der Daten über mehrere Entitys vorhanden. Die Elemente dieses Datenmodells haben die folgende Bedeutung: • Rechtecke sind Objekttypen, • Quadrate sind Beziehungen bzw. Relationships, • Ellipsen sind Attribute ( *“ kennzeichnet Primärschlüssel; siehe Abschnitt 3.4.5). ” Nun ist das ERM sehr praktikabel, um Daten und ihre Beziehungen graphisch zu modellieren, jedoch nicht, um ein solches Modell konkret umzusetzen. Das gängigste und üblichste Modell für praktische Umsetzungen ist das relationale Datenmodell. Relationen und ihre Beziehungen bilden den Kern dieses Modells, wobei Relationen schlicht als Tabellen angesehen werden können und jegliche Modellierung innerhalb dieser vollzogen wird. Die Tabellenköpfe stellen dabei die logische Struktur dar, wie schon gesehen bei z.B. Filme(Titel,Regisseur,Komponist)“ oder T Song(AlbumID,Song,Time,No)“. ” ” Das Relationenmodell ist einerseits sehr geeignet für praktische Umsetzungen, bietet andererseits einen mathematischen Formalismus an: Die Relationenalgebra. Diese soll hier jedoch nur kurz erläutert werden (Details siehe u.a. [Ram00], [Heu00], [Hae99], [Dat03]). Die fünf Basisfunktionen der Relationenalgebra sind Vereinigung, Differenz, Kartesisches Produkt, Projektion und Selektion. Diese reichen aus, um auch die folgenden Funktionen abzuleiten: Joins, Schnitt und Quotient. Joins (siehe Abschnitt 3.5.1) sind äußerst wichtige Funktionen, weil mit ihrer Hilfe oftmals erst Beziehungen von Relationen bzw. Tabellen und die dahinterstehenden Informationen effizient zusammengesetzt werden können. Die beiden folgenden Beispiele besitzen keine logische Struktur, sollen jedoch nur die Ausführung zweier Funktionen der Relationenalgebra verdeutlichen. Abbildung 13 zeigt ein Beispiel für die Vereinigung von Relationen. Die minimale Voraussetzung hierbei ist allerdings, daß die Basisrelationen gleichen Grad, d.h. dieselbe Anzahl an Attributen, besitzen. Eine weitere, vor allem praktische Voraussetzung ist die Verwendung von kompatiblen (Daten-)Typen. Ein Beispiel für ein kartesisches Produkt findet sich in Abbildung 14. Dieses stellt auch eine mögliche alternative Realisierung von Joins dar, u.U. allerdings nicht effizient. 3.4.5 Schlüssel U.a. zum Verknüpfen von Datensätzen einzelner Relationen ist es wichtig, diese Datensätze eindeutig identifizieren und referenzieren zu können, wozu Schlüssel34 benutzt werden. 34 Um jegliche Irritationen zu vermeiden, sei hier darauf hingewiesen, daß Schlüssel bei Datenbanken und Schlüssel in der Kryptographie nicht viel gemeinsam haben. Es wird lediglich der gleiche Begriff verwendet. – 43 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Abbildung 12: ERM-Beispiel Es existieren fünf Typen von Schlüsseln, die im Folgenden näher beschrieben werden. • Super-Schlüssel: Jede Menge von Attributen einer Relation, welche die Datensätze dieser Relation eindeutig identifiziert. Dies gilt z.B. bei jeder Relation für die Menge aller Attribute. • Schlüssel: Ein Super-Schlüssel welcher minimal ist. D.h., keine echte Teilmenge eines Schlüssels ist auch ein Schlüssel. • Schlüsselkandidaten: Alle Schlüssel einer Relation. • Primärschlüssel (Primary Key): Ein beliebiger, jedoch ausgewählter und festgelegter Super-Schlüssel. Hier wird oftmals auch der kleinste Schlüsselkandidat verwendet. • Fremdschlüssel (Foreign Key): Eine Menge von Attributen, welche in einer anderen Relation Super-Schlüssel ist, z.B. der Primärschlüssel. Bindet man einen Fremdschlüssel in eine Relation ein, wird damit meist ein Verweis auf eine andere Relation vollzogen, und somit die Beziehung der zwei oder mehr Relationen modelliert. Dabei ist zu beachten, daß ein Fremdschlüssel nicht die Datensätze der eigenen Relation eindeutig identifiziert, er dient lediglich als Verweis. – 44 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Relation A Buttermilch Apfel Fisch Relation A∪B Cidre Fisch Buttermilch Buttermilch Apfel Fisch Ei Dosenmilch Gummiadler Cidre Fisch Buttermilch Ei Dosenmilch Gummiadler Fisch Apfel Cidre Dosenmilch Buttermilch Relation B Fisch Apfel Fisch Cidre Dosenmilch Buttermilch Fisch vereinigte Relationen einzelne Relationen Abbildung 13: Beispiel für eine Vereinigung in der Relationenalgebra Man spricht von referentieller Integrität, wenn sichergestellt ist, daß zu jedem Fremdschlüssel auch ein Datensatz in der referenzierten Relation existiert. Die Attribute von Relationen kann man in folgende Kategorien einteilen: • Schlüsselattribut (im Primärschlüssel enthalten), • Hauptattribut (in Schlüsselkandidaten enthalten), • Nichtschlüsselattribut (nicht im Primärschlüssel enthalten), • Nebenattribut (in keinem Schlüsselkandidaten enthalten). Es fällt natürlich auf, daß bei Relationen, welche nur einen Schlüsselkandidaten besitzen, Schlüsselattribut und Hauptattribut sowie Nichtschlüsselattribut und Nebenattribut identisch sind. 3.5 Script Query Language (SQL) SQL ist die gängigste Sprache, welche Datenzugriffe, Datenmanipulation, Strukturmanipulation und somit auch praktische Ausführung der Relationenalgebra in sich vereint. Mit SQL ist es also möglich, die Datenbank einzusehen, Daten zu bearbeiten und logische Strukturen zu verändern – alles mittels Queries. Des weiteren bieten solche Query-Sprachen wie SQL Applikationen und Benutzern die Möglichkeit, Zugriffe auf eine Datenbank zu filtern. Denn nicht immer möchte man für eine spezielle Aufgabe auf das gesamte Datenvolumen zugreifen. Es existieren natürlich auch andere Sprachen, die derartige Möglichkeiten bieten. Im Folgenden werden Query-Aktionen aber anhand von SQL erläutert und die SQL-Syntax wird anhand von Beispielen eingeführt. Queries sind dabei vergleichsweise kurze Code-Abschnitte. Queries werden natürlich auf Relationen angewendet, wobei für alle gültigen Queries die Abgeschlossenheit gilt. Das bedeutet, das Resultat einer Query ist erneut und stets wieder eine Relation. Auch sind mehrere Queries unter bestimmten Voraussetzungen miteinander kombinierbar. Dabei ist zu beachten, daß Queries mit SQL einfach formuliert werden können, deren Ausführung aber meist nicht auf effiziente Weise geschehen würde. In einem DBMS erfolgt deswegen eine automatische Optimierung (siehe u.a. Abbildung 9) der jeweiligen Query nach speziellen Regeln, woraus schließlich eine sehr effiziente Query resultiert. – 45 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Relation A Buttermilch Apfel Fisch Cidre Fisch Buttermilch Ei Dosenmilch Gummiadler Relation B Fisch Apfel Cidre Dosenmilch einzelne Relationen Relation A×B Buttermilch Apfel Fisch Fisch Apfel Buttermilch Apfel Fisch Cidre Dosenmilch Cidre Fisch Buttermilch Fisch Apfel Cidre Fisch Buttermilch Cidre Dosenmilch Ei Dosenmilch Gummiadler Fisch Apfel Ei Dosenmilch Gummiadler Cidre Dosenmilch Kartesisches Produkt der beiden Relationen Abbildung 14: Beispiel für ein Kartesisches Produkt in der Relationenalgebra 3.5.1 Datenzugriff und Datenmanipulation Das erste SQL-Beispiel ist eine einfache Auswahl bzw. Selektion und typisch für SQL auch weitestgehend selbsterklärend. Die Basis für diesen SQL-Code ist die Relation aus Abbildung 15 ( T CosbyShow-Episodes“), wobei auch hier das Sternsymbol ( *“) den Primärschlüssel ” ” kennzeichnet. SELECT FROM WHERE ORDER BY T_CosbyShow-Episodes.EpName T_CosbyShow-Episodes T_CosbyShow-Episodes.Year=1984 T_CosbyShow-Episodes.EpNo; Auch das Ergebnis der Query ist in Abbildung 15 zu sehen. ORDER BY legt dabei fest, nach welchen Attributen die Ausgabe – falls gewünscht – aufsteigend oder absteigend sortiert werden soll. Hier erfolgt die Sortierung nach dem Attribut EpNo“, obwohl es für die Ausgabe gar ” nicht ausgewählt wurde. Die wichtigsten SQL-Anweisungen sind Joins. Sie dienen dem Darstellen von Relationsbeziehungen, indem sie z.B. zur Ansicht eine Gesamtrelation auf Basis der Beziehungen bzw. Verknüpfungen erzeugen, wobei die Verknüpfungen nicht auf Schlüsseln basieren müssen. Dabei existieren verschiedene Arten von Joins, je nach Anforderung an die Darstellung der Daten. • Inner-Join bzw. Equi-Join bzw. Natural-Inner-Join: In die Gesamtrelation werden ausschließlich Datensätze der Einzel- oder Ursprungsrelationen aufgenommen, bei welchen gleiche Werte in verknüpften Attributen vorliegen. • Left/Right-Outer-Join: Die Gesamtrelation besteht aus allen Datensätzen einer der verknüpften Relationen. Datensätze der anderen Relation kommen nur vor bei gleichen Werten in verknüpften Attributen. – 46 – 3 EINFÜHRUNG IN DATENBANKSYSTEME T CosbyShow-Episodes *EpNo EpName Year EpName 11 Bon Jour Sondra 1984 Bon Jour Sondra 13 Rudy’s Sick 1984 Rudy’s Sick 19 Clair’s Case 1984 Clair’s Case 23 Mr. Quiet 1984 Mr. Quiet 37 Vanessa’s Bad Grade 1985 Ergebnis-Relation der SQL-Query (siehe Abschnitt 3.5.1) 41 Play It Again, Russell 1985 Ursprungsrelation Abbildung 15: Einfache Selektion mit SQL • Natural-Full-Outer-Join: In der Gesamtrelation kommen alle Datensätze der Ursprungsrelationen vor, aber nur bei gleichen Werten in verknüpften Attributen werden die Datensätze auch kombiniert. • Cross-Join: Bildung des vollständigen kartesischen Produkts zweier Relationen. • Union-Join: Die Gesamtrelation besteht aus allen Attributen der Relationen A und B, stellt aber lediglich ein Untereinanderfügen von A und B dar. Das folgende Beispiel zeigt einen einfachen Inner-Join, definiert als SQL-Query. Das Beispiel bezieht sich auf die Relationen aus Abbildung 16, wo auch das Ergebnis der Query zu finden ist. Für den Join wird das Attribut EpNo“ ausgenutzt, welches der Primärschlüssel von ” T CSEpisodes“ und der Fremdschlüssel in T CSStaff“ ist. ” ” SELECT T_CSEpisodes.EpName, T_CSEpisodes.Year FROM T_CSEpisodes INNER JOIN T_CSStaff ON T_CSEpisodes.EpNo=T_CSStaff.EpNo WHERE (T_CSStaff.Name=’Malcom-Jamal Warner’) AND (T_CSStaff.Function=’Director’); Für dieses Beispiel – sonst eher selten – existiert eine weitere, aber je nach Optimierung u.U. ineffiziente Variante, welche ohne spezielle Join-Anweisung auskommt. Dies geschieht einfach durch Ausnutzung des kartesischen Produkts, welches hier mit Hilfe der WHERE-Klausel einem Inner-Join entspricht und wie folgt in SQL einfach gebildet werden kann: SELECT T_CSEpisodes.EpName, T_CSEpisodes.Year FROM T_CSEpisodes, T_CSStaff WHERE (T_CSEpisodes.EpNo=T_CSStaff.EpNo) AND (T_CSStaff.Function=’Director’) AND (T_CSStaff.Name=’Malcom-Jamal Warner’); Des weiteren existieren Query-Typen, die direkt oder indirekt die Funktionen der Relationenalgebra realisieren, wie z.B. eine Vereinigung-Query. – 47 – 3 EINFÜHRUNG IN DATENBANKSYSTEME T CSStaff EpNo Name Function T CSEpisodes 11 Malcom-Jamal Warner Actor 11 Bill Cosby *EpNo EpName Actor Year 11 Bon Jour Sondra 1984 13 Malcom-Jamal Warner Actor 13 Rudy’s Sick 1984 13 Bill Cosby 19 Clair’s Case 1984 19 Malcom-Jamal Warner Director 23 Mr. Quiet 1984 19 Lisa Bonet Actor 37 Vanessa’s Bad Grade 1985 19 Bill Cosby Actor 41 Play It Again, Russell 1985 Actor 23 Malcom-Jamal Warner Actor 23 Bill Cosby Ursprungsrelation 2 Actor 37 Malcom-Jamal Warner Actor EpName 37 Bill Cosby Play It Again, Russell 1985 Actor 41 Malcom-Jamal Warner Actor Clair’s Case Year 1984 41 Malcom-Jamal Warner Director 41 Bill Cosby Ergebnis-Relation der SQL-Query (siehe Abschnitt 3.5.1) Actor Ursprungsrelation 1 Abbildung 16: Join mit SQL Aggregierung SQL ermöglicht es, erweiterte Informationen aus Datenmengen zu gewinnen bzw. Datenmengen ein wenig weiterzuverarbeiten und stellt dazu verschiedene Zusatzfunktionen (Aggregierungen), bei welchen die WHERE-Klausel allerdings nicht mehr erlaubt ist, bereit, wie z.B.: • GROUP BY (Gruppieren gleicher Datensätze), • COUNT (Zählen aller Zeilen einer Query), • SUM (Aufsummieren von Attributwerten), • AVG (Durchschnittbildung von Attributwerten), • MAX (Bestimmung des größten Attributwerts), • MIN (Bestimmung des kleinsten Attributwerts). Folgendes SQL-Beispiel bezieht sich auf die Relation T CSStaff“ aus Abbildung 16. Das ” Resultat der Query beinhaltet nur die beiden Datensätze Malcom-Jamal Warner;Actor“ und ” Malcom-Jamal Warner;Director“, was aufgrund des Tabelleninhalts nicht selbstverständlich ” und auf die GROUP BY-Anweisung zurückzuführen ist: SELECT FROM GROUP BY HAVING T_CSStaff.Name, T_CSStaff.Function T_CSStaff T_CSStaff.Name, T_CSStaff.Function T_CSStaff.Name=’Malcom-Jamal Warner’; In diesem speziellen Falle kann dasselbe Ergebnis auch ohne Aggregierung erreicht werden, da die Option DISTINCT in SQL stets Duplikate in einer Query-Ausgabe eliminiert: – 48 – 3 EINFÜHRUNG IN DATENBANKSYSTEME SELECT DISTINCT T_CSStaff.Name, T_CSStaff.Function FROM T_CSStaff WHERE T_CSStaff.Name=’Malcom-Jamal Warner’; Die Datensätze (Name;Function;Number) Malcom-Jamal Warner;Actor;5“ und Malcom” ” Jamal Warner;Director;2“ ergeben sich aus folgendem Beispiel, bei welchem zum Vorschein kommt, was die GROUP BY-Anweisung bewirkt, nämlich gleiche Datensätze ohne Eliminierung zusammenzufassen. Nur daher kann z.B. COUNT zusätzlich noch deren Anzahl bestimmen: SELECT T_CSStaff.Name, T_CSStaff.Function, Count(T_CSStaff.Name) AS Number FROM T_CSStaff GROUP BY T_CSStaff.Name, T_CSStaff.Function HAVING T_CSStaff.Name=’Malcom-Jamal Warner’; Dateneingabe Operatoren zur Dateneingabe und Datenänderung sind in SQL ebenfalls realisiert, es handelt sich dabei um: DELETE, INSERT und UPDATE. Das folgende Beispiel zeigt das Einfügen eines Datensatzes in die Beispiel-Relation T CSStaff“ aus Abbildung 16: ” INSERT INTO T_CSStaff Values(13,’Bill Cosby’,’Actor’); DELETE und UPDATE erlauben in Queries auch die Angabe von WHERE-Bedingungen, was u.a. gerade bei großen Datenmengen sehr wichtig ist. 3.5.2 Strukturmanipulation Für die Strukturmanipulation stellt SQL ebenfalls Anweisungen zur Verfügung, wobei sich hierfür die Syntax der Queries ändert. Es existieren u.a. folgende Anweisungen: • CREATE TABLE (Erstellen von Tabellen), • DROP TABLE (Löschen von Tabellendefinitionen), • ALTER TABLE (Ändern von Tabellenstrukturen), • CREATE INDEX (Erstellen von Indizes, also effizienten Zugriffsstrukturen), • DROP INDEX (Löschen von Indizes). Das folgende ausführlichere Beispiel zeigt die Erstellung von etwas größeren logischen Strukturen inklusive Korrektheitsbedingungen: CREATE TABLE T_Shows( ID INTEGER NOT NULL, ShowName CHARACTER(80) NOT NULL, FromYear DATE, ToYear DATE, CONSTRAINT MyConstraint1 UNIQUE(ShowName), CONSTRAINT MyConstraint2 PRIMARY KEY(ID)); – 49 – 3 EINFÜHRUNG IN DATENBANKSYSTEME CREATE TABLE T_Episodes( ShowID INTEGER NOT NULL, EpNo INTEGER NOT NULL, EpName CHARACTER(60) NOT NULL, AirDate DATE, ProdNo INTEGER NOT NULL, Season TINYINT, CONSTRAINT MyConstraint3 PRIMARY KEY(ShowID, EpNo)); CREATE TABLE T_Staff( ShowID INTEGER NOT NULL, EpNo INTEGER NOT NULL, LastName CHARACTER(20) NOT NULL, FirstName CHARACTER(20), Function CHARACTER(20)); Es werden also drei Tabellen erstellt, die miteinander in Beziehung stehen und zusammen eine Datenbank für TV-Serien darstellen. Dabei sind hier drei Arten zu sehen, mit denen es möglich ist, Korrektheitsbedingungen zu definieren. Zunächst werden Werteingaben in Attribute vom Datentyp beschränkt, also z.B. nur Ganzzahlen oder Zeichenketten bestimmter Länge. NOT NULL bei Attributen sorgt dafür, daß für jeden Datensatz ein entsprechender Attributwert existiert bzw. eingegeben wird. Und schließlich gibt es die Möglichkeit separat vielfältige CONSTRAINTs zu definieren. UNIQUE legt beispielsweise fest, daß keine doppelten Werte in ein Attribut oder mehrere Attribute eingefügt werden können. Aber auch das Festlegen von z.B. gültigen Eingabebereichen ist möglich. Des weiteren ist durch die CONSTRAINT-Anweisung die Festlegung von Schlüsseln möglich. Im Beispiel entsteht etwa der Primärschlüssel, welcher stets zwingend und automatisch UNIQUE ist, von T Episodes“ aus zwei Attributen. ShowID“ ist als Fremdschlüssel Teil des Primär” ” schlüssels, würde hier jedoch alleine nicht zum Primärschlüssel ausreichen. Auch wäre es hier möglich Fremdschlüssel in einer Tabelle bzw. Relation explizit anzugeben. Für weitere Details zu SQL sei hier nun auf das Literaturverzeichnis (ab Seite 119) verwiesen, beispielsweise auf [Mic00], [Inf98] oder auf jede andere gängige SQL-Dokumentation. 3.6 Applikationsentwicklung Bei der Entwicklung von Applikationen, die Datenbanken nutzen – als Back-End, wird sehr oft SQL verwendet, wenngleich in der entstehenden Endanwendung davon nichts zu sehen sein muß, z.B. bei Benutzereingaben. SQL-Anweisungen lassen sich in gängiger Entwicklungssoftware einfach in den Programmcode einbetten. Eine Methode zum Durchlaufen und Abfragen von einzelnen Datensätzen, also Navigieren durch Datenmengen innerhalb eines Programmcodes ist der Einsatz von Cursorn, womit innerhalb der Applikation der Zugriff auf einen individuellen Datensatz einer Tabelle oder SQL-Query und somit dessen Weiterverarbeitung möglich wird. Auch stellen verschiedene Hersteller von Entwicklungsumgebungen solche Zugriffsmöglichkeiten durch eigene Techniken zur Verfügung, wie z.B. das ResultSet bei Suns Java-Systemen (siehe [Sun04-1]) oder die ActiveX Data Objects (ADO) von Microsoft (siehe [Mic00]). Durch Cursor o.ä. erhält jede Applikation ihre eigene individuelle Sicht auf eine Datenbank. – 50 – 3 EINFÜHRUNG IN DATENBANKSYSTEME Da verschiedene Datenbanken und Datenbanksysteme existieren, und es dennoch möglich sein soll auf verschiedene Datenbanken zugreifen zu können, nutzt man meist die Open Database Connectivity (ODBC). ODBC stellt über einen jeweiligen individuellen Datenbank-Treiber eine Verbindung zwischen einer Applikation und einer Datenbank her, worauf alle gängigen Entwicklungsumgebungen zurückgreifen, z.B. Borland Delphi oder Microsoft Visual Studio. Mittels Suns JDBC wird es auch möglich, SQL sowie ODBC bzw. an ODBC angelehnte Systeme und somit die meisten Datenbanksysteme innerhalb von Suns Java-Systemen mit allen Vorteilen zu nutzen. Beim Zugriff auf Datenbanken ist zu beachten, auf welche Weise dieser geschieht. Man kann durchaus z.B. aufgrund des direkten Zugriffs auf eine Datenbank große Teile des zugehörigen Datenbank Management-Systems umgehen, was für Applikationen von Bedeutung sein kann. Denn damit verzichtet man auf z.B. den Nutzen von Optimierungsmethoden, Transaktionen oder Triggern (siehe Abschnitt 3.3) und muß Datenbankzugriffe dieser Art u.U. manuell im Applikationscode realisieren. Allerdings kann dies auch von Vorteil sein, da man sich bzw. die Applikation auf diese Weise nicht auf Eigenheiten eines DBMS spezialisiert und somit die Wahl der Datenbank frei bleibt bzw. leicht änderbar ist, z.B. durch einfaches Wechseln des ODBC-Treibers. 3.7 Hardware- und Softwareauswahl Datenbanksysteme können stark von der verwendeten Hardware unterstützt werden. Die Hardware muß je nach Anforderung an das Datenbanksystem bzw. an die jeweilige Anwendung ausgewählt werden, wie z.B. ein Main Memory-System oder ein Redundant Array of Inexpensive/Independent Disks (RAID). Bei RAID-Systemen etwa existieren viele Möglichkeiten und auch Abhandlungen für deren Realisierung in Abhängigkeit von notwendiger Effizienz, erwarteter Parallel- oder Konkurrenzverarbeitung, Ausfallsicherheits- sowie Wiederherstellungsanforderungen. Prominente Beispiele für Datenbanksysteme, also SQL-Server bzw. SQL-Server-Produkte, sind MySQL, Informix, Oracle, IBM DB2 oder der Microsoft SQL-Server, um hier nur einige zu nennen. Auch existieren XML-basierte Datenbanksysteme. Diese Produkte unterscheiden sich sehr stark in den Anforderungen, welche an ein Datenbanksystem gestellt werden, z.B. in der Eignung für mittelständische Unternehmen oder Großunternehmen. Bei MySQL handelt es sich als einzige um eine OpenSource-Software, ist aber dennoch für kommerziellen Einsatz nicht kostenlos. Auch existieren bei den genannten Produkten starke Preisunterschiede. Des weiteren besitzt jedes dieser Datenbanksysteme seine Eigenheiten. Wie in diesem Kapitel beschrieben, existieren allgemeine Theorien und Prinzipien zu Datenbanksystemen. Jedoch ist natürlich jedem Hersteller eines solchen Systems überlassen, auf welche Weise er diese umund einsetzt. D.h., bei der Auswahl eines geeigneten Datenbanksystems bzw. Datenbank-Produkts sowie der verwendeten Hardware für eine bestimmte Applikation müssen folgende Aspekte jeweils abgewägt werden: • Hardware- und Software-Anforderungen, • Effizienz (z.B. bei Entwicklung und Betriebszustand), • Kosten, • Personalaufwand (z.B. für Betrieb und Wartung). – 51 – 4 Datenbankapplikationen für TrustCenter Nach den Einblicken in die Kryptographie, in TrustCenter-Strukturen und in das Gebiet der Datenbanksysteme folgt nun in diesem Kapitel deren Zusammenführung. Wie schon kurz in der Einleitung erwähnt, geht es nun um die Struktur des Datenbankmodells eines TrustCenter bzw. der Registration Authority und entsprechender Datenbankapplikationen. Hierbei spielen nun auch Aspekte der Sicherheit, aber vor allem der effizienten Entwicklung und des effizienten Betriebs eine wesentliche Rolle. Eingeschlossen sind dabei flexible Änderungen an der TrustCenter-Struktur, um diese für verschiedene konkrete Anwendungsbereiche einsetzbar machen zu können. Dabei beziehen sich folgende Abschnitte einerseits auf allgemeine TrustCenter-Strukturen und andererseits, sozusagen beispielhaft, auf das konkrete TrustCenter-Produkt FlexiTrust35 und auf Details zu dessen implementierter Registration Authority. Des weiteren werden die Besonderheiten und Umstände von FlexiTrust beachtet und System-Lösungen anhand dessen Eigenschaften exemplarisch vorgestellt. D.h. ebenso, daß das bereits vorgestellte und definierte TrustCenter-Modell aus Abschnitt 2.3.1ff. erweitert wird. Details zu dessen Realisierung vor allem bzgl. der Registration Authority werden daher beschrieben und nach definierten Zielen und Kriterien bewertet. 4.1 Datenbanken und Datenhaltung in TrustCentern Basierend auf dem TrustCenter-Modell bzw. der TrustCenter-Struktur aus Abschnitt 2.3.1ff. werden nun die Aufgaben der TrustCenter-Datenbank sowie deren Stellung im TrustCenterModell definiert. Des weiteren wird ein konkretes Datenmodell für das TrustCenter selbst definiert und vorgestellt. Details zur Bedeutung, wie z.B. der verwendeten Relationen und deren Schlüssel (siehe auch Abschnitt 3.4.3ff.), und Realisierung des Modells werden dabei vor allem in den Abschnitten 4.6ff. und 4.10 schrittweise, auch anhand von anderen Varianten, erläutert sowie ergänzt und erweitert. Abbildung 17 zeigt einen Ausschnitt aus dem Datenmodell des TrustCenters, wobei dieses Modell im Folgenden für weitere Argumentationen als Basis dient. Denn hier sind zunächst alle wesentlichen Daten und deren Zusammenhänge erfaßt. Wie in der Abbildung zu erkennen, werden in der TrustCenter-Datenbank, die auf diesem Datenmodell aufbaut, neben Entities (siehe auch Abschnitt 2.4) ebenso Distinguished Names und Zertifikate gespeichert. Entities werden im Datenmodell als mehrstufige Objekte behandelt (siehe Abschnitt 4.6.2). Die Datenbank des TrustCenters, welche der Registration Authority (RA) unterstellt ist und auch von anderen TrustCenter-Komponenten genutzt wird, stellt einen äußerst wichtigen Bestandteil des TrustCenters dar. In dieser Datenbank wird der Registrierungsdatensatz bzw. werden die Registrierungsdaten (siehe Abschnitt 2.4) eines PKI-Mitglieds und u.a., wie im Datenmodell zu sehen, dessen Zertifikat gespeichert. Die TrustCenter-Datenbank hat im wesentlichen folgende Aufgaben: • Speichern von Personendaten sowie Registrierungsanträgen bzw. Antragsformularen, • Verknüpfen von Registrierungsdaten und ausgestellten Zertifikaten, • Aktivieren und Deaktivieren von PKI-Mitgliedschaften, 35 Bei FlexiTrust handelt es sich um eine mittlerweile renommierte TrustCenter-Implementierung, welche am Fachgebiet von Prof. Buchmann an der TU Darmstadt entstand. Eines der bislang größten Projekte, bei dem FlexiTrust zum Einsatz kam, entstand in Korporation mit T-Systems und der Regulierungsbehörde für Telekommunikation und Post (RegTP). – 52 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 17: Ausschnitt aus dem Datenmodell eines TrustCenters • Verwalten von Distinguished Names (siehe Abschnitt 2.7.6), • Speichern von Zertifikaten und Zertifikatsinformationen (z.B. Revokation), • Unterstützen des Verzeichnisdienstes. Im Folgenden wird hauptsächlich auf die Handhabung der Registrierungsdaten eingegangen. Denn die Sicherstellung der Verbindung von Registrierungsdaten und Zertifikaten ist essentiell, um die allgemeinen TrustCenter-Ziele und -Aufgaben (siehe Abschnitt 2.1) erfüllen zu können. Dabei wird im Folgenden auch das TrustCenter-Modell und die angedeutete Policy des Modells aus Abschnitt 2.4ff. weiterverwendet sowie erweitert, z.B. bzgl. des Umgangs mit Daten innerhalb des TrustCenters.36 Es ist zu beachten, daß Daten in der TrustCenter-Datenbank existieren, welche nur dort vorhanden sind und nicht in ausgestellten Zertifikaten. Während Zertifikate signiert werden können und somit alle im Zertifikat eingetragenen Daten, muß eine Datenbank auf andere Weise geschützt werden. Bei TrustCentern gilt im besonderen Maße, daß die zugrundeliegende Datenbank äußerst schützenswert ist und nur von autorisierten TrustCenter-Mitarbeitern bzw. Datenbankapplikationen eingesehen werden darf. Umgekehrt lassen sich Zertifikate in der TrustCenter-Datenbank, etwa in Verknüpfung zum Registrierungsdatensatz eines PKI-Teilnehmers, ablegen. Datenbanksysteme bieten nämlich auch die Möglichkeit Attribute für Binärdaten zu erzeugen, z.B. über den SQL-Datentyp Binary 36 In anderen TrustCenter-Modellen können die Aufgaben der RA und der TrustCenter-Datenbank durchaus anders definiert sein, z.B. wenn keine Trennung von CMA und RA vorliegt oder die CMA eine Offline-Komponente darstellt (siehe auch Abschnitt 2.6). Ebenfalls kann mehr als eine Datenbank für die verschiedenen TrustCenter-Aufgaben existieren. – 53 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Large Object (BLOB). Die Tabelle T Cert“ des Datenmodells aus Abbildung 17 kann damit ” auch die Zertifikate selbst speichern. Alle Abläufe rund um die TrustCenter-Datenbank müssen zum einen weitestgehend automatisiert vonstatten gehen. Dabei ist zu beachten, daß bei verschiedenen Stufen eines Registrierungsvorgangs TrustCenter-Mitarbeiter involviert sind, z.B. zur persönlichen Überprüfung und Kontrolle von Personendaten anhand von Personalausweisen, wodurch ein automatischer Ablauf nur zwischen einzelnen Stufen der Registrierung möglich ist. Zum anderen müssen solche Abläufe und Datenbankapplikationen sicher ausgeführt werden. Denn die TrustCenterDatenbank hat, wie beschrieben, eine zentrale Stellung innerhalb des gesamten TrustCenters und wird nicht nur von der Registration Authority sondern z.B. auch von der CMA und dem Verzeichnisdienst (siehe auch Kapitel 2) genutzt. 4.1.1 Registrierungsdaten und Zertifikate Wie schon in Abschnitt 4.1 ausführlicher beschrieben, kommt der TrustCenter-Datenbank eine wichtige Rolle. Sie ist daher besonders schützenswert. Vom TrustCenter ausgestellte Zertifikate und CRLs sind zentrale Stützen, um eine PKI zu betreiben (siehe auch Kapitel 2). Dabei werden Zertifikate und CRLs mit dem Schlüssel des TrustCenters signiert, womit ihre Gültigkeit für jeden nachweisbar und nachvollziehbar ist. In der Praxis kommt es jedoch oftmals vor, daß Daten aus dem Registrierungsdatensatz (siehe Abschnitte 4.1 und 2.4) nicht im Zertifikat enthalten sind. Der Grund liegt zum einen in der Menge und Veränderlichkeit von Daten, welche bei Registrierungsvorgängen und Datenerfassungen vorkommen können (siehe z.B. Abbildung 18). Zum anderen werden bestimmte Daten zwar erfaßt, unterliegen jedoch dem Datenschutz und dürfen daher nicht in ein öffentliches Zertifikat aufgenommen werden, z.B. die Matrikelnummer eines Studenten (siehe Abschnitt 4.2.1). Des weiteren enthalten die Registrierungsdaten auch Informationen, welche lediglich für Aufgaben innerhalb des Registrierungsablaufs gedacht sind, wie z.B. die reine Lieferadresse für ein Zertifikat, so daß es keinesfalls sinnvoll ist, diese in ein Zertifikat einzufügen. Dennoch müssen diese Daten, genauso wie ein öffentlicher Schlüssel, gleichermaßen einem Zertifikat zugeordnet werden können, z.B. auch unter gesetzlichen Maßstäben was ein essentieller Sicherheitsaspekt von PKIs ist (siehe Abschnitt 2.1).37 D.h., auch solche Daten aus dem Registrierungsdatensatz müssen verwaltet und gepflegt werden, z.B. die Postadresse eines Zertifikatinhabers. Die Zuordnung erfolgt eindeutig mittels des Distinguished Name, welcher stets auch den Registrierungsdatensatz kennzeichnet bzw. dort mitgeführt wird. Dabei muß das Datenmodell des TrustCenters einerseits geschützt und nachvollziehbar (siehe auch Abschnitt 4.10.1) sein. Andererseits muß die Vollständigkeit und Korrektheit der Registrierungsdaten stets garantiert sein. Bei der Realisierung eines TrustCenters bzw. einer Registration Authority, welche ausführliche Daten von PKI-Mitgliedern erfassen soll, muß demnach nicht nur die Personalisierung eines öffentlichen Schlüssels durch ein Zertifikat sichergestellt werden, sondern ebenfalls die eindeutige Verknüpfung von Zertifikat und Details zur Person, welche den Schlüsselinhaber darstellt, also zu deren restlichen Registrierungsdaten. Natürlich werden die essentiellen Teile dieser Daten, z.B. Nachname sowie Distinguished Name und Zertifikat-Seriennummer, in ein Zertifikat eingefügt, da dieses vom TrustCenter, also der Certfication Authority, signiert wird. 37 Das Nachweisen der Korrektheit interner Vorgänge und der Einhaltung gesetzlicher Maßstäbe, wie etwa dem Signaturgesetz (siehe auch Abschnitt 1.1.1), z.B. bei einem Gerichtsprozeß durch einen TrustCenter-Mitarbeiter als eine Art Sachverständigen, ist alles andere als trivial. Folglich ist die Rechtssprechung über digitale und verbindliche Kommunikation äußerst komplex. Aber auch diese muß u.U. durch das TrustCenter und dessen Umgang mit Daten möglich sein. – 54 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Aufgrund der geschilderten Bedeutung des Teils der Registrierungsdaten, welcher nicht im Zertifikat enthalten ist, wird deutlich, daß Zertifikate und Signaturen als notwendige Mittel für den TrustCenter-Betrieb nicht ausreichen. Auch dieser Teil der Registrierungsdaten ist äußerst schützenswert und kann je nach Anwendungsszenario stark variieren, z.B. bei einem TrustCenter in einem Großunternehmen oder an einer Universität. Diese Informationen bzw. Daten sind für Dritte also nicht einsehbar, aber dennoch in der Datenbank bzw. den Tabellen des TrustCenters vorhanden und für einige Vorgänge innerhalb der jeweiligen PKI-Realisierung unumgänglich, z.B. dem Ausliefern eines privaten Schlüssels. Hierbei kann es sich um erweiterte Identitätsdaten handeln, z.B. schlicht um Postadresse oder Telefonnummer, aber ebenso um andere personenbezogene Daten jeglicher Art innerhalb einer Anwendung, z.B. zu erhebende Daten wie Zertifikatsinhalt, Pseudonyme oder Versandinformationen. Bei einer heutigen PKI kommt es ebenfalls häufig vor, daß ein PKI-Mitglied mehrere Zertifikate besitzt und diese unter dem selben Distinguished Name oder unter verschiedenen Distinguished Names (siehe Abschnitt 2.7.5) zugänglich sind. Auch die Verwaltung von vielen Zertifikaten sowie Distinguished Names und die Verknüpfung dieser mit dem PKI-Mitglied bzw. dessen Registrierungsdaten muß das Datenmodell der TrustCenter-Datenbank sicherstellen. 4.1.2 Import und Export von Daten Wird ein TrustCenter in einem konkreten Anwendungsbereich installiert, z.B. einem Unternehmen oder einer Universität, so ist es wünschenswert, daß die Erfassung von Daten nicht von Grund auf neubeginnen muß. Beispielsweise kann der Fall vorliegen, daß ein Unternehmen bereits ausführliche Personendaten von Mitarbeitern und Angestellten auch elektronisch erfaßt hat. Diese können nun die Basis für die TrustCenter-Datenbank bilden und importiert werden. Auch gehört zu den Aufgaben einer Datenbankapplikation bzw. der Registration Authority des hier behandelten TrustCenter-Modells, daß Daten in bestimmten Fällen nach außen gebracht, also exportiert, werden. Solche Fälle unterscheiden sich stark. Z.B. kann es notwendig werden, die Daten eines Signatur-Absenders für einen Rechtsstreit offenzulegen, oder ein Unternehmen möchte in der eigenen, separat geführten, Angestelltendatenbank erfassen, welcher Angestellte über ein Zertifikat verfügt. Daher muß die RA fähig sein, beliebige DatenbankStatistiken und Reports bzw. Berichte (siehe auch Abschnitt 4.10.6) zu erstellen. 4.2 Praktische Aspekte Dieser Abschnitt soll einen kleinen Einblick in praktische und konkrete Umsetzungsaspekte eines TrustCenters gewähren. Wird ein TrustCenter wie FlexiTrust für ein konkretes Anwendungsszenario, also einem Kunden“ oder Mandanten“ wie z.B. einem Unternehmen, eingerichtet, so gehen die Entwick” ” ler von der Grundstruktur dieser Applikation bzw. Datenbankapplikation sowie der Datenbank aus und modifizieren Quellcode sowie Datenmodell, um sie für das jeweilige Szenario anzupassen. Z.B. können der Datenbank neue Tabellen hinzugefügt werden, etwa T Autoschlosser“, ” oder vorhandenen Tabellen werden neue Attributen hinzugefügt, wie etwa Fließbandnummer“ ” in “T Person“. Wie in Abschnitt 2.4 beschrieben, existieren verschiedene individuelle Möglichkeiten für den Umgang mit Registrierungsdaten und deren Erfassung, welche z.B. zentral oder dezentral erfolgen kann und nach verschiedenen Sicherheitsaspekten. Auch die Verteilung der TrustCenter-Komponenten auf einem oder mehreren Rechnern bzw. Servern obliegt der je- – 55 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER weiligen Sicherheitsanforderung. Techniken wie u.a. LDAP machen es ebenfalls möglich, eine TrustCenter-Datenbank verteilt, also dezentral zu betreiben. Die TrustCenter-Datenbank enthält dabei Tabellenstrukturen für den TrustCenter-Betrieb und die Erfassung der PKI-Mitgliederdaten. Meist ist es nicht möglich bzw. erwünscht, daß das TrustCenter direkt auf z.B. Angestelltendaten etc. eines Unternehmens zugreift. Das bedeutet, daß die TrustCenter-Applikation stets eine eigene Datenbank und u.U. auch einen eigenen Server besitzt. Damit verbunden ist das Synchronisieren bzw. Importieren und Exportieren von Daten, da auf diese Weise Daten redundant existieren. Abbildung 18 zeigt einen Auszug aus einer real vorkommenden Tabellendefinition, wobei die Tabellendefinition als SQL-Anweisung dargestellt ist. Das Beispiel zeigt, welche Personendaten in der Praxis in einem TrustCenter vorkommen können und abgebildet werden müssen. Die Original-Tabelle hat mehr als 60 Attribute, wobei diese Tabelle dann die vollständigen Registrierungsdaten der PKI-Mitglieder enthält. Abbildung 18: Praktisches Beispiel für eine real vorkommende Personentabelle – 56 – 4 4.2.1 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER TrustCenter an einer Universität FlexiTrust wurde bereits in verschiedenen Anwendungsszenarien eingesetzt, so auch an der TU Darmstadt (siehe vor allem [Zoe03]). Im TrustCenter der Rechnerbetriebsgruppe (RBG) des Fachbereichs Informatik findet die Registrierung von Mitarbeitern, z.B. auch Professoren, dezentral (siehe Abschnitt 2.4) statt. Studenten hingegen haben eine feste Anlaufstelle. Diese und die folgenden Regeln für den Registrierungsablauf sind natürlich in der zugehörigen Policy des TrustCenters festgehalten, wobei es sich hierbei also um ein spezielles und konkretes Anwendungsszenario handelt. Der Fachbereich ist in verschiedene einzelne Fachgebiete, also Arbeitsgruppen von Professoren, unterteilt. In jedem dieser Fachgebiete existiert nun auch ein bestimmter Mitarbeiter, welcher verantwortlich und berechtigt ist, Zertifikate für seine Kollegen zu beantragen. Denn natürlich ist eine solche Person am besten über Mitarbeiterwechsel in seiner Arbeitsgruppe informiert, weshalb auch die Policy so gestaltet wurde. Die Antragsdaten werden nach ihrer Erfassung wiederum in der zentralen TrustCenterDatenbank abgelegt. Nun leitet die Registration Authority (siehe Abschnitt 2.4) den Zertifizierungsvorgang ein, und ein Zertifikat wird an z.B. die im Zertifikat enthaltene eMail-Adresse (X.509v3-Extension, siehe Abschnitt 2.2) des entsprechenden Mitarbeiters verschickt. Der Distinguished Name wird dabei so gebildet, wie schon in Abbildungen 7 bzw. 5 gezeigt. Das jeweilige Schlüsselpaar wird ebenfalls zentral erzeugt und als PKCS#12 -Datei (siehe [RSA04]) per eMail verschickt. Es sollte klar sein, daß private Schlüssel selbstverständlich nicht in öffentlichen Zertifikaten enthalten und auch besonders schützenswert sind. Die Vertraulichkeit des privaten Schlüssels wird dazu durch ein Paßwort sichergestellt. Der Schlüsselinhaber gibt dieses Paßwort bei der Antragstellung an bzw. bekommt es mitgeteilt. Abbildung 19 zeigt FlexiTrust als konkretes TrustCenter der Rechnerbetriebsgruppe mit seinen Abläufen inklusive der TrustCenter-Datenbank. 4.3 TrustCenter-Implementierung mit Java FlexiTrust und somit auch das in dieser Arbeit diskutierte TrustCenter-Modell haben u.a. folgende spezielle Realisierungseigenschaften: • Komponentenaufteilung (siehe Kapitel 2), • Java-Implementierung, • flexible Nutzung von verschiedenen Kryptosystemen. Die Einbindung von Kryptosystemen beruht auf Java-Technologien von Sun (siehe [Sun04-1]) bzw. den Packages der Java Security API. Dabei wird die im Java Development Kit (JDK) enthaltene Java Cryptography Architecture (JCA) und deren Erweiterung in Form der Java Cryptography Extensions (JCE) genutzt. Diese stellen eine Interface-Architektur für die Implementierung von kryptographischen Systemen zur Verfügung. Eine konkrete auf dieser Architektur basierende Sammlung von implementierten Kryptosystemen wird Provider genannt. So ist es nicht nur möglich Java-Applikationen zu entwickeln, die JCA-Kryptosysteme nutzen, sondern es ist ebenfalls möglich den jeweiligen Provider, also die jeweilige Implementierung auf einfache Weise zu wechseln. Eine freie OpenSource-Implementierung eines solchen Providers wurde am Fachgebiet von Prof. Buchmann an der TUD entwickelt: Der FlexiProvider (siehe [Fle04]). Ein Zitat von der zugehörigen Internet-Seite charakterisiert diesen sehr gut: – 57 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 19: Grafik von der Arbeitsgruppe Prof. Buchmann über das RBG-TrustCenter The FlexiProvider is a powerful toolkit for the Java Cryptography Architecture ” (JCA/JCE). It provides cryptographic modules that can be plugged into every application that is built on top of the JCA. The goal of our project is to supply fast and secure implementations of cryptographic algorithms which are easy to use even for developers who are not well-footed in the field of cryptography.“ Vorteile bei der Verwendung von Java, auch bzgl. einer TrustCenter-Applikation und deren Datenbank, sind u.a.: • Plattformunabhängigkeit, • Kompatibilität, • flexible Interface-Strukturen und Frameworks. – 58 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Ein Nachteil von Java, welcher sich auch aus dessen Vorteilen ergibt, da es sich hierbei um entgegengesetzte Ziele handelt, ist die reine Rechenleistung. Eine C-Implementierung eines speziellen kryptographischen Algorithmus wird in den meisten Fällen schneller sein als eine entsprechende Java-Implementierung, da ein C-Compiler die speziellen Hardware- und Betriebssystem-Voraussetzungen nutzt. Natürlich ist es dennoch möglich, bzgl. der Rechenleistung effiziente Java-Implementierungen zu entwickeln, und man gewinnt durch Java ein hohes Maß an Kompatibilität und Flexibilität, was in der Kryptographie äußerst wichtig ist, z.B. beim Austauschen und Nutzen von bestimmten Kryptosystemen. Des weiteren handelt es sich bei einem TrustCenter um eine Anwendung mit einem hohen Anteil an Interaktionen, wie z.B. der persönlichen Überprüfung von Personendaten im Registrierungsablauf, wodurch sich eine etwas langsamere Rechenleistung kaum bemerkbar macht. Datenbanksysteme können in Java-Umgebungen vollständig genutzt werden ebenso wie ODBC-Treiber (siehe Abschnitt 3.6). Dies geschieht stets durch Suns JDBC, welches eine Vielzahl an Zugriffsvarianten auf Datenbanksysteme bereitstellt. Im Folgenden werden also allgemeine Datenbank-Lösungen sowie spezielle Java-Lösungen vorgestellt, welche beide mehr oder weniger leicht auch auf andere Arten der TrustCenterImplementierung angewendet werden können. Für FlexiTrust gilt im besonderen, daß auch Java-spezifische Lösungen möglich sind, da es sich hierbei um eine spezielle Java-Entwicklung handelt. 4.3.1 Datenbankzugriffe unter Java mittels JDBC Datenbankverbindungen werden unter Suns Java-Systemen mittels JDBC bewerkstelligt (siehe auch Abschnitt 4.7.1). Dabei gibt es mehrere Varianten von einfachen bis zu NetzwerkVerbindungen. Eine Möglichkeit, um eine Verbindung mit einer Datenbank aufzunehmen, ist die JDBCODBC-Bridge. Dazu ist lediglich eine vorhandene ODBC-Datenquelle nötig, also eine im System durch einen ODBC-Treiber registrierte bzw. eingerichtete Datenbank. Die nötigen Elemente zur erfolgreichen Datenbankverbindung unter Java zeigt folgendes selbsterklärendes Beispiel. Es setzt das Vorhandensein einer entsprechenden Tabelle T Person“ in der Daten” bank voraus (zu sehen in Abbildung 20 auf Seite 74). Des weiteren zeigt es das Zugreifen auf Datensätze sowie das Einfügen, Ändern und Löschen von Datensätzen dieser Tabelle: import java.sql.*; public class AccJDBC { private Connection con; private Statement stm; private String url = "jdbc:odbc:MyTestDB"; // *** // über ODBC im System registrierte Datenbank ’MyTestDB’ private ResultSet rs; // Java-Cursor public void accTest(){ // Code für Datenbankverbindung: // (Für Datenbankverbindungen müssen // Exceptions stets abgefangen werden) System.out.println("Baue Datenbankverbindung auf..."); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // *** }catch(ClassNotFoundException e){}; try{ – 59 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER con = DriverManager.getConnection(url); stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); // ODER (sofern unterstützt): // con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, // ResultSet.CONCUR_UPDATABLE); // Beispiel für das Einfügen eines neuen Datensatzes // mittels SQL-Query zur Datenänderung: stm.executeUpdate("INSERT INTO T_Person Values(1964, ’Bond’, ’James’, ’#007’);"); // Ebenfalls denkbar: stm.executeUpdate("UPDATE T_Person SET T_Person. DienstNr = ’#000’ WHERE (((T_Person.Name)=’Bond’));"); stm.executeUpdate("DELETE T_Person.Name FROM T_Person WHERE (((T_Person.Name)=’Bond’));"); /* */ /* // Beispiel für das Einfügen eines neuen Datensatzes // durch Java-Cursor ResultSet (sofern unterstützt): rs = stm.executeQuery("Select * FROM T_Person"); rs.moveToInsertRow(); rs.updateString("Name", "Me"); rs.updateString("Vorname", "MeToo"); rs.updateString("DienstNr", "007"); rs.updateInt("PersID", 123); rs.insertRow(); // schreiben in die Datenbank // Bei einer lediglichen Änderung // (ohne moveToInsertRow()): // rs.updateRow(); */ // rs // // // // Beispiel für reinen Lese-Zugriff = stm.executeQuery("Select * FROM T_Person"); Auf diese Weise werden SQL-Queries ausgeführt und deren Ergebnisse an einen Java-Cursor übergeben. T_Person ist dabei eine Tabelle in der Datenbank ’MyTestDB’. String tmpName = new String(); String tmpVorname = new String(); // So läuft man mit dem Cursor in der // Query-Ausgabe abwärts. rs.beforeFirst(); while(rs.next()){ tmpName = rs.getString("Name"); tmpVorname = rs.getString("Vorname"); // ODER (in diesem Beispiel): // tmpName = rs.getString(2); // tmpVorname = rs.getString(3); System.out.println(tmpName + ", " + tmpVorname); } // Beispiel für Ausgabe aller Namen der Tabelle. stm.close(); }catch(SQLException e){System.out.println(e);}; } } – 60 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER In späteren Code-Auszügen werden ähnliche Varianten immer wieder auftauchen. Im obigem Beispiel werden SQL-Queries in den Java-Code direkt als String eingebettet, was teilweise aufgrund der Länge einer Query unhandlich werden kann. Ebenso lassen sich Queries als Strings natürlich nicht vom Java-Compiler überprüfen bzw. validieren, auch nicht die Syntax. Lediglich zur Laufzeit eines Programms werden u.U. Fehlermeldungen ausgeworfen, z.B. wenn angegebene Attribute bzw. Spaltennamen in einer Tabelle nicht vorhanden sind. Zu dieser Vorgehensweise ergänzend ist im Interface Connection eine Möglichkeit zur Parametrisierung von SQL-Anweisungen vorgesehen. Damit ist eine Vereinfachung im Umgang mit SQL-Strings möglich, was z.B. bei FlexiTrust genutzt wird (siehe Klasse Student.java“ ” im Abschnitt 4.4.1). Eine zweite Möglichkeit, eine Datenbankverbindung mit JDBC aufzubauen, ist über einen speziellen JDBC-Treiber für das jeweilige Datenbanksystem bzw. die jeweilige Datengrundlage. Für das obige Beispiel ändern sich dabei lediglich die beiden mit ***“ markierten Zeilen ” bzw. String-Angaben. Es existiert eine Vielzahl von JDBC-Treibern für bestimmte Datenbanksysteme oder auch z.B. reine Textdateien. Das Ansteuern einer Datenbank über eine Netzwerk-Adresse bzw. URL ist ebenso leicht möglich. Des weiteren bietet JDBC eine Unterstützung an, um sich an einem Datenbanksystem anzumelden. D.h. also, die Angabe von Benutzername und Paßwort ist für eine Datenbankverbindung möglich, sofern eine Benutzerverwaltung für das Datenbanksystem existiert. 4.4 Konzept der FlexiTrust-OpenRA Die OpenRA ist eine Datenbankapplikation innerhalb des Produkts FlexiTrust, welche die Registration Authority des TrustCenters realisiert (Details siehe vor allem [Dam01] und [Sch01]). Auf die Ziele und Aufgaben der Registration Authority wurde bereits in Abschnitt 2.4 eingegangen. Folgendes Zitat aus [Kan04] beschreibt den Registrierungsablauf mittels der OpenRA recht gut, auch wenn sich das Konzept seither weiterentwickelt hat: In der RA werden Formulare verwendet, um z.B. Zertifizierungsanträge entgegen ” zu nehmen. Dabei ist das zugrundeliegende Framework so gestaltet, daß ohne Neukompilation und ohne das Schreiben von Java-Klassen neue Formulare generiert und verarbeitet werden können, sofern die zur Verarbeitung benötigten Produkte bereits existieren. Außerdem sind die Formulare prinzipiell unabhängig vom Ausgabeformat, auch wenn es zum Teil sehr auf HTML ausgelegt ist.“ Der Registrierungsvorgang läuft dabei in mehreren Schritten ab. Der erste Schritt ist natürlich ein Neuantrag, welcher je nach Anwendungsumgebung automatisch initialisiert wird, z.B. beim Entstehen des TrustCenters, oder auf persönlichen Antrag erfolgt. In weiteren Schritten müssen die Daten des digitalen RA-Antragsformular vervollständigt oder überprüft werden (siehe auch Abschnitt 2.4). Erst im letzten Schritt, nach erfolgreicher Zertifizierung und Aufnahme eines PKI-Teilnehmers, werden die Antragsdaten im TrustCenter-Konzept zu dauerhaften Registrierungsdaten und werden freigeschaltet, wodurch sie z.B. im Verzeichnisdienst auffindbar sind. Bei verteilten TrustCenter-Systemen, z.B. bei verteilter Registrierung mit zentraler Datenbank, melden sich ausgewiesene Mitarbeiter über ihre eigene Workstation an der RADatenbank an und können entsprechende Registrierungsdaten eingeben oder vervollständigen. Nach der erfolgreichen Überprüfung der Antragsdaten, leitet die RA u.a. die Erstellung von Schlüsseln und Zertifikaten ein, indem sie die Antragsdaten entsprechend an die KA (siehe auch Abschnitt 2.3.1ff.) weiterleitet, z.B. manuell über bestimmte TrustCenter-Mitarbeiter. – 61 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Ähnlich verläuft dann die Weitergabe von Zertifikaten und die Ausgabe von Schlüssel-Paketen an die CMA. 4.4.1 Datenbank-Abläufe rund um die OpenRA Neben verschiedenen Hilfsklassen sind die zentralen Java-Klassen bei FlexiTrust bzw. bei der OpenRA, welche für Datenbankzugriffe und Datenbank-Operationen zuständig sind, die folgenden: • DBAccess.java (Zugriff auf eine Datenbank), • Entity.java (Darstellen eines Datenbankobjekts als Java-Klasse), • GenerateEntity.java (Generieren von Entity-Klassen). Natürlich werden diese Klassen von jeder Teilanwendung FlexiTrusts genutzt, die auf Datenbankverbindungen angewiesen ist. Im Folgenden werden einige Auszüge aus diesen Klassen gezeigt, damit ein kleiner Eindruck über die aktuelle Handhabung der Datenbankabläufe gewonnen werden kann. DBAccess.java“ nutzt JDBC zum Zugriff auf eine beliebige Datenbank: ” public class DBAccess { private static DBAccess instance; private Properties props; private String dburl; private Hashtable ConnectionPool = new Hashtable(20); /** Creates new DBAccess */ public DBAccess() { try { String drivername = RAPropertyHelper.getProperty("services.db.driver"); if (drivername == null) { throw new RuntimeException("Error accessing database. Not driver specified Halting!"); } Driver driver = (Driver) Class.forName(drivername).newInstance(); DriverManager.registerDriver(driver); props = new Properties(); props.put("user", RAPropertyHelper.getProperty("DB_Username")); String password = RAPropertyHelper.getProperty("DB_Password").trim(); if ("<<SYSTEM_PROPERTY>>".equals(password)) { props.put("password", System.getProperty("ra.dbpassword")); } else { props.put("password",password); } props.put("dbname", RAPropertyHelper.getProperty("DB_Name")); this.dburl = RAPropertyHelper.getProperty("DB_Url"); } catch (SQLException e) { [...] } } /** – 62 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER * get a connection to the database * @return the Connection */ public Connection getConnection() throws SQLException { Connection con = DriverManager.getConnection(this.dburl, props); Statement stmt = con.createStatement(); stmt.execute("USE " + props.getProperty("dbname")); return con; } /** * get a connection for a given context. If the connection * was already created, only the handle is given back. * * @param String Contextname * @return Object of type Connection */ public Connection getConnection(String contextName) throws SQLException { Connection con = null; if (ConnectionPool.containsKey(contextName)) { con = (Connection)ConnectionPool.get(contextName); if (con.isClosed()) { con = getConnection(); ConnectionPool.put(contextName,con); } return con; } else { con = getConnection(); ConnectionPool.put(contextName, con); return con; } } /** DBAccess conforms to the pattern ’singleton’ */ public static DBAccess getInstance() { if (instance == null) { instance = new DBAccess(); } return instance; } protected void finalize() { Enumeration en; String current; for (en = ConnectionPool.keys(); en.hasMoreElements();) { current = (String) en.nextElement(); try { ((Connection)ConnectionPool.get(current)).close(); } catch (SQLException se) { StaticLogfile.write("RA","DBAccess", StaticLogfile.EXCEPTION,"Couldn’t close a connetion"); StaticLogfile.writeException("RA","DBAccess", StaticLogfile.EXCEPTION,se); } ConnectionPool.remove(current); } } } – 63 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Ausgehend von der Klasse Entity.java“ können weitere Entities abgeleitet werden, wobei die ” zugehörige Java-Klasse durch die Vererbung ähnlich aufgebaut ist. Auch können alle abgeleiteten Entities anstelle der Klasse Entity in Java einfach genutzt werden, ohne daß besondere Code-Änderungen nötig werden. Ein Beispiel für eine solche abgeleitete Klasse ist Stu” dent.java“. Attribute des Datenbankobjekts, z.B. die Matrikelnummer, finden sich natürlich auch als Attribute bzw. Variablen in der passenden Java-Klasse: public class Student extends Entity { private static final String TABLE_NAME = "student"; private String lastName; private String firstName; private String matrikelNr; private String accountName; private String email; private String mySelectString = "select first_name,last_name,account_name,matrikel_nr,email " + "from "+TABLE_NAME+" where (subject_dn=? AND issuer_dn=?)"; private String myUpdateString = "update "+TABLE_NAME+" set first_name=?, last_name=?, " + "account_name=?, matrikel_nr=?, email=? where (issuer_dn=? AND subject_dn=?)"; private String myInsertString = "insert "+TABLE_NAME+" set first_name=?, last_name=?, " + "account_name=?, matrikel_nr=?, email=?, issuer_dn=?, subject_dn=?"; public Student(String SubjectDN, String IssuerDN, String ExternKey, boolean printPIN) throws EntityException { super(SubjectDN, IssuerDN, ExternKey, "de.tud.cdc.flexiTrust.ra.entities.Student", printPIN); StaticLogfile.write( "RA", "entities.Student", StaticLogfile.DEBUG, "Created Student with sDN=" + SubjectDN + " ,iDN=" + IssuerDN +" ,ExternKey="+ExternKey); } [...] /** * Gets the LastName * @return Returns a String */ public String getLastName() { return lastName; } /** * Sets the LastName * @param myLastName The LastName to set */ public void setLastName(String myLastName) { this.lastName = myLastName; markDirty(); } [...] public void loadFromDB(Connection conn) throws EntityException { – 64 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER super.loadFromDB(conn); PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(mySelectString); ps.setString(1, getSubjectDN()); ps.setString(2, getIssuerDN()); rs = ps.executeQuery(); if (rs.next()) { firstName = rs.getString(1); lastName = rs.getString(2); accountName = rs.getString(3); matrikelNr = rs.getString(4); email = rs.getString(5); } else { rs.close(); ps.close(); throw new EntityException( "Student with issuer_dn=’" + getIssuerDN() + "’ and subject_dn=’" + getSubjectDN() + "’ does not exist."); } } catch (SQLException se) {[...]} } public void storeToDB(Connection conn) throws EntityException { int rowCount; try { PreparedStatement ps = null; if (isPersistent()) { super.storeToDB(conn); ps = conn.prepareStatement(myUpdateString); } else { //jezo: if (!isExisting (getSubjectDN(), getIssuerDN())){ //new user ps = conn.prepareStatement(myInsertString); } else { //after revocation ps = conn.prepareStatement(myUpdateString); } super.storeToDB(conn); //before: //super.storeToDB(conn); //ps = conn.prepareStatement(myInsertString); } ps.setString(1, firstName); ps.setString(2, lastName); ps.setString(3, accountName); ps.setString(4, matrikelNr); ps.setString(5, email); ps.setString(6, getIssuerDN()); ps.setString(7, getSubjectDN()); StaticLogfile.write( "RA", – 65 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER "entities.Student", StaticLogfile.DEBUG2, "running insert with statement:" + ps.toString()); rowCount = ps.executeUpdate(); if (rowCount != 1) { throw new EntityException( "Error storing Student object. " + rowCount + " rows were affected!"); } } catch (SQLException se) { throw new EntityException( "Error storing Student into database. Caught Exception!", se); } } } Bisher bedient man sich bei der OpenRA zum Generieren einer solchen Entity-Klasse eines Java-Programms, bei welchem der Text“ oder Inhalt einer Java-Klasse schlicht in eine neue ” Datei eingefügt wird. Dieser Inhalt wird aus zuvor erstellten Tabellendefinitionen erzeugt: public class GenerateEntity { private static StringBuffer fileName; private static String tableName; private static String columns[]; private static FileWriter outFile; private static void readColumnNames() throws Exception { Connection con; Statement stmt; ResultSet rs; ResultSetMetaData rsmd; String tmp; int i, j; con = DBAccess.getInstance().getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("SELECT * FROM " + tableName); rsmd = rs.getMetaData(); columns = new String[rsmd.getColumnCount() - 2]; j = 0; for (i = 0; i < rsmd.getColumnCount(); i++) { tmp = rsmd.getColumnName(i+1); System.out.println("Reading "+tmp); if (tmp.equals("status") || tmp.equals("formID")) continue; columns[j++] = tmp; } } private static void writeHeader() throws Exception { outFile.write( "package de.tud.cdc.flexiTrust.ra.entities;\n" + "import java.security.Principal;\n" + "import java.sql.Connection;\n" + "import java.sql.Date;\n" + "import java.sql.PreparedStatement;\n" + "import java.sql.ResultSet;\n" + "import java.sql.SQLException;\n" – 66 – 4 + + + + DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER "\n" "import de.tud.cdc.flexiTrust.ad.StaticLogfile;\n" "\n" "public class DGNPerson extends Entity {\n"); } private static void declareStringVar(String name) throws Exception { outFile.write(" private String " + name + ";\n"); } private static void writeColList() throws Exception { for (int i = 0; i < columns.length; i++) { if (i != 0) outFile.write(","); outFile.write(columns[i]); } } private static void writeColSetList() throws Exception { for (int i = 0; i < columns.length; i++) { if (i != 0) outFile.write("=?,"); outFile.write(columns[i]); } } private static void writeSelectString() throws Exception { outFile.write("\n private String selectString =\n"); outFile.write( " \"SELECT * FROM " + tableName + " WHERE (subject_dn=? AND issuer_dn=?)\";\n"); } [...] public static void main(String[] args) { try { tableName = args[0]; if (args.length != 1) { System.out.println( "Wrong command format: GenerateEntity table"); return; } fileName = new StringBuffer(args[0]); if (Character.isLowerCase(args[0].charAt(0))) { fileName.setCharAt( 0, Character.toUpperCase(fileName.charAt(0))); } fileName.append(".java"); System.out.println("OUTPUT TO ’" + fileName.toString() + "’"); outFile = new FileWriter(fileName.toString()); readColumnNames(); writeHeader(); for (int i = 0; i < columns.length; i++) { declareStringVar(columns[i]); } writeSelectString(); writeUpdateString(); writeInsertString(); outFile.write(’\n’); – 67 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER for (int i = 0; i < columns.length; i++) { writeSetStmt(columns[i]); } outFile.write(’\n’); for (int i = 0; i < columns.length; i++) { writePutStmt(i + 1, columns[i]); } for (int i = 0; i < columns.length; i++) { writeStringSetter(columns[i]); } outFile.write(’\n’); [...] } catch (Exception ex) { ex.printStackTrace(); } } } Diese Methode ist vielleicht weniger elegant, dennoch ist sie nicht unbedingt ineffizient. 4.4.2 Erweiterungsmöglichkeiten für das OpenRA-Konzept Im Folgenden werden zu lösende Aufgaben und Ziele bei der OpenRA bzw. FlexiTrust aus Sicht eines Datenbank-Entwicklers, abgeleitet aus den Merkmalen der OpenRA, zusammengefaßt. • Hohe Flexibilität ist eine zentrale Eigenschaft von FlexiTrust. Dabei bezieht sich Flexibilität vor allem auf Verwendung von Kryptosystemen und die Anpassungsfähigkeit für verschiedenste Anwendungsszenarien. So ist es z.B. möglich, Teile der OpenRA, wie die Verwaltung für Antragsformulare, in unterschiedlichen Umgebungen einzusetzen, ohne Quelltexte neu schreiben oder kompilieren zu müssen. Entities, also Datenbankobjekte wie Personendaten, werden bisher jedoch als feste JavaKlasse repräsentiert. Zwar existieren hier Standard-Klassen, diese müssen jedoch u.U. angepaßt werden. Es ist also sinnvoll, hier ein ähnlich flexibles Datenmodell zu erstellen wie bei RA-Formularen, so daß keine neuen Klassen oder Neukompilationen nötig sind. Die jeweiligen Datenbankobjekte, z.B. Personendaten, werden dabei bisher ebenfalls in festen Tabellen abgelegt und der Zugriff darauf ist im Quellcode eingebettet. • Die vorhandenen Datenbankzugriffe sind stark SQL-lastig, etwa zum Suchen von Formularen oder anderen Datenbankobjekten, was jedoch nicht zwingend nachteilig sein muß. Problematischer ist das Erstellen von Datenbankzugriffen für ein individuelles Projekt. Z.Z. geht man von einem Standard-Schema aus, welches angepaßt wird. Solch ein Vorgehen ist natürlich fehleranfällig und der Entwickler muß seine Arbeit stets genau überprüfen und testen. • Bisherige eingesetzte Datenmodelle hatten teilweise Schwächen in der Festlegung des Primärschlüssels, da hierfür auch Distinguished Names verwendet wurden, etwa SubjectDN und IssuerDN. Da diese jedoch, z.B. bei zeitlich begrenzt ausgestellten Zertifikaten, mehrfach in einer TrustCenter-Datenbank vorkommen, sind sie oftmals ungeeignet. Ihr Vorteil liegt allerdings offensichtlich in der Nachvollziehbarkeit, da DatenbankOperationen bei ihrer Verwendung beispielsweise stets bestimmten Entities bzw. Personen zugeordnet werden können. Automatisch vergebene eindeutige Kennzeichner, welche bei Datenbanken meist verwendet werden, bieten eine derartige Transparenz nicht. Daher ist eine Verknüpfung beider Kennzeichnungsarten sinnvoll (siehe Abschnitt 4.10.2). – 68 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER • Aufgrund der flexiblen Nutzung von Datenbank-Treibern und somit von Datenbanksystemen ist es nicht möglich spezielle Eigenschaften von Datenbanksystemen, wie z.B. Transaktionen oder Trigger, auszunutzen. Jedoch gibt es hierfür unter Berücksichtigung der Flexibilität bzgl. der Wahl eines Datenbanksystems für das TrustCenter Alternativen unter Java (siehe auch Abschnitt 4.10.7). 4.5 Persistierung von Daten Dieser Abschnitt beschreibt die Vorgehensweise für das Persistieren von Daten innerhalb einer allgemeinen Datenbankapplikation und eines TrustCenter. 4.5.1 Datengattungen Man kann bei Datenbankapplikation verschiedene Arten von zu persistierenden Daten unterscheiden: • Objekte eines Datenmodells, • Objekte einer Programmiersprache, • Kombination beider Objektarten. Ein Beispiel für eine Anwendung, die nur auf Daten oder Informationen bzw. Objekte in einer vorhandenen Datenbank zugreift, ist eine Adhoc-Query, mit welcher lediglich Daten direkt abgefragt oder eingefügt werden. Ein weiteres Beispiel hierfür ist eine Suchmaske, welche einer Person ohne Datenbankkenntnisse einen einfachen Zugriff auf eine Datenbank zur Verfügung stellen soll, was durch Umwandlung der Eingabe in die Suchmaske in SQL-Code bzw. in eine SQL-Query möglich ist. Objekt-Relationales-Mapping hingegen hat zum Ziel bei der Implementierung einer Applikation mit einer objektorientierten Entwicklungsumgebung oder Programmiersprache, vorkommende Objekte zu persistieren, genauer auf relationale Datenbanken abzubilden. Ein Beispiel hierfür ist die Implementierung einer ausfallsicheren Druckerwarteschlange. Dabei sind zunächst keine speziellen zu persistierenden Informationen vorhanden. Die Objekte, also Druckaufträge in der Warteschlange jedoch sollen bei ihrem Eingang als erstes in die Datenbank eingefügt werden. Der Entwickler sorgt demnach dafür, daß die Objekte bzw. Klasseninstanzen, welche die Druckaufträge darstellen, derart in der Datenbank abgelegt werden, daß die Objekte selbst einfach wiederhergestellt werden können. Dabei ist es z.B. unerheblich, ob die Daten in der Datenbank lesbar sind. Auch könnte man in bestimmten Fällen u.U. auf den Einsatz von Datenbanken verzichten und solche Objekte beispielsweise in Dateien speichern. Ebenfalls kann es vorkommen, daß man bei Datenbankapplikationen beide Gattungen von zu persistierenden Objekten kombiniert, etwa wenn man Objekte einer Datenbank auch als Objekte, also Klasseninstanzen einer Programmiersprache repräsentieren möchte oder umgekehrt. Z.B. kann es sinnvoll sein bei einer Applikation basierend auf einer Personendatenbank, auch eine Klasse Person zu implementieren, deren Variablen die Attribute des Datenbankobjekts darstellen. Bei solchen Klassen bzw. Klassenstrukturen handelt es sich also um eine Repräsentationsschicht oder Zugriffsschicht für die Datenbankobjekte. In einem TrustCenter und vor allem bei FlexiTrust liegt die letzte vorgestellte Variante vor. – 69 – 4 4.5.2 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Entwickeln von Datenbankapplikationen für TrustCenter Man kann einem Entwickler von Datenbankapplikationen nicht ersparen, Datenmodelle zu entwickeln. Dazu gehört das Festlegen von zu persistierenden Daten, Attributen, Datentypen usw. Der Idealfall ist somit, daß dies nur einmal erfolgen muß. Im Falle einer TrustCenter-Implementierung stehen u.a. Personendaten im Mittelpunkt. Dabei ist zu beachten, daß je nach Anwendungsumgebung für ein TrustCenter unterschiedliche Personendaten aufkommen. Man vergleiche z.B. die notwendigen Personendaten, welche ein TrustCenter erfassen muß, für Studenten an einer Universität und Mitarbeiter eines pharmazeutischen Unternehmens. Im Falle der Studenten sind dies Daten wie die Matrikelnummer oder der Immatrikulationsstatus, bei den Mitarbeitern hingegen Daten wie etwa die Raumnummer des Büros oder der Name der Abteilung. Für das Einrichten konkreter Datenbanken für Datenbankapplikationen, genauer, zugehöriger Tabellendefinitionen, gibt es nun zwei Möglichkeiten. Einerseits ist es typischerweise möglich von der Datenbanksicht auszugehen, also erst Tabellen einzurichten und daraufhin den Applikationscode anzupassen. Andererseits kann man aus dem Applikationscode heraus entsprechende Tabellen erzeugen lassen. Automatisierungen in beiden Fällen sind für Entwickler natürlich sehr interessant, da so die Entwicklungs- und Einrichtungszeit verkürzt werden kann. Ein Ziel bei der Entwicklung von Datenbankapplikationen ist folglich, nur von einer Seite – Datenbankseite oder Codeentwicklungsseite – aus zu entwickeln und die andere automatisch erzeugen zu lassen. Dazu muß man sich entscheiden, von welcher Seite aus man als Entwickler arbeiten möchte. Dabei ist zu beachten, daß eine übliche Möglichkeit zum Zugreifen auf eine Datenbank innerhalb einer Applikation bzw. des Applikationscodes darin besteht, direkt auf Tabellenstrukturen zu zugreifen. D.h., Tabellennamen etc. werden in den Code eingebettet und explizit angegeben, meist in Form von SQL-Anweisungen. Bei vielen Applikationen ist dies ausreichend, weil sich Tabellenstrukturen eher selten oder gar nicht ändern, anders bei einer TrustCenterAnwendung und z.B. der zugehörigen Personendatenbank. Natürlich gibt es bei TrustCentern eine gewisse feste Grundstruktur, die für den TrustCenter-Betrieb notwendig ist, z.B. Attribute für Distinguished Names von PKI-Mitgliedern. Selbst wenn man nicht manuell Datenbankstrukturen erzeugen muß, z.B. wenn aus einer entwickelten Klassenstruktur automatisch Datenbankstrukturen erzeugt werden, hat man wiederum durch den Aufbau der entsprechenden Klassen ebenso manuell“ die zu persistierenden ” Daten festgelegt. D.h. also, ein Entwickler von Datenbankapplikationen muß auf die eine oder andere Weise stets auch Daten und deren Struktur, sprich das Datenbankmodell, ausarbeiten und entwickeln, z.B. die notwendigen Entities mit ihren Attributen und Abhängigkeiten oder die Bestimmung des Primärschlüssels. Dazu existiert keine Alternative. Es ist z.B. nicht möglich für beliebige Applikationen ausschließlich auf Standarddefinitionen zurückzugreifen. Auch ist dies im Rahmen eines TrustCenters und von unterschiedlichen hier vorliegenden Szenarien für Personendaten impraktikabel. Im Gegenteil, bei TrustCentern muß eine hohe Flexibilität bei der zugehörigen Datenbankapplikation vorhanden sein. 4.5.3 Einrichten von Datenbanken und logischen Strukturen Wird ein TrustCenter bzw. ein TrustCenter-Produkt an einer bestimmten Stelle eingerichtet, schließt dies das Installieren eines zuvor ausgewählten Datenbanksystems ein, z.B. für das Speichern von Personendaten etc. – 70 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Des weiteren müssen die logischen Strukturen bzw. Tabellen der TrustCenter-Datenbank erstellt werden. Dazu gibt es z.B. folgende Möglichkeiten und zwar mittels: • Direkte Eingabe am Datenbanksystem, • Eingabe über Datenbank-Tools, • SQL. Datenbanksysteme bieten die Möglichkeit, Tabellen über System-eigene Kommandos zu definieren, wie z.B. MySQL. Es existieren natürlich auch viele graphische sowie System-fremde Datenbank-Werkzeuge, welche dies ermöglichen. Da alle gängigen Datenbanksysteme SQL unterstützen, lassen sich Tabellen auch über SQL-Anweisungen (siehe Abschnitt 3.5.2) erstellen: Zum einen über deren direkte Eingabe mit Hilfe eines passenden Werkzeugs und zum anderen über z.B. ein Java-Programm. Letzteres ist natürlich für FlexiTrust interessant. Dabei läßt sich der SQL-Code in Java einbetten oder über eine einfache Text-Datei einlesen. Im zweiten Fall wäre keine Neukompilation des entsprechenden Programms notwendig. Bei einer Datenbank-Lösung wie dynamischen Strukturen (siehe Abschnitt 4.8.3) würden zusätzlich stets nur dieselben Tabellen erstellt, womit also eine automatische Einrichtung von Datenbanksystem und Datenbank-Struktur möglich ist. Die manuelle Festlegung der eigentlichen Tabellen erfolgt bei dynamischen Strukturen dann über Dateneingaben. 4.5.4 Ziele der Persistierung allgemein und in einem TrustCenter Die im Folgenden definierten sowie beschriebenen Ziele dienen auch als Bewertungskriterien und werden daher bei der Bewertung von Persistierungslösungen in deren jeweiligen Abschnitten und schließlich in Abschnitt 4.9 zugrundegelegt. Bewertet wird die Persistierungslösung – im Hinblick auf die Erreichung der Ziele – dabei nicht nur im Allgemeinen sondern auch im Kontext einer TrustCenter-Applikation. Persistierung hat zum einen das Ziel, Daten dauerhaft aufzubewahren. Andererseits reicht es natürlich nicht, Daten irgendwo zu speichern, da man diese auch wiederfinden können muß. D.h., ein weiteres und gleichrangiges Ziel der Persistierung ist das einfache Wiederfinden und Wiederherstellen von Daten oder Datenbankobjekten. Ein solcher Vorgang ist stets mit einer Art von Datensuche unter bestimmten Kriterien verbunden, die im Idealfall eindeutig sind, etwa der Distinguished Name im Kontext eines Registrierungsdatensatzes eines TrustCenters. Weitere Ziele der Persistierung im Allgemeinen bzw. bei einer Datenbankapplikation werden im Folgenden beschrieben, wobei sich diese oftmals stark überschneiden.38 • Automatisierung der Persistierung: Das Entwickeln von Datenmodellen ist unumgänglich. Der Entwicklungsaufwand bei diesem Vorgang soll jedoch minimiert werden (siehe vor allem Abschnitt 4.5.2). Beispielsweise muß der Entwickler nur auf Codeentwicklungsseite tätig werden, wenn es die Persistierungsmethode erlaubt, logische Strukturen in einer Datenbank aufgrund des Inhalts einer Java-Klasse, welche das entwickelte Datenmodell beinhaltet, automatisch zu erstellen. 38 Die aufgezeigten Ziele sind bei FlexiTrust bzw. bei der Persistierung von Personendaten und Entities innerhalb der OpenRA zum großen Teil noch nicht erfüllt. – 71 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER • Weitestgehend automatisches Zusammenspiel zwischen Datenbankobjekten und Repräsentationsschichten: Die Java-Repräsentationsschichten für Datenbankobjekte, wie Personendaten, sind bei FlexiTrust (siehe z.B. Klasse Student.java“ in Abschnitt 4.4.1) zwar ” ähnlich aufgebaut, aber für jedes Anwendungsszenario individuell nachbearbeitet. Dazu ist auch eine Nachpflege und Neukompilation des Quellcodes aller Teile der Datenbankapplikation vonnöten. Dies ist ein typisches Problem. Es ist wünschenswert, daß solche Vorgänge soweit wie möglich automatisiert vonstatten gehen und vereinfacht werden. Idealzustände für die Entwicklung von Datenbankapplikationen sind hierbei: – Kein Schreiben neuer Klassen oder Ändern vorhandenen Quellcodes notwendig, – keine Neukompilation des Quellcodes notwendig, – feste logische Strukturen bzw. Tabellenstrukturen. Natürlich ist dieses Ideal schwer zu erreichen, da individuelle Anwendungsszenarien auch individuelle Datenmodelle, welche bei TrustCentern hauptsächlich auf Personendaten verschiedenster Art beschränkt sind, hervorrufen. • SQL-Code minimieren: Das Minimieren von notwendigen SQL-Anweisungen zum Datenbankzugriff erleichtert die Applikationsentwicklung. Gleiches gilt für die Minimierung der Anzahl der Stellen, bei welchen eine Anpassung von SQL-Anweisungen für ein spezielles Anwendungsszenario jeweils notwendig ist. • Flexibilität in der Wahl des Datenbanksystem-Produkts: Für manche Datenbankapplikationen ist es sinnvoll, keine speziellen Eigenheiten eines bestimmten Datenbanksystems in den Quellcode zu setzen. Damit bleibt man unabhängig in der Wahl des Datenbanksystem-Produkts, z.B. auch hinsichtlich eines Wechsels ggü. vorangegangener Umsetzungen. Die Applikation ist damit nicht an ein bestimmtes Produkt gebunden oder auf ein bestimmtes Produkt beschränkt, sondern richtet sich ausschließlich nach Standards, welche von allen Produkten unterstützt werden, wie z.B. SQL (siehe auch Abschnitt 4.10.7). Allerdings ist dieses Vorgehen nicht für jede Datenbankapplikation erforderlich, da nicht immer ein derartiges Maß an Flexibilität nötig ist, z.B. bei einer speziellen und festen Anwendung mit geringen Anteilen an Datenbankzugriffen, die ausschließlich auf MySQL aufbaut. • Kostengünstig und effizient. In einem TrustCenter hat die Persistierung und der Umgang mit Datenbanken zusätzlich folgende Ziele. • Flexibilität: Neben der Flexibilität beim Einsatz von Kryptosystemen muß ein TrustCenter seine Datenbankapplikation auf verschiedene Anwendungsszenarien, also auch verschiedene Datenmodelle, übertragen können, weil sich diese meist stark unterscheiden (siehe Abschnitt 4.1.1). Auch darf die Wahl eines zugrundeliegenden Datenbanksystems nicht beschränkt sein, da diese Wahl z.B. sehr vom Anwendungsszenario oder Kundenwunsch“ abhängt. Hierbei ” handelt es sich um einen speziellen Aspekt bei einem TrustCenter-Produkt, da dieses in unterschiedlichen Szenarien, z.B. bzgl. der zu erhebenden Registrierungsdaten, zum Einsatz kommt. So muß das TrustCenter sowohl für z.B. ein kleineres Unternehmen mit – 72 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER 50 Mitarbeitern wie auch für ein Großunternehmen mit 10000 Mitarbeitern geeignet sein. Wie schon in Abschnitt 3.7 erläutert, existieren dabei in beiden Fällen unterschiedliche Anforderungen an das zugrundeliegende Datenbanksystem für die TrustCenter-Applikation. So würde im ersten Falle sicher nicht Oracle als Wahl des Datenbanksystem-Produkts in Frage kommen aber im zweiten Fall (weitere Details siehe Abschnitt 4.10.7). • Nachvollziehbarkeit und u.U. Beweisbarkeit des korrekten Umgangs mit Daten: Gerade die Verknüpfung von Personendaten und Zertifikaten bzw. Signiervorgängen ist ein äußerst wichtiges Ziel in der PKI (siehe auch Abschnitt 4.10.1). • Korrekte Suchvorgänge innerhalb von PKIs: Der Suchvorgang, z.B. nach einem Zertifikat (siehe auch Abschnitt 2.7), in einer PKI muß stets unter sicherheitsrelevanten Aspekten erfolgen, da sonst PKI-Techniken umgangen werden können. Auch die bei einer Datenbankapplikation ständig erforderliche Suche nach Datenbankobjekten, wie Personendaten, muß solche Aspekte erfüllen und beispielsweise ein eindeutiges Ergebnis liefern. Effizienz Ein großes Ziel der Persistierung ist die Erreichung von Effizienz. Dabei bezieht sich Effizienz auf folgende Bereiche (siehe auch Abschnitt 3.7), welche leider oftmals sehr konträr sind: • Applikationsentwicklung, • Betrieb (z.B. Benutzbarkeit, Rechenleistung), • Wartung, • sonstige Anwendungen (z.B. Datenbank-Berichte/Reports). Der Aspekt der Effizienz läßt sich ausgiebig diskutieren, soll hier aber nur angerissen werden. Auch überträgt sich Effizienz natürlich auf den Bereich der Kosten, etwa der Entwicklungskosten. Im Bereich der Applikationsentwicklung wirkt Effizienz beispielsweise auf die Entwicklungszeit. So ist diese minimierbar, wenn der Entwickler einer Datenbankapplikation bei der Persistierung z.B. Tabellenstrukturen nur an einer Stelle angeben muß und nicht für Datenbank und Applikationsquellcode separat. Denn dadurch verringert sich die Fehleranfälligkeit und die Notwendigkeit zur manuellen Überprüfung. Aus Benutzersicht kann sich Effizienz beispielsweise durch Erleichterung von Benutzereingaben bemerkbar machen. Andererseits können sich derartige Vorgehensweisen, wie effizientere Applikationsentwicklung, negativ auf den Betrieb bzw. die Rechenleistung auswirken oder das Erstellen von Datenbank-Auszügen erschweren. Hier muß also stets eine Abwägung erfolgen. 4.6 Möglichkeiten zur Persistierung und Repräsentation Im Folgenden werden verschiedene Persistierungslösungen und Repräsentationsklassen vorgestellt. Es existieren hierfür etliche Systeme und Möglichkeiten, z.B. in Form von Datenbankmodellen und Java-Lösungen. Hier werden jedoch nur einige im Kontext eines TrustCenters bzw. von FlexiTrust (siehe u.a. Kapitel 2) bedeutsame Varianten vorgestellt und bewertet (siehe Abschnitt 4.9). Ebenfalls werden die unterschiedlichen Varianten anhand von Beispielen demonstriert. Die Beispiele sind teilweise stark vereinfacht, da viele Varianten vorgestellt werden, und beziehen sich daher auf die Persistierung von einfachen Personendaten, wie die Tabelle T Person“ in ” – 73 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 20. Doch natürlich sind sie auch auf ein Datenaufkommen wie aus Abbildung 18 oder auf mehrstufige Objekte anwendbar. Letzteres wird ebenfalls teilweise an einigen Varianten exemplarisch demonstriert. Die später gezeigten Beispiele bestehen ebenfalls aus Teilen von Java-Quellcodes und Klassen. Diese sollen nicht nur einen Eindruck vom jeweiligen System geben, sondern auch die Umsetzung des jeweiligen Systems verdeutlichen. Daher enthalten die Codes, welche teilweise auf das Wesentliche beschränkt sind, zum besseren Verständnis ebenfalls Kommentare. T Person PersID Name Vorname DienstNr 123456 Homann Frank 000001 123457 Schmidt Harald 000002 Abbildung 20: Einfache Personentabelle 4.6.1 Persistierungsmöglichkeiten im Überblick Es existieren natürlich viele Möglichkeiten, um innerhalb einer Datenbankapplikation Persistierung vorzunehmen. Im Falle von FlexiTrust hat man ebenfalls Objekt-basierte Java-Lösungen und nicht nur reine Datenbank-basierte Lösungen zur Auswahl. Geeignet für die Anwendung im TrustCenter FlexiTrust sind die folgenden: • Manuelle Persistierung mit reinem JDBC, • Serialization“, ” • JDO o.ä., • Datenzugriffe über Cursor, • Steuer- bzw. Hilfstabellen, • Dynamische Strukturen bzw. Tabellendefinitionen. Im Detail erläutert werden diese sodann in den Abschnitten 4.7 und 4.8. Man beachte, daß bei allen Lösungen stets JDBC für die Grundlagen einer Datenbankverbindung genutzt wird bzw. werden muß. Persistierung bei einer Datenbankapplikation bezieht sich nicht nur auf das Speichern von Daten oder Objekten in einer Datenbank sondern immer auch auf die Repräsentation von Datenbankobjekten innerhalb des Applikationscodes, nämlich in Form von Repräsentationsschichten oder Repräsentationsklassen. Auch hierzu existieren unterschiedliche Lösungen, welche in Abschnitt 4.6.2 beschrieben werden. Da diese jedoch eng mit der Persistierung zusammenhängen, werden einige von ihnen auch in den Abschnitten über die Persistierungsmöglichkeiten gezeigt. Des weiteren unterscheiden sich die später erläuterten Persistierungslösungen in ihrer jeweiligen Entwicklungssicht, also ob die Datenbankapplikation von Datenbankseite oder Codeentwicklungsseite aus beeinflußt wird (siehe auch Abschnitt 4.5.2). – 74 – 4 4.6.2 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Repräsentationsschichten für einstufige und mehrstufige Objekte In Abschnitt 4.5.1 wurde die Notwendigkeit zu Repräsentationsschichten bzw. Zugriffsschichten für Datenbankobjekte, z.B. Personendaten, innerhalb einer Datenbankapplikation wie einem TrustCenter erläutert. Solche Schichten bestehen aus einer oder mehreren Repräsentationsklassen, im Folgenden Java-Klassen, und können durchaus auch mehrstufig sein. Zur Realisierung solcher Klassen existieren mehrere Möglichkeiten, sinnvoll sind: • Allgemeine Repräsentationsklassen mit allgemeinen Datenbankoperationen, • spezielle Repräsentationsklassen ohne Datenbankoperationen, • spezielle Repräsentationsklassen mit allgemeinen Datenbankoperationen, • spezielle Repräsentationsklassen mit speziellen Datenbankoperationen. Der letzte Fall liegt z.Z. bei der FlexiTrust-OpenRA vor und wurde bereits in Abschnitt 4.4.1 in Form der Klassen Entity.java“ bzw. Student.java“ gezeigt. Ein Nachteil dieser Möglichkeit ist ” ” offensichtlich, nämlich die notwendige Neukompilation des Quellcodes nach der individuellen Gestaltung entsprechender Klassen für ein Anwendungsszenario, z.B. der Angabe von speziellen Attributen und Attributsnamen. Eine Neukompilation ist hingegen bei allgemeinen Repräsentationsklassen nicht notwendig, sofern Datenbankoperationen von Datenbankseite aus konfiguriert werden können. Dies hängt von der jeweiligen Persistierungsweise ab. Eine spezielle Repräsentationsklasse ohne Datenbankoperationen bedeutet, daß die Datenbankapplikation ausschließlich von der Codeentwicklungsseite aus gestaltet werden kann (siehe z.B. Abschnitt 4.7.3 über JDO), was jedoch wiederum stets Neukompilationen nach sich zieht. Folglich läßt sich sagen, daß alle Arten von Repräsentationsklassen bzw. derartigen Klassenstrukturen eine Objektrepräsentation darstellen. Es existiert also stets eine solche JavaObjektinstanz innerhalb einer Datenbankapplikation, wenn auf ein Datenbankobjekt zugegriffen werden soll, wobei die Repräsentationsklasse ebenfalls die Datenmanipulation zuläßt und verwaltet. Die Persistierung von geänderten Daten geschieht mittels Datenbankoperationen, die in der Repräsentationsklasse enthalten oder separat implementiert sein können. Im letzten Falle wird die Instanz der Repräsentationsklasse an die separate Implementierung übergeben. Das folgende Beispiel zeigt einen Auszug aus einer speziellen Java-Repräsentationsklasse ohne Datenbankoperationen. Das Beispiel bezieht sich dabei auf die Tabelle aus Abbildung 20: public class PersonOnly{ private String name; private String vorname; private String dienstNr; private int persID; // klassischer Konstruktor public PersonOnly(String name, String vorname, String dienstNr, int persID){ this.name=name; this.vorname=vorname; this.dienstNr=dienstNr; this.persID=persID; } – 75 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER public PersonOnly(){} // klassische Setter-Methoden public void setName(String name){ this.name=name; } // usw. // klassische Getter-Methoden public int getPersID(){ return persID; } // usw. // z.B. für Tests public void print(){ System.out.println(name + ", " + vorname + ", " + dienstNr + ", " + persID); } } Hierbei sind klassische Set- und Get-Methoden, Setter und Getter, zu sehen. Diese bieten anderen Klassen und Applikationen die Möglichkeit, auf einzelne Attribute zu zugreifen und diese auch zu verändern. Ein Vorteil der expliziten Modellierung von Attributen, dies beinhaltet etwa die Angabe von speziellen Attributnamen, unter Java ist, daß man mittels Javadoc detaillierte Erläuterungen zu den Attributen und z.B. ihren Settern im Quellcode angeben kann, woraus sich automatisch Hilfen in HTML-Form erzeugen lassen. Daß dies bei der Eingabe von z.B. Personendaten in einem bestimmten Kontext notwendig ist, ist natürlich nicht allgemeingültig. Der Vorteil der folgenden allgemeinen Variante von Klassen-Konstruktoren, Settern und Gettern, welche gleichermaßen zu allgemeinen Varianten von Datenbankoperationen ausgebaut werden können, ist, daß andere Klassen zum Zugriff auf die Repräsentationsklasse Attribute nicht explizit im Quellcode angeben müssen, sondern dies z.B. auf Konfigurationsdateien ausgelagert werden kann. Ein Nachteil der allgemeinen Variante, also dem nicht expliziten Modellieren von Attributen, gegenüber der klassischen ist, daß Javadoc nicht mehr direkt anwendbar ist: // allgemeiner Konstruktor public PersonOnly(String[] Attributs, String[] AttributeValues){ for (int i=0;i<Attributs.length;i++){ if (Attributs[i].equals("Name")){ name=AttributeValues[i]; } if (Attributs[i].equals("Vorname")){ vorname=AttributeValues[i]; } if (Attributs[i].equals("DienstNr")){ dienstNr=AttributeValues[i]; } if (Attributs[i].equals("PersID")){ persID=Integer.parseInt(AttributeValues[i]); } } // usw.; Datentypen müssen natürlich beachtet werden. // Dazu ist auch evt. eine separate Klasse denkbar, welche z.B. // die Konvertierung von SQL nach Java vornimmt (mit Meta-Daten – 76 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER // und der Hilfe des Interfaces java.sql.ResultSetMetaData). } // allgemeine Setter public void setAttributs(String[] Attributs, String[] AttributeValues){ for (int i=0;i<Attributs.length;i++){ if (Attributs[i].equals("Name")){ name=AttributeValues[i]; } if (Attributs[i].equals("Vorname")){ vorname=AttributeValues[i]; } if (Attributs[i].equals("DienstNr")){ dienstNr=AttributeValues[i]; } if (Attributs[i].equals("PersID")){ persID=Integer.parseInt(AttributeValues[i]); } } } public void setAttribute(String AttributeName, String AttributeValue){ if (AttributeName.equals("Name")){ name=AttributeValue; } if (AttributeName.equals("Vorname")){ vorname=AttributeValue; } if (AttributeName.equals("DienstNr")){ dienstNr=AttributeValue; } if (AttributeName.equals("PersID")){ persID=Integer.parseInt(AttributeValue); } } // usw. Die Modellierung von Attributen geschieht hier also über ein String-Array, wobei auch eine noch allgemeinere Variante mittels Object[] AttributeValues möglich ist. Attribute nicht explizit zu modellieren bedeutet, daß Informationen wie Attributnamen oder Datentypen der Repräsentationsklasse anderweitig mitgeteilt werden müssen, etwa über Steuertabellen. Gerade bei den Datentypen geht jedoch die Typsicherheit der Attribute verloren, die man bei expliziter Modellierung besitzt, z.B. durch die explizite Angabe des Datentyps Integer für ein bestimmtes Attribut. Bei der Umwandlung von SQL-Datentypen auf der Datenbankseite zu Java-Datentypen auf der Codeentwicklungsseite müssen jedoch stets verschiedene Probleme beachtet werden, wie z.B. die Umwandlung eines String-Werts beliebiger Länge unter Java in einen String-Wert fester Länge der Datenbank. Das Thema Typsicherheit wird jedoch im Folgenden nicht weiter betrachtet und bleibt wie im obigen Beispiel nur angedeutet. Basierend auf dieser Art der Modellierung von Attributen, zeigt das nachfolgende Beispiel eine allgemeine Repräsentationsklasse mit allgemeinen Datenbankoperationen, wobei hier nur die Lese- oder Lade-Operation implementiert ist. Auch hier werden nur allgemeine Setter- und Getter-Varianten verwendet. Das Instanzieren einer bestimmten Klasse von Datenbankobjekten geschieht dabei über einen entsprechenden zusätzlichen Parameter, hier der String Entity“: ” – 77 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER import java.sql.*; public class Entities{ private Connection con; private Statement stm; private String url = "jdbc:odbc:MyTestDB"; private ResultSet rs; private String EntityName; private String[] Attributs=new String[0]; private String[] AttributeValues=new String[0]; // Konstruktor; auch ein Einzel-Konstruktor ist denkbar public Entities(String Entity, String[] Attributs, String[] AttributeValues){ System.arraycopy(Attributs,0,this.Attributs, 0,Attributs.length); System.arraycopy(AttributeValues,0,this.AttributeValues, 0,AttributeValues.length); // Alle Datentypen werden zunächst als Strings behandelt. // Über ResultSetMetaData.getColumnType(...) bekommt man // den SQL-Datentyp wieder. Binary-Typen müßten separat // behandelt werden. } public Entities(){}; // Setter public void setAttributs(String[] Attributs, String[] AttributeValues){ System.arraycopy(Attributs,0,this.Attributs, 0,Attributs.length); System.arraycopy(AttributeValues,0,this.AttributeValues, 0,AttributeValues.length); } // Einzel-Setter public void setAttribute(String AttributName, String AttributeValue){ int i; for (i=0;i<Attributs.length;i++){ if (Attributs[i].equals(AttributName)){ break; } } AttributeValues[i]=AttributeValue; } // Getter public String[] getAttributNames(){ return Attributs; } // Getter public String[] getAttributValues(){ return AttributeValues; } // Einzel-Getter – 78 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER public String getAttribute(String AttributName){ int i; for (i=0;i<Attributs.length;i++){ if (Attributs[i].equals(AttributName)){ break; } } return AttributeValues[i]; } // Aus DB laden public void loadEntity(String Entity, String[] Attributs, String[] AttributeValues){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(ClassNotFoundException e){}; try{ con = DriverManager.getConnection(url); stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stm.executeQuery("Select * FROM T_" + Entity + " WHERE " + Attributs[0] + "=’" + AttributeValues[0] + "’;"); // nur beispielhaft; Eigentlich müßte hier der vollständige // SQL-String über eine Schleife, aber automatisch, // konstruiert werden. ResultSetMetaData rsmd = rs.getMetaData(); rs.first(); String tmpAttributs[]= new String[rsmd.getColumnCount()]; String tmpAttributeValues[]= new String[rsmd.getColumnCount()]; int i; for (i=0;i<rsmd.getColumnCount();i++){ tmpAttributs[i]=rsmd.getColumnName(i+1); // Hiermit erhält man die Attributsnamen der Entity. } for (i=0;i<tmpAttributs.length;i++){ tmpAttributeValues[i]=rs.getString(tmpAttributs[i]); // Hiermit erhält man die Attributswerte der Entity. } stm.close(); this.Attributs=tmpAttributs; this.AttributeValues=tmpAttributeValues; }catch(SQLException e){System.out.println(e);}; } // In DB ablegen public void storeEntity(){ // ähnlich loadEntity; // z.B. über SQL od. Update-Methoden von ResultSet } // z.B. für Tests public void print(){ int i; for (i=0;i<Attributs.length;i++){ System.out.println(Attributs[i] + ": " + AttributeValues[i]); } – 79 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER } } Es wird hier deutlich, daß man beim Aufrufen einer Methode wie loadEntity nicht nur wissen muß, welche Klasse von Datenbankobjekten gewünscht wird bzw. vorhanden ist sondern auch welche Attribute vorhanden sind. Realisierungsmöglichkeiten zum automatischen Auslesen dieser Informationen bzw. Daten werden in den Abschnitten 4.7.1 und 4.8 vorgestellt. Des weiteren ist für das Aufrufen von loadEntity usw. eine Fehlerbehandlung einzuführen und zu entwickeln. Denn das Auftreten einiger Fehlerfälle ist durchaus möglich, wie z.B. die Angabe von: • fehlerhaften Attributnamen, • nicht eindeutigen Suchkriterien (wodurch z.B. mehrere Datensätze gefunden werden), • einer nicht ausreichenden Anzahl an Attributen für das Speichern. Hier ist also die Entwicklung und das Einbinden weiterer Klassen für die Fehlerbehandlung nötig aber auch möglich.39 Natürlich ist es möglich, den Code für die Datenbankverbindung auszulagern. Auch wird der Tabellenname im Beispiel vom Entity-Namen abgeleitet, könnte jedoch ebenfalls z.B. in einer Konfigurationsdatei oder Hilfstabelle (siehe Abschnitt 4.8.2) gespeichert werden. Die Voraussetzung für dieses Beispiel ist also das Vorhandensein einer speziellen Tabelle, wie z.B. T Person“ aus Abbildung 20. ” Wie man im Beispiel erkennen kann, wird der Java-Cursor ResultSet und die zugehörigen Meta-Daten, wie z.B. Attributsnamen einer Tabelle, zum Lese- und Schreib-Zugriff auf die Daten verwendet. Dabei kann der Zugriff auf Attribute über einen Index bzw. Zählwert oder über den Attributsnamen geschehen. Im letzten Falle wird dieser dann einfach als String-Wert übergeben.40 So wird es ermöglicht, auf Attributsnamen dynamisch zu zugreifen und diese somit für den Quellcode konfigurierbar zu machen. Alternativ läßt sich die Datenmanipulation auch sinnvoll über SQL betreiben (siehe auch Abschnitt 4.3.1). Mehrstufige Objekte bzw. Klassen entstehen in der Objektorientierung durch Vererbung und sind dort selbstverständlich. Diese lassen sich ebenfalls in einer Datenbank abbilden und entstehen durch die Verknüpfung entsprechender Tabellen bzw. deren Beziehung (siehe auch Abschnitt 3.4.3). Im folgenden Beispiel wird aus der bereits gezeigten Klasse PersonOnly.java“ eine Klasse ” ChefFromPersonOnly.java“ abgeleitet. Objektorientierung und Vererbung sind wohlbekannt ” (siehe z.B. [Ull00]), daher wird an dieser Stelle auf eine nähere Erläuterung dieser Prinzipien verzichtet und das für den Kontext wesentliche hervorgehoben: import PersonOnly; public class ChefFromPersonOnly extends PersonOnly{ private String DienstwagenNr; private String ChefsesselNr; private String AddrStr; private String AddrOrt; 39 Das Interface ResultSetMetaData bietet beispielsweise die Möglichkeit mittels der Methode isNullable optionale Attribute logischer Strukturen abzufragen. Ein andere Möglichkeit wäre es mit Hilfe von Steuertabellen manuell festzulegen, z.B. auch für den speziellen Anwendungskontext, welche Attribute angegeben werden müssen und welche nicht. 40 Dies ist eine übliche Entwicklungsstrategie und wird auch bei anderen Cursor-System verwendet, z.B. Microsoft ADO. – 80 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER // Simpler Konstruktor public ChefFromPersonOnly(String name, String vorname, String dienstNr, int persID){ super(name, vorname, dienstNr, persID); } // Setter-Beispiel public void setChef(String DienstwagenNr, String ChefsesselNr, String AddrStr, String AddrOrt){ this.DienstwagenNr=DienstwagenNr; this.ChefsesselNr=ChefsesselNr; this.AddrStr=AddrStr; this.AddrOrt=AddrOrt; } // z.B. für Tests (gibt nur die Chef-relevanten Attribute aus) public void printChef(){ System.out.println(DienstwagenNr + ", " + ChefsesselNr + ", " + AddrStr + ", " + AddrOrt); } // Alternativ könnte man z.B. alle Methoden und Attribute der // Ursprungsklasse überschreiben. } Ob die Verteilung von Attributen in diesem Beispiel sinnvoll ist, sei dahingestellt. Zu beachten ist, daß hier ChefFromPersonOnly“ alle Attribute und Methoden der übergeordneten Klasse ” PersonOnly“ erbt und somit ebenfalls besitzt. Auch ist es denkbar, daß weitere Klassen direkt ” von PersonOnly“ oder von bereits abgeleiteten Klassen erneut abgeleitet werden, dabei spricht ” man von Spezialisierung. Nun muß auch bei solchen abgeleiteten Repräsentationsklassen, eine Umwandlung von Codeobjekt in ein Datenbankobjekt erfolgen. Eine übliche Methode der Persistierung einer Objekt-Instanz, von ChefFromPersonOnly“ beispielsweise, mit allen konkreten Attributwer” ten auch seiner Oberklasse, hier PersonOnly“, erfolgt dazu über Beziehungen bzw. Fremd” schlüssel-Beziehungen (siehe auch Abschnitt 3.4.3), wobei für die Repräsentationsklassen jeweils eine Tabelle vorgesehen ist. D.h., in der zugehörigen Datenbank können zwei Tabellen existieren, nämlich die Basistabelle T Person“ und T Chef“, wobei dann für jeden Daten” ” satz in T Chef“ stets auch ein zugehöriger Datensatz in T Person“ existieren muß, um die ” ” referentielle Integrität zu gewährleisten (siehe auch 4.10.8). Die zu den beiden Repräsentationsklassen implementierten Datenbankoperationen für das Laden und Speichern eines Datenbankobjekts sowie dessen Umwandlung in ein Codeobjekt und umgekehrt, verwalten die Verknüpfung der Tabellen. Diese erfolgt durch die Angabe des Fremdschlüssels und des passenden Tabellennamens, was bei mehreren abgeleiteten Klassen meist unumgänglich ist, in T Chef“. Der Fremdschlüssel ist gleichzeitig Primärschlüssel in ” T Person“, womit eine eindeutige Zuordnung zwischen den Tabellen möglich wird. Solche ” Beziehungen zwischen Tabellen sind bei der Entwicklung von Datenbanken üblich, wobei die Datenbank in einer solchen Beziehung keine Vererbung sieht. Das obige Beispiel ist nur eine andere und vereinfachte Form der Variante, wie sie schon in Abschnitt 4.4.1 bei der OpenRA gezeigt wurde. Dort wurde aus der allgemeinen Enti” ty.java“, die nur mit in einem TrustCenter notwendigen Attributen und Methoden, z.B. für Distinguished Names, ausgestattet ist, die Klasse Student.java“ abgeleitet, welche wiederum ” etwa das Attribut Matrikelnummer“ enthält. Das Besondere hierbei ist, daß in der Enti” ” ty.java“ bereits ein Attribut vorgesehen ist, welches über einen String-Wert den eindeutigen – 81 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Bezeichner, nämlich hier als Package-Identifikation, der abgeleiteten Entity-Klasse speichert. Dies ist z.B. dann hilfreich, wenn eine Auflistung von Daten aller Entity-Klassen erfolgen muß. Denn auf diese Weise ist es möglich, nur aufgrund des Wertes dieses Attributs, welches alle Entities besitzen, die Zuordnung der Daten zu einer bestimmten Entity-Klasse bzw. zu einem bestimmten Entity-Typ zu vollziehen. Entity.java“, Student.java“ und andere Klassen wurden bei FlexiTrust im Anwendungs” ” szenario der Universität eingesetzt (siehe Abschnitt 4.2.1). Das Persistieren dieser Klassen erfolgt auch hier zunächst über die Basistabelle, z.B. T Entity“, in welcher alle zugehöri” gen Attribute der allgemeinen Klasse gespeichert werden. Andere Tabellen, z.B. T Student“, ” speichern hingegen die Attribute der speziellen bzw. abgeleiteten Klassen. Die Verknüpfung beider Tabellen erfolgt durch einen Fremdschlüsseleintrag in z.B. T Student“, wobei auch ” der Name der Oberklasse bzw. Basistabelle, hier T Entity“, angegeben sein muß. Über diese ” Verknüpfung erhält man dann vollständig die Attribute und Daten des Typs Student“. Von ” der Codeentwicklungsseite aus stammen alle Datenbankobjekte von der Klasse Entity.java“ ” ab. Für das hier entwickelte TrustCenter-Modell werden also mehrstufige Objekte verwendet, was auch bereits im Datenmodell aus Abbildung 17 von Seite 53 zu sehen ist (siehe auch Abschnitt 4.1). Ihr Vorteil ist die Spezialisierung von notwendigen Daten für eine bestimmte Entity, z.B. Chef“, sowie die Nutzung von und der Zusammenhang zu vorhandenen Entities, ” z.B. Person“. ” Eine alternatives Modell dazu ist in Abbildung 18 auf Seite 56 angedeutet. Alle Entities werden zu einer zusammengefaßt und auch in einer einzigen gemeinsamen Relation mit allen zugehörigen Attributen festgehalten. Die hier fehlende Verteilung von Daten hat zum Nachteil, daß keine speziellen Entity-Klassen auf Datenbankebene existieren, sondern Entities nur durch die jeweiligen Daten charakterisiert sind, und viele Attribute für jeweilige Entities schlichtweg ungenutzt bleiben. Die unterschiedlichen, hier gezeigten Repräsentationsschichten unterscheiden sich stark in der Art und Notwendigkeit zur Nutzung von SQL-Queries für Datenbankoperationen. Dies ist unproblematisch, wenn SQL-Queries einmalig entwickelt werden müssen, z.B. für eine sich später nicht mehr ändernde allgemeine Repräsentationsklasse. Bei speziellen Repräsentationsklassen mit Datenbankoperationen hingegen, kann eine ständige Änderung der SQL-Queries im Kontext einer TrustCenter-Entwicklung nötig sein. Dies wirkt sich auf die Zeit und Fehleranfälligkeit der Entwicklung aus. Weitere Details zu Repräsentationsschichten inkl. notwendiger Datenbankoperationen werden in den Abschnitten 4.7 und 4.8 erläutert. Eine Methode etwa, die gänzlich ohne Klassenattribute auskommt und auf dem Java-Cursor ResultSet basiert, findet sich in Abschnitt 4.8.1. 4.7 Objekt-basierte Java-Lösungen Neben der objektorientierten Programmierung existieren seit einiger Zeit auch objektorientierte Datenbanksysteme. Diese haben zum Ziel, z.B. die Erstellung von Tabellen auch auf Basis von Prinzipien der Objektorientierung, wie Vererbung, integriert durchzuführen und nicht etwa manuell wie in Abschnitt 4.6.2 gezeigt. Auch hierfür gibt es Konzepte und Standards, wie z.B. spezielle DBMSs, sowie Datenbanksysteme, die diese unterstützen. Da es sich jedoch um eine im Vergleich zu relationalen Datenbanken jüngere Entwicklung handelt, sind objektorientierte Datenbanksysteme noch nicht weitverbreitet, wenngleich es sich auch hierbei um ein gutes Prinzip zur Realisierung einer Datenbank handelt (siehe z.B. [Heu00]). – 82 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Da also einfache relationale Datenbanken z.Z. wesentlich verbreiteter sind, soll sich der Entwickler einer Datenbankapplikation zur Persistierung von Daten auf diese beschränken. Objekt-basierte Persistierungsmöglichkeiten, also Werkzeuge für das Objekt-RelationaleMapping, haben zum Ziel, einem Applikationsentwickler sämtliche Datenbankoperationen abzunehmen, so daß dieser rein objektorientiert entwickeln kann. Das bedeutet, daß der Entwickler etwa von SQL-Anweisungen vollständig entbunden wird. Werkzeuge für das Objekt-Relationale-Mapping sind größtenteils Persistenz-Frameworks. Ein Persistenz-Framework bildet dabei nach oben geschilderten Grundlagen Objekte der entsprechenden objektorientierten Programmiersprache automatisch in Tabellen der der Applikation zugrundeliegenden Datenbank ab. Dies ist beim manuellen Mapping, wie z.B. in den Abschnitten 4.4.1 und 4.6.2 gezeigt, nicht der Fall, wo Datenbankoperationen zum Laden und Schreiben manuell erstellt wurden. Persistenz-Frameworks hingegen können ebenfalls mit abgeleiteten Klassen bzw. mehrstufigen Objekten umgehen, eine manuelle Verwaltung dieser, z.B. durch Tabellen-Beziehungen, ist nicht nötig (siehe auch Abschnitt 4.6.2). In Java existieren für die Persistierung von Objekten viele Möglichkeiten, welche im Folgenden auch diskutiert werden. Das geeignetste Persistenz-Framework unter Java ist JDO. Hierbei handelt es sich um eine junge, vielseitige und prominente Interface-Struktur, welche im Mai 2001 von vielen Entwicklergruppen erstellt und später standardisiert wurde, u.a. von Sun, IBM und Apple. David Jordan, ein Mitentwickler der Java Data Objects (JDO), faßt das Entwickeln einer Datenbankapplikation unter Java ohne automatisches Objekt-Relationales-Mapping wie folgt noch einmal zusammen: An application is forced to deal with two very different data models: The Java ” Object Model and the Relational Data Model.“ Neben JDO existieren auch andere Werkzeuge bzw. Frameworks für das Objekt-RelationaleMapping, wenngleich sie nicht die vorliegende Standardisierung und Einfachheit von JDO bieten können: • ObjectStore PSE, • JPOM (API mit automatischer Erzeugung von SQL-Anfragen, entstanden aus einem Universitätsprojekt; siehe auch [Jav04]), • DbGen von 2LINK, • TopLink (renommierte Mapping-Produkte angefangen bei Smalltalk und auch für Java), • SimpleORM, • Quasar Persistence (OpenSource, leider mit radikaler Klassenänderung verbunden; siehe z.B. [Ern04] oder sourceforge.net). Bis auf letzteres System handelt es sich hier um kommerzielle Produkte und natürlich ist man bei entsprechender Nutzung auf dieses spezielle System beschränkt sowie davon abhängig. Die Grundlage aller Systeme für die reine Datenbankverbindung ist hier meist JDBC, wie z.B. auch im Falle von JDO. – 83 – 4 4.7.1 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Manuelle Persistierung mit reinem JDBC In Abschnitt 4.3.1 wurde gezeigt, wie man unter Java eine Datenbankverbindung aufbaut und Datenbankoperationen ausgeführt werden können. Das Ausführen von SQL-Queries und das Erzeugen eines Cursor-Objekts wurde dort ebenfalls demonstriert. Alle diese Systeme macht man sich nun bei der manuellen Persistierung mit reinem JDBC zunutze, um eine individuelle manuelle Mapping-Methode zu entwickeln. D.h., man erstellt ein eigenes System zum Objekt-Relationalen-Mapping, mit welchem man eine Repräsentationsklasse auf eine relationale Datenbank abbilden kann. Dies liegt z.B. bei der OpenRA vor und wurde bereits u.a. in Abschnitt 4.4.1 gezeigt. Beim manuellen Persistieren bzw. Mapping von Objekten übernimmt der Entwickler folgende Tätigkeiten: • Manuelle Codierung der Transformation eines Codeobjekts in ein Datenbankobjekt bzw. in das Datenmodell, • Manuelle Codierung der umgekehrten Transformation eines Datenbankobjekts zu einer Instanz einer Codeklasse, • Entwickeln von SQL-Queries und/oder Cursor-Operationen für Einfügen, Ändern und Laden, • Behandeln bereits geladener oder noch nicht geladener Datenbankobjekte. Letzteres ist eigentlich stets und bei jeder Persistierungsmöglichkeit erforderlich. Dazu gehört vor allem eine Konzeptentwicklung für den jeweiligen Anwendungskontext. Manuelles Mapping wurde bereits z.B. im Abschnitt 4.6.2 gezeigt und ist bei der Klasse Entities.java“ etwa anhand der Methode loadEntity zu sehen. Dort wird die Transformation ” eines Datenbankobjektes in die Form einer Java-Klasse bzw. Repräsentationsklasse vollzogen. Dies geschieht durch das Auslesen der entsprechenden Tabellenattribute und das Setzen der lokalen Variablen der Java-Klassen. D.h., bei dieser Realisierungsweise werden die notwendigen Mapping-Methoden, also Datenbankoperationen etwa für Laden und Speichern eines Objekts, eigenständig und individuell entwickelt. Nach dieser Entwicklung ist allerdings ein automatisches Persistieren von Objekten im Anwendungskontext möglich. Eine solche individuelle Mapping-Entwicklung hat zwar den Nachteil des Entwicklungsaufwands, aber natürlich gleichermaßen den Vorteil, daß eine Anpassung für jegliche Anwendungsszenarien möglich ist. Diese Variante ist also äußerst flexibel. Bei der OpenRA liegt dieser Fall ebenfalls vor, wobei hier spezielle Repräsentationsklassen verwendet werden, die entsprechende Datenbankoperationen bzw. Mapping-Methoden enthalten. Des weiteren müssen bei der OpenRA immer beide Entwicklungsseiten, nämlich die Seite der Codeentwicklung und der Datenbankentwicklung, in Anspruch genommen werden. Dies bedeutet, daß neben der speziellen Repräsentationsklasse für ein Anwendungsszenario auch die Datenbankstruktur entwickelt werden muß. Letztere besteht also stets aus individuellen Tabellendefinitionen, welche im Quellcode direkt angesprochen werden, wobei hier auch StandardMuster für SQL-Anweisungen verwendet werden, um den Entwicklungsaufwand zu minimieren. Jedoch ist es ebenfalls möglich, manuelles Mapping mit allgemeinen Repräsentationsklassen zu betreiben, z.B. mit einer Klasse wie der Entities.java“. Dies würde bedeuten, fast ” ausschließlich von Datenbankseite aus entwickeln zu können. Dazu ist es allerdings notwendig, der allgemeinen Repräsentationsklasse sowie anderen Applikationsteilen zum Zugriff auf bestimmte Datenbankobjekte deren Struktur mitzuteilen, so daß der Typ der gewünschten – 84 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Datenbankobjekte einfach instanziert werden kann, z.B. über einen Parameter. So wäre eine Änderung von SQL-Anweisungen ebenfalls nicht notwendig sondern lediglich eine Erstentwicklung. Lösungen, welche es für das manuelle Mapping mit allgemeinen Repräsentationsklassen erlauben, Tabellenstrukturen automatisiert auszulesen, sind z.B. Steuertabellen oder dynamische Strukturen (siehe auch Abschnitte 4.8.2 und 4.8.3). Bei mehrstufigen Objekten muß für eine allgemeine Repräsentationsklasse (siehe Abschnitt 4.6.2) in einer reinen JDBC-Lösung mit individuellen Tabellen eine Steuertabelle eingeführt werden, die der Repräsentationsschicht die Beziehung der verschiedenen Entities bzw. Datenbankobjekte mitteilt. Eine solche Steuertabelle ist T Relation(FromTab,FromAttr,ToTab,To” Attr)“, sie macht es möglich, daß in einer Repräsentationsklasse alle Attribute eines mehrstufigen Objekts automatisch eingefügt werden können. Die allgemeine Repräsentationsklasse erhält dazu z.B. im Konstruktor, wie schon gezeigt, einen zusätzlichen Parameter, welcher die gewünschte Klasse von Datenbankobjekten angibt. Auch der Umgang mit mehr als einer Stufe ist hier möglich sowie durch zusätzliche Erweiterungen mit 1:n“-Beziehungen, welche aber ” zwischen Entity-Objekten in der Regel nicht auftreten. Abbildung 21 zeigt beispielhaft, wie sich die Tabelle T Relation“ an entsprechender Stelle ” im ursprünglichen TrustCenter-Datenmodell aus Abbildung 17 einfügt. Abbildung 21: Tabelle T Relation im TrustCenter-Datenmodell Für den Join (siehe auch Abschnitt 3.5.1) bzw. das Zusammensetzen eines mehrstufigen Objekts, z.B. eines vollständigen Datenbankobjekts Chef“ (siehe auch Abschnitt 4.6.2), wird ” nun die Tabelle T Relation“ herangezogen, welche einen Datensatz enthält, der die Ver” knüpfung der Tabellen T Person“ und T Chef“ darstellt. Sei z.B. das Attribut PersonID“ ” ” ” der Fremdschlüssel in T Chef“ bzgl. T Person“ und das Attribut ID“ der Primärschlüssel ” ” ” in T Person“. Dann lautet der entsprechende Datensatz in T Relation“, der die Fremd” ” schlüssel-Beziehung (siehe auch Abschnitt 3.4.3) zwischen den Tabellen leicht auslesbar macht, T Chef;PersonID;T Person;ID“. Bei gleicher Benennung der Attribute für die Schlüssel, würde ” sogar eine kürzere Tabellendefinition für T Relation“ ausreichen (siehe Abbildung 21). Auf ” diese Weise lassen sich alle Attribute und Attributswerte eines Datenbankobjekts Chef“ aus ” beiden Tabellen automatisiert bestimmen. Auch das Erzeugen einer Instanz einer allgemeinen Repräsentationsklasse für ein beliebiges mehrstufiges Objekt ist auf diese Weise also ohne Codeänderungen stets möglich. Der Nachteil dieser Variante im Vergleich zur direkten Implementierung von Tabellen-Beziehungen, also ohne T Relation“, ist, daß das Lesen eines zusätzlichen Datensatzes oder mehrerer, nämlich aus ” T Relation“, für das Auslesen eines jeden Datenbankobjekts notwendig wird. Dadurch ist die ” – 85 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Tabelle T Relation“ auch stark frequentiert. Beides wirkt sich natürlich je nach Anzahl der ” Datenbankzugriffe negativ auf die Rechenleistung der Datenbankapplikation aus. Des weiteren muß nach dem Festlegen der Datensätze in T Relation“ für ein bestimmtes Anwendungssze” nario eine zusätzliche Fehlerkontrolle erfolgen, z.B. bzgl. der Vollständigkeit der dargestellten Tabellen-Beziehungen usw. Bei der OpenRA werden hingegen spezielle Repräsentationsklassen genutzt. Das manuelle Mapping für mehrstufige Objekte in diesem Fall wurde jedoch bereits an zwei Beispielen in Abschnitt 4.6.2 erläutert. Vorteile • Das manuelle Mapping bedeutet zwar Entwicklungsaufwand, der bei der Erstentwicklung sicherlich am größten ist bzw. war, auf der anderen Seite ist die Variante äußerst flexibel und auch auf ungewöhnliche sowie sehr individuelle Anwendungsszenarien ist eine Anpassung möglich. • Diese Variante ist von keiner externen Entwicklung oder Systemlösung abhängig. • Das benutzte und entwickelte Datenmodell läßt sich direkt auf Tabellen abbilden, wodurch auch die abgelegten Daten und somit Informationen in der Datenbank sehr direkt erfaßbar und lesbar sind. • Durch den direkten Zugriff auf spezielle Tabellenstrukturen ist diese Variante effizient, was die Rechenleistung, Wartung sowie Erstellung von Datenbank-Berichten bzw. DatenbankAuszügen betrifft. Nachteile • Beim Nutzen spezieller Repräsentationsklassen liegt ein ständiger Entwicklungsaufwand für das Anpassen an individuelle Anwendungsszenarien vor, was notwendige Neukompilationen mit einschließt. Dies ist ein spezieller Nachteil im Kontext einer TrustCenterApplikation, welche in verschiedenen Anwendungsszenarien zum Einsatz kommen kann. Im Gegensatz dazu steht der Entwicklungsaufwand des manuellen Mappings bei einer Datenbankapplikation für einen einzigen bestimmten Anwendungsfall. Denn hierbei ist nur eine einmalige Entwicklung inklusive Tests und Fehlerkontrolle notwendig. Fehler können beim manuellen Mapping beispielsweise durch die vom Entwickler selbst vorzunehmende Umwandlung von Datentypen der Datenbank in Datentypen des Quellcodes vorkommen. Das Problem der Typsicherheit (siehe auch Abschnitt 4.6.2) besteht beim manuellen Mapping dabei unabhängig vom Typ der gewählten Repräsentationsklasse. • Je nach genutzter Repräsentationsform muß der Entwickler stets SQL-Anweisungen individuell anpassen, auch wenn ihm dazu Standard-Muster vorliegen. • Dadurch, daß keine Standard-Strukturen genutzt werden, liegen von der Codeentwicklungsseite ebenfalls keine offensichtlich nachvollziehbaren Strukturen und Systeme vor, was in TrustCentern problematisch sein kann. Denn auch die Korrektheit der Funktionalität der individuell entwickelten TrustCenter-Applikation muß gewährleistet und u.U. nachweisbar sein. – 86 – 4 4.7.2 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Serialization“ ” Serialization bzw. die Serialisierung eines Objekts ist eine unter Java gebräuchliche Vorgehensweise, um eine Objektinstanz als Ganzes zu behandeln. Dazu wird das Objekt in einen serialisierten Bytestrom, also einen Binärwert, umgewandelt. Dies ist die einfachste Art, um Objekte zu persistieren, da so Objekte direkt z.B. in Dateien gespeichert werden können. Auch wird diese Vorgehensweise bei der Java Remote Method Invocation (RMI) genutzt, um Objekte über ein Netzwerk zwischen Computern zu verschicken (siehe [Sun01]). In jedem Falle erlaubt Serialization die Nutzung von speziellen und allgemeinen Repräsentationsklassen, wobei Datenbankoperationen sinnvollerweise separat implementiert werden. Denn die Repräsentationsklasse ist es auch, welche als Objektinstanz durch Serialisierung persistiert wird. Unter Java muß diese Klasse dazu das Interface Serializable implementieren. Man beachte dabei, daß dieses Interface folgendes Aussehen hat: package java.io; public interface Serializable { } Es gehört so zum offiziellen JDK und dient sozusagen nur zur Kennzeichnung von Klassen bzw. Objekten, die serialisiert werden sollen. Primitive Datentypen lassen sich dabei einfach und direkt serialisieren und somit auch Objekte, die aus solchen bestehen. Andere Datentypen sind jedoch ebenfalls serialisierbar, was hier aber nicht näher erläutert wird (siehe z.B. [Ull00]). Das folgende Beispiel zeigt eine einfache Repräsentationsklasse für Personen, die serialisiert werden soll: import java.io.Serializable; public class PersonSerial implements Serializable{ private String name; private String address; // "transient" vor Variable verhindert // die Persistierung; // komplexere Datentypen ggf. durch // Sonderbehandlung persistierbar! public void setPerson(String myName, String myAddress){ name=myName; address=myAddress; } } Das folgende ausführbare Programm erzeugt nun ein entsprechendes Objekt und persistiert es auch gleich, als Beispiel in eine Datei: import PersonSerial; import java.io.*; public class testPersonSerial{ public static void main (String args[]){ System.out.println("Erzeuge Personen-Objekt..."); PersonSerial myPerson = new PersonSerial(); – 87 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER myPerson.setPerson("Dr. Huxtable", "Stickwood Avenue 10, Brooklyn - New York"); try{ FileOutputStream out = new FileOutputStream("testPersonSerial.txt"); try{ ObjectOutputStream os = new ObjectOutputStream(out); os.writeObject("HIERBINICH"); // nur als Kennzeichner für die Datei :-) os.writeObject(myPerson); os.flush(); os.close(); }catch(FileNotFoundException e){}; }catch(IOException e){}; System.out.println("Ende der Datei-Persistierung (siehe testPersonSerial.txt)."); } } Über die Strukturen des InputStream ist natürlich ähnlich auch das Wiedereinlesen von Objekten, aus z.B. der Datei, möglich. Zur Persistierung in Kombination mit einer Datenbank ist die Methode der Serialisierung jedoch nicht grundsätzlich vorgesehen. D.h., es existieren keine standardmäßigen Klassen, die es erlauben, ein serialisiertes Objekt in eine Datenbank zu schreiben oder daraus zu laden. Es ist jedoch denkbar, die Methoden des OutputStreams zu überschreiben, wie die Methode writeObject. Dies hat zur Folge, daß Verwaltungsmethoden und somit Datenbankoperationen selbst entwickelt werden müssen. So kann man ein serialisiertes Codeobjekt als Binärwert im Datensatz einer Tabelle, welcher das passende Datenbankobjekt darstellt, abspeichern. Damit wären beide Objektarten eindeutig verknüpft. Eine Lademethode, also das Wiedereinlesen eines serialisierten Codeobjekts, ist damit leicht zu implementieren, was ein Ziel der Persistierung darstellt. So ist es beispielsweise nicht nötig wie beim manuellen Mapping die Attributwerte eines Datensatzes einzeln in Variablen einer Repräsentationsklasse einzufügen. Eine Alternative ist, in der Datenbank nicht die vollständigen Datenbankobjekte zu sichern, weil diese Daten im jeweiligen abgelegten Codeobjekt vorhanden sind, sondern nur die minimalen und zur Suche notwendigen Daten. Beachtenswert ist es offensichtlich, Datenbankobjekte und abgelegte serialisierte Codeobjekte mit eigenen Methoden synchron zu halten, was hier ebenfalls implementiert werden muß. Dies ist nämlich nötig, um ein Objekt aus einer Datenbank wie oben beschrieben (neu) zu laden, da zunächst ein entsprechender Suchvorgang, z.B. über eine Tabelle, vorausgeht. Dieser Vorgang findet auf Basis der Datenbankobjekte statt, auf welche, etwa mittels Indexstrukturen, wesentlich effizienter zur Suche zugegriffen werden kann und die im Gegensatz zu den Codeobjekten nicht erst als Java-Objekt instanziert werden müssen, um sie zu lesen. Zur Implementierung derartiger Datenbankoperationen für die Serialisierung müssen also Methoden verwendet werden, die sich stark mit denen des manuellen Mappings überschneiden (siehe auch Abschnitte 4.3.1 und 4.7.1). Statt also weiter die Methode der Serialisierung zu verfolgen, welche keine grundsätzliche Unterstützung für Datenbanken bietet, ist es sinnvoller JDO zu betrachten, welches genau das – 88 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER und eine ähnliche Einfachheit wie die Serialisierung bietet. Diese Aspekte der und weitere Details zur Serialisierung unter Java finden sich z.B. in [Ull00] im Kapitel Persistente Objekte und Serialisierung“ oder in [Kru00] im Kapitel Serialisierung“. ” ” Vorteile • Serialisierung ist eine altbekannte und für verschiedene Anwendungsbereiche StandardLösung unter Java. • Die reine Persistierung setzt keine Entwicklung von speziellen Java-Klassen voraus, die zu persistierende Klasse muß lediglich durch die Implementierung des entsprechenden Interfaces quasi gekennzeichnet werden, was eine einfache Persistierungslösung ermöglicht. Auch mehrstufige Objekte werden standardmäßig unterstützt. Nachteile • Die Intention hinter der Serialisierung ist nicht die Abbildung auf eine relationale Datenbank und wird demzufolge auch nicht ohne Zusatzaufwand unterstützt. • Für eine Datenbank-Lösung mit Serialisierung, etwa beim Ablegen des serialisierten Objekts als Binärwert im passenden Registrierungsdatensatz bei einem TrustCenter, müssen zusätzliche Methoden zur Datenbankverwaltung implementiert werden, etwa zum Synchronisieren von Codeobjekt und Datensatz. Durch den Zusatzaufwand für die Entwicklung von Datenbankoperationen leidet die Effizienz bei der Applikationsentwicklung sowie im Betrieb, und die Einfachheit der Serialisierung geht verloren. Des weiteren muß ein ähnlicher Entwicklungsaufwand betrieben werden, wie beim manuellen Mapping, was jedoch im Vergleich zur Serialisierung mehr Vorteile besitzt (siehe auch Abschnitt 4.7.1). • Auch wenn die Serialisierung direkt im JDK nutzbar ist und unterstützt wird, ist JDO eine geeignetere, wenn auch teilweise kommerzielle, Lösung für Datenbanken. 4.7.3 JDO Die Persistierung mittels JDO ist noch einfacher möglich als bei der Serialisierung und vor allem speziell für Datenbanken entwickelt worden. JDO greift dabei lediglich für die reine Datenbankverbindung auf JDBC zurück. Der Entwickler kann sich bei JDO auf die reine Codeentwicklung unter Java konzentrieren. Er entwickelt dazu z.B. eine spezielle Repräsentationsklasse ohne Datenbankoperationen. Diese ist nun die einzige Zugriffsmethode auf Objektattribute für die gesamte Datenbankapplikation. Das Laden und Speichern von Objekten geschieht über JDO-Methoden fast automatisch, vor allem im Vergleich zum manuellen Mapping. JDO schreibt dazu die vollständige Objektinstanz in die zugrundeliegende Datenbank und stellt ebenfalls effiziente Suchmethoden für das Wiederherstellen zur Verfügung. Auch mehrstufige Objekte müssen nicht durch eine Sonderbehandlung persistiert werden. Der Entwickler der Datenbankapplikation beschäftigt sich also gar nicht mehr mit der Datenbankentwicklung sondern mit der reinen Applikationsentwicklung. Das Erstellen logischer Strukturen etwa wird von JDO übernommen und geschieht automatisch. – 89 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Zu beachten ist, daß es sich bei JDO einerseits um einen Standard für das JDK und andererseits um ein Framework bzw. eine Interface-Struktur handelt. Eine Implementierung dieser ist zum Benutzen von JDO notwendig. Dies ist vergleichbar mit den Strukturen, wie sie beim JCA vorliegen, was in Abschnitt 4.3 anhand des zugehörigen FlexiProviders eingeführt wurde. Eine Implementierung der JDO-Interfaces nennt man ebenfalls Provider. Leider ist für JDO noch keine kostenlose bzw. freie Implementierung vorhanden. Das grundlegende Prinzip eines derartigen Frameworks wie JDO bietet jedoch die Möglichkeit, einen Providerwechsel äußerst einfach durchzuführen, womit die eigene Applikation zumindest flexibel ist. Im Folgenden sind verschiedene JDO-Implementierungen bzw. JDO-Produkte aufgeführt, die sich in ihrer Leistungsfähigkeit sicherlich nicht sehr unterscheiden: • FastObjects von Poet Software GmbH, • intelliBO von Signsoft, • Kodo JDO von Solarmetric, • ObJectRelationalBridge (OJB). Hervorzuheben bleibt, daß es sich hierbei fast ausschließlich um kommerzielle Produkte handelt, wobei die Entwicklung von OJB als bisher einzige freie Entwicklung noch nicht vollständig fertig gestellt ist. FastObjects (siehe auch [Poe03]) ist eine empfehlenswerte kommerzielle Implementierung mit ausführlicher Spezifikation sowie Dokumentation und trotz des jungen Alters von JDO in der Praxis schon etabliert, wobei dies sicherlich ebenso für andere Produkte gilt. Ein Pressetext von Poet zeigt ein Anwendungsbeispiel: Mit über 13.500 Kunden bundesweit gehört TurboMed zu den führenden Unter” nehmen in der Branche der Praxisverwaltungssysteme. Natürlich muß dann auch die integrierte Datenbank-Lösung einen wartungsfreien Betrieb in den Praxen gewährleisten können.“ Der Umgang mit und die Einfachheit von JDO bei der Persistierung von Objekten soll am folgenden Beispiel demonstriert werden. Ähnlich wie bei der Serialization wird eine spezielle Repräsentationsklasse ohne jegliche Datenbankoperationen entwickelt (vgl. Klasse PersonOn” ly“ in Abschnitt 4.6.2): package MyJDOExample; public class JDOPerson{ private String name; private String vorname; private String dienstNr; private int persID; // klassischer Konstruktor public JDOPerson(String name, String vorname, String dienstNr, int persID){ this.name=name; this.vorname=vorname; this.dienstNr=dienstNr; this.persID=persID; } – 90 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER // klassische Setter-Methoden public void setName(String name){ this.name=name; } // usw. // klassische Getter-Methoden public int getPersID(){ return persID; } // usw. } Im folgenden ausführbaren Programm wird beispielhaft eine solche Person erzeugt und mittels JDO in einer Datenbank persistiert. Für das Setzen der Optionen für die Datenbankverbindung wird auf die Klasse Properties zurückgegriffen, was diese Optionen aufgrund der Nutzung von Strings leicht konfigurierbar macht, z.B. über eine Konfigurationsdatei. Das Programm ist natürlich ohne eine konkrete JDO-Implementierung nicht lauffähig, wobei dazu an der mit ***“ gekennzeichneten Stelle eine entsprechende Klasse angegeben werden muß: ” package MyJDOExample; import javax.jdo.*; import java.util.Properties; import MyJDOExample.JDOPerson; class testJDOPerson{ private private private private static static static static PersistenceManagerFactory pmf; PersistenceManager pm; Transaction transaction; Properties props; public static void main (String args[]){ System.out.println("Erzeuge JDOPerson..."); JDOPerson people=new JDOPerson("Schmitt", "Harald", "000002", 123457); System.out.println("Erzeuge Datenbankverbindung..."); // Datenbankverbindung konfigurieren Properties props = new Properties(); props.setProperty("javax.jdo.option.ConnectionURL", "jdbc:odbc:MyTestDB"); props.setProperty("javax.jdo.option.PersistenceManagerFactoryClass", "com.sun.jdori.common.PersistenceManagerFactoryImpl"); // *** // [...] System.out.println("Erzeuge PMF..."); pmf = JDOHelper.getPersistenceManagerFactory(props); System.out.println("Erzeuge PM und TX..."); // neuen PersistenceManager von der Factory erzeugen lassen pm = pmf.getPersistenceManager(); transaction = pm.currentTransaction(); transaction.begin(); // das Personen-Objekte persistent machen: – 91 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER pm.makePersistent(people); transaction.commit(); // persistiert transaction.begin(); people.setName("Schmidt"); // Namen korrigieren transaction.commit(); // Änderung persistiert // Alle Ressourcen wieder freigeben pm.close(); System.out.println("Ende der Objekt-Persistierung."); } } Natürlich ist es möglich und sinnvoll, die Persistierungsmethoden für eine individuelle Applikation in einer separaten Klasse zu kapseln. Des weiteren benötigt JDO jedoch eine XML-Steuerdatei, in welcher JDO mitgeteilt wird, welche Klassen persistiert werden sollen. Für das Beispiel sieht die Datei, testJDOPerson.jdo“, ” so aus: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jdo SYSTEM "jdo.dtd"> <jdo> <package name="MyJDOExample"> <class name="JDOPerson" identity-type="datastore"> </class> </package> </jdo> Wie man am gesamten Beispiel erkennen kann, wurden zum Speichern des Objekts weder SQL-Anweisungen verwendet noch Tabellen angegeben. Letzteres ist auch innerhalb der anzugebenen Properties für die Datenbankverbindung nicht nötig. Es existieren drei Möglichkeiten, um mit JDO Datenbankobjekte wiederherzustellen. Davon sind zwei ähnlich einfach wie das Persistieren mit JDO: Methods of Interface javax.jdo.PersistenceManager java.lang.Object getObjectById(java.lang.Object oid, boolean validate) This method locates a persistent instance in the cache of instances managed by this PersistenceManager. java.lang.Object getExtent(java.lang.Class persistenceCapableClass, boolean subclasses) The PersistenceManager manages a collection – 92 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER of instances in the data store based on the class of the instances. Die dritte Möglichkeit ist das variable Suchen, welches im Framework JDO ebenfalls über ein Interface bewerkstelligt wird, nämlich Query. Dieses Interface läßt sich selbstverständlich auch mittels SQL implementieren. Das Ziel ist es, eine Möglichkeit ähnlich dem Parametrisieren von SQL-Strings (siehe Abschnitt 4.3.1) zur Verfügung zu stellen, womit eine individuelle Query validiert bzw. kompiliert werden kann. Dies geschieht auf Basis von Java-Methoden, mit welchen die Elemente einer Query, z.B. Suchkriterien, separat festgelegt werden. Dieser Teil von JDO wird als JDOQL bezeichnet. Natürlich ist die variable Suche ein wesentlicher und wichtiger Bestandteil der Persistierung selbst. Daher werden die wichtigsten Methoden von JDOQL im Folgenden gezeigt: Methods of Interface javax.jdo.Query void compile() Verify the elements of the query and provide a hint to the query to prepare and optimize an execution plan. void declareImports(java.lang.String imports) Set the import statements to be used to identify the fully qualified name of variables or parameters. void declareParameters(java.lang.String parameters) Declare the list of parameters query execution. void declareVariables(java.lang.String variables) Declare the unbound variables to be used in the query. java.lang.Object execute() Execute the query and return the filtered Collection. Ein Query-Objekt erhält man ebenfalls vom PersistenceManager u.a. mit Methoden wie newQuery(). Alle Objekte, also java.lang.Objects, die von obigen Methoden zurückgegeben werden, sind zuvor persistierte Objektinstanzen. Im Vergleich zu SQL hat JDOQL jedoch einige Nachteile, da JDOQL weder standardisiert noch formal definierbar ist wie SQL. Auch ist SQL eine äußerst mächtige und unterstützte sowie weitverbreitete Sprache. Dennoch ist JDOQL stark an SQL angelehnt, womit sich die Frage ergibt, ob ein Applikationsentwickler tatsächlich von der Entwicklung von Queries entlastet wird, wie es ein System für das Objekt-Relationale-Mapping zum Ziel hat. Ein Problem von JDO, das nicht in jedem Kontext beachtenswert ist aber bei TrustCentern, ist die noch fehlende Unterstützung von BLOBs. Bei FlexiTrust z.B. werden Zertifikate in den Tabellen der TrustCenter-Datenbank unter der Nutzung dieses Datentyps abgelegt. Dazu ein Zitat aus der aktuellen JDO-Spezifikation (siehe [Rus01]) und zwar aus dem Ausblick für die zukünftige Entwicklung: – 93 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER JDO implementations can choose to implement mapping from java.sql.Blob data” type to byte arrays, and java.sql.Clob to String or other java type; but these mappings are not standard, and may not have the performance characteristics desired.“ In der Tat existieren JDO-Implementierungen, welche BLOBs unterstützen, wie z.B. die FastObjects. Ob die Nutzung dieser Unterstützung unter dem Aspekt der Flexibilität sinnvoll ist, hängt von evt. nötigen Änderungen in der eigenen Applikation ab, falls man die JDOImplementierung wechseln möchte. Man beachte, daß es sich zu diesem Zeitpunkt bei JDO um eine sehr junge Technologie handelt, die z.Z. auch noch in einigen Grundlagen, z.B. der BLOB-Unterstützung, weiterentwickelt wird. Die Konzepte von JDO sind sehr gut und die Persistierung, wie gezeigt, ist sehr einfach. Da es sich bei JDO bereits um einen Standard handelt, welcher von vielen Entwicklergruppen, z.B. bei Sun, genutzt und gepflegt wird, ist eine weitere sowie stärkere Verbreitung und Nutzung von JDO in der Zukunft wahrscheinlich (siehe z.B. [Fro01] oder [Jor02-1]). Des weiteren ist JDO als offizielles Framework Bestandteil des JDK von Sun. Vorteile • Die Datenbank-Persistierung von Objekten mit JDO könnte nicht einfacher sein. JDO ist dazu äußerst leistungs- sowie anpassungsfähig und dennoch auch für Anwendungen mit großem Aufkommen an Datenbankzugriffen geeignet. • JDO ist eine reine Objekt-basierte Persistierungslösung, bei welcher der Applikationsentwickler von der Datenbank-Entwicklung vollständig entbunden wird. Alle Datenbankoperationen erfolgen über Java-Klassen sozusagen automatisch und sind vorgegeben. Der Applikationsentwickler muß lediglich eine spezielle Repräsentationsklasse ohne Datenbankoperationen entwickeln. JDO übernimmt die vollständige Persistierung, was z.B. die automatische Erzeugung von logischen Strukturen einschließt. • JDO ist ein Standard und bietet daher bei der Nutzung für die eigene Datenbankapplikation den Vorteil der Nachvollziehbarkeit, was bei TrustCentern und deren Zielen bei Registrierungsvorgängen enorm wichtig ist. • Ein wesentliches Ziel von JDO ist nicht nur die einfache Entwicklung von Datenbankoperationen sondern ebenfalls deren Effizienz, wodurch JDO als Standard eine hohe Rechenleistung aufgrund seines Performance-Konzepts“ bietet. ” • Aufgrund der Interface-Struktur von JDO ist man sehr flexibel in der Wahl der JDOImplementierung und die Kompatibilität einzelner Implementierungen ist gewährleistet. • Im Vergleich zu allen anderen für Java geeigneten Methoden des Objekt-RelationalenMappings schneidet JDO am besten ab, nicht zuletzt aufgrund der Einfachheit und der Standardisierung. • JDOQL stellt eine Art alternativer Query-Sprache unter Java dar, bei welcher es möglich ist, mit Queries nicht über reine String-Werte umzugehen. Statt dessen sind hier Queries kompilierbar, d.h., ihre Syntax wird vom Java-Compiler direkt überprüft. Nachteile • Da es sich bei JDO um ein Framework, also eine Interface-Struktur handelt, ist man für das Nutzen von JDO in der eigenen Datenbankapplikation auf eine Implementierung – 94 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER des Frameworks angewiesen, sofern man dieses nicht selbst implementieren möchte, und somit von einer externen Systemlösung abhängig. Des weiteren existiert z.Z. noch keine kostenlose OpenSource-Implementierung. Da es sich bei JDO aber um eine junge Entwicklung handelt, kann sich dies in Zukunft ändern. • Da man von Codeentwicklungsseite aus agiert, wird für jedes individuelle Anwendungsszenario der Datenbankapplikation, wie bei TrustCentern, eine Neukompilation notwendig. • Da JDO die Datenbankseite, wie z.B. logische Strukturen, der Datenbankapplikation automatisch erzeugt, werden direkte Zugriffe darauf je nach Anwendungsszenario und verwendeten Java-Klassen schwierig. Dies kann jedoch beispielsweise bei der Erstellung von Datenbank-Auszügen oder -Statistiken notwendig sein (siehe auch Abschnitt 4.10.6). • Ein Nachteil für Applikationen, welche auf BLOBs angewiesen sind, wie etwa TrustCenter beim Speichern von Zertifikaten, ist die z.Z. noch fehlende Unterstützung für diesen Datentyp im JDO-Standard. Hier sind jedoch schon Implementierungen vorhanden oder manuelle Hilfslösungen möglich. • Anders als JDO ist JDOQL noch kein Standard und kann sich nicht nur daher mit der Mächtigkeit von SQL nicht messen, wenngleich eine JDOQL-Implementierung SQL nutzen kann. SQL hingegen ist äußerst stark verbreitet und findet Unterstützung in allen Datenbanksystemen oder Datenbankwerkzeugen. Des weiteren ist SQL ein Standard und bietet eine große Effizienz bzw. allgemeine Optimierungsmethoden. • Die Umstellung einer auf Basis von manuellem Mapping implementierter Persistierungslösung auf JDO ist gerade bei einer großen Datenbankapplikation mit vielen Subapplikationen sehr aufwendig. 4.8 Datenbank-basierte Lösungen Die im Folgenden erläuterten Verfahren sind allgemein gehalten, also nicht auf Java beschränkt, wenngleich sie anhand von Java erläutert werden. Es handelt sich hierbei um allgemeine Datenhaltungstechniken. 4.8.1 Datenzugriffe über Cursor Wie in Abschnitt 3.6 erläutert, bieten sogenannte Cursor einem Entwickler die Möglichkeit innerhalb einer Applikation auf eine Menge von Datensätzen zu zugreifen, die z.B. das Ergebnis einer SQL-Query sind. Auch wenn Cursorsteuerungen bereits in SQL definiert sind, bieten Entwicklungsumgebungen eigene Varianten an, welche auch Operationen auf Datensätzen ermöglichen, wie z.B. das Einfügen neuer oder das Ändern vorhandener Datensätze. In Java übernimmt dies das Interface bzw. die Klasse ResultSet. Es handelt sich hierbei zwar um ein Interface, jedoch erhält man eine operable Instanz, sobald man einen gültigen Datenbankzugriff erzeugt hat. Diese und ähnliche Vorgehensweisen wurden schon mehrfach gezeigt und erläutert (z.B. in Abschnitt 4.3.1). Eine Möglichkeit, um auf Datenbankobjekte auch als Instanz einer Java-Klasse zugreifen zu können, also die Datenbankobjekte auch als Java-Objekte zu erhalten, ist eine entsprechende Repräsentationsklasse nur mit ResultSet zu definieren. Der Vorteil einer solchen reinen – 95 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Cursorsteuerung ist es, daß keine lokalen Klassenvariablen für Objektattribute benutzt werden. Lediglich die üblichen Datenbankoperationen werden benötigt, um einen entsprechenden ResultSet bereitzustellen. Das folgende kurze Beispiel soll eine solche Repräsentationsklasse andeuten und funktioniert dazu z.B. mit der Tabelle T Person“ aus Abbildung 20: ” import java.sql.*; public class PersonAccResset{ private Connection con; private Statement stm; private ResultSet rsIn; private String url = "jdbc:odbc:MyTestDB"; // über ODBC im System registrierte Datenbank public void GetAcc(){ System.out.println("Baue Datenbankverbindung auf..."); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(ClassNotFoundException e){}; try{ con = DriverManager.getConnection(url); stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); }catch(SQLException e){System.out.println(e);}; } public void CloseAcc(){ System.out.println("Baue Datenbankverbindung ab..."); try{ stm.close(); }catch(SQLException e){System.out.println(e);}; } public ResultSet AccRead(String Entity, String[] Attributs, String[] AttributeValues){ // Mögliche Rückgabe-Beschränkung wäre, daß die Datensatzauswahl // eindeutig war und sonst eine Exception geworfen wird. try{ rsIn = stm.executeQuery("Select * FROM T_" + Entity + " WHERE " + Attributs[0] + "=’" + AttributeValues[0] + "’;"); // nur beispielhaft; Eigentlich müßte hier der vollständige // SQL-String über eine Schleife, aber automatisch, // konstruiert werden. }catch(SQLException e){System.out.println(e);}; return rsIn; } /* public void AccWriteNew(...){...} // z.B. über SQL-Queries } – 96 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER public void AccWriteUpdate(...){...} // z.B. über SQL-Queries } */ } Bei diesem Beispiel handelt es sich also um eine vollwertige Repräsentationsklasse, welche je nach Anforderungsbereich ausgebaut werden kann. Dies bedeutet auch, daß für jedes Datenbankobjekt wie üblich eine Instanz dieser Klasse erzeugt wird. Auch ist es denkbar, diese Klasse um allgemeine Setter- und Getter-Methoden für einzelne Attribute zu ergänzen, was eine alternative Zugriffsmethode zur reinen ResultSet-Rückgabe ist. Für die Repräsentation von mehrstufigen Objekten ist z.B. der Einsatz von Steuertabellen sowie Arrays von ResultSets möglich. Vorteile • Da bei dieser Vorgehensweise keine lokalen Variablen für Objektattribute benötigt werden, ist z.B. auch kein separiertes Einlesen von Werten und Setzen dieser Variablen notwendig, wie bei anderen Varianten, z.B. der reinen JDBC-Lösung. Damit wird nicht nur Entwicklungsaufwand vermieden, sondern gleichermaßen Effizienz bzw. Rechenleistung gewonnen. Im Gegensatz dazu wird beispielsweise beim manuellen Mapping (siehe Abschnitt 4.7.1) nachdem Bestimmen eines ResultSet, dieses noch in Variablen der Repräsentationsklasse umgesetzt. Letzteres wird bei der reinen Cursor-Lösung nicht getan. • Wenn innerhalb aller Applikationsteile der Umgang mit dem Java-Cursor unterstützt wird, sind bei der Nutzung von allgemeinen Repräsentationsklassen, evt. unter Zuhilfenahme von z.B. Steuertabellen, keine Neukompilationen des Applikationscodes notwendig. • Diese Methode ist mit anderen Persistierungsideen, z.B. Steuertabellen, kombinierbar und anpassungsfähig, da es sich hierbei nur um eine Form der Repräsentation handelt. Nachteile • Alle Applikationsteile sind bei dieser Lösung auf die Nutzung von ResultSets angewiesen und müssen diese umsetzen sowie sich dazu ggf. umstellen. 4.8.2 Steuer- bzw. Hilfstabellen Gewisse Daten aus einem Quellcode auszulagern, um diesen einfach und evt. sogar ohne Neukompilation konfigurierbar zu machen, ist eine gängige Idee. Mit Konfigurationsdateien etwa läßt sich dann entsprechend das Verhalten einer Applikation verändern und steuern, ohne Änderungen im Quellcode vorzunehmen. Diese Daten sind also nicht mehr fest im Quelltext eingebettet. Auch bei FlexiTrust wird diese Methode bereits eingesetzt, wobei Konfigurationsdateien die Form *.properties haben. Natürlich ist es ebenso denkbar, solche Daten in Tabellen abzulegen, die dann als Hilfs- oder Steuertabellen bezeichnet werden. Bei einer Datenbankapplikation macht dies besonders Sinn, weil auf Datenbanken zurückgegriffen wird und auf diese Weise auch komplexere Datenstrukturen als Konfigurationsdaten dienen können, falls dies erforderlich ist. Des weiteren lassen sich diese Daten so auch direkt in SQL-Queries einbinden, was u.U. sinnvoll und effizienter sein kann. – 97 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Ein Beispiel für eine solche Steuertabelle, die nur schwer als Konfigurationsdatei realisiert werden kann, ist T Relation“ aus Abschnitt 4.7.1. Ein einfacheres Beispiel findet sich in ” Abbildung 22. Es zeigt, wie man mittels vereinbarter Keywords Optionen setzen kann. Bezogen auf TrustCenter zeigt das Beispiel, wie man gewisse Informationen über relevante Tabellenstrukturen festhalten kann. Dies kann z.B. die Nutzung von allgemeinen Repräsentationsklassen trotz vielfältiger Anwendungsszenarien unterstützen, wodurch ein automatisches Einlesen von Tabellenstrukturen ohne Änderungen im Quelltext auf flexible Weise möglich ist. Details zur Realisierung hängen von der jeweiligen Umsetzung für eine bestimmte Datenbankapplikation ab und können sehr individuell sein. Bei TrustCentern muß beachtet werden, daß beim Nutzen von Konfigurationsdateien oder Steuertabellen stets die Sicherheit vor unbefugten Änderungen gewahrt wird, um auch die Ziele eines TrustCenters (siehe auch Abschnitt 2.1) zu garantieren. Denn können Angreifer das Verhalten der TrustCenter-Applikation auf diese Weise verändern, sind die Ziele des TrustCenters bzw. einer PKI gefährdet. Für Steuertabellen gilt, daß sie im selben Bereich, nämlich der TrustCenter-Datenbank, abgelegt werden, wie z.B. die Registrierungsdaten. D.h., sie obliegen dem selben Schutzniveau wie diese äußerst schützenswerten Daten. T Control Keyword Value MainRegdataTab T Person SubRegdataTab T SubPerson PrimKeyAttr StaffID+DistinguishedName CertRelevantAttr Name CertRelevantAttr FirstName Abbildung 22: Umsetzungsmöglichkeit für eine einfache Steuertabelle Es ist denkbar zu dieser Lösung eine Art Validierungsklasse zu entwickeln, mit deren Hilfe man die Gültigkeit des Zustandes der Steuertabelle überprüfen kann, etwa indem das Vorhandensein einer vorgegeben Liste von Keywords sowie u.U. deren Zusammenhängen und Korrektheit überprüft sowie kontrolliert wird. Vorteile • Konfigurierbare Daten, welche u.U. sogar im Quellcode und somit fest eingebettet sind, werden ausgelagert. Damit wird z.B. eine Neukompilation von Quelltexten vermieden. Statt dessen müssen in einem Quelltext zunächst Daten aus einer Steuertabelle eingelesen werden, womit der Entwicklungscode und somit die Applikation konfigurierbar wird. • Das Auslesen von solchen Daten, z.B. zur Konfiguration, aus Tabellen und nicht aus Dateien hat den Vorteil, daß diese Daten direkt in einer SQL-Anweisung eingebunden bzw. verarbeitet werden können, was natürlich nur bei einer Datenbankapplikation sinnvoll und effizient ist. Nachteile Bei dieser Variante handelt es sich um eine übliche Methode. Das Zusammensuchen ausgelagerter Daten kann sich nur unter bestimmten Voraussetzungen zum Nachteil entwickeln, etwa wenn: – 98 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER • Keine Konfiguration erwünscht ist (z.B. bei sicherheitskritischen Daten), • die Konfiguration undurchschaubar wird, • zu lösende Probleme auf die Konfiguration verschoben werden. Im Falle eines TrustCenters gilt, daß die zugrundeliegende Datenbank äußerst schützenswert und sicherheitskritisch ist. Denn hier werden u.a. Registrierungsdaten gespeichert, welche einen wichtigen Bestandteil zur Realisierung der Ziele einer PKI sowie eines TrustCenters (siehe z.B. Abschnitt 2.1) darstellen. Folglich hängen die Sicherheit, welche das jeweilige TrustCenter bieten kann, und die Sicherheitsaspekte bzgl. der TrustCenter-Datenbank eng zusammen. Demnach können auch sicherheitskritische Daten aus einer Applikation des TrustCenters in die Datenbank bei Bedarf ausgelagert werden. 4.8.3 Dynamische Strukturen bzw. Tabellendefinitionen Das Ziel von dynamischen Strukturen ist es, in einem bestimmten Anwendungskontext Applikationsentwicklung und Datenbankentwicklung gleichermaßen ausschließlich mittels Dateneingabe und Datenmanipulation vorzunehmen. Dies bedeutet auch, daß Applikationsänderungen und Erstellung logischer Strukturen einer Datenbank nur über Datenmanipulation möglich sein soll. Folglich sind für eine Anpassung einer Datenbankapplikation, z.B. eines TrustCenters, für ein bestimmtes Anwendungsszenario nur Datenänderungen vonnöten, etwa durch direkte Bearbeitung, SQL oder Java-Programme. Damit dies möglich wird, ist selbstverständlich ein recht großer Aufwand bei der Erstentwicklung nötig, welche den individuellen Anforderungen für eine solche Lösung angepaßt sein muß. Was für ein solches System dynamischer Strukturen notwendig ist, soll im Folgenden erläutert und näher beschrieben werden. Bei einer gewöhnlichen Tabelle, wie der bereits bekannten T Person“ aus Abbildung 20, muß der Datenbankentwickler beim Hinzufügen eines ” neuen Attributs stets die Tabellendefinition ändern, da diese dafür um eine Spalte erweitert wird. Abbildung 23 soll diesen Vorgang verdeutlichen. Nun soll dieser Vorgang mit der Idee von dynamischen logischen Strukturen umgesetzt werden. Die Basis eines einfachen Beispiels hierfür sollen die Tabellen T Tabellen“ und T Daten“ ” ” bilden. Dabei handelt es sich um die einzigen Tabellen, die für die Realisierung einer passenden Datenbankapplikation in der zugehörigen Datenbank angelegt werden müssen. Auch wird sich diese Tabellenstruktur bei anderen Anwendungsszenarien, z.B. anderen beliebigen Personendaten, nicht ändern. Individuelle Tabellen werden in die vorhandenen dynamisch eingepflegt. Die Abbildungen 24 ( T Tabellen“) und 25 ( T Daten“) zeigen nicht nur den Auf” ” bau einer solchen dynamischen Struktur, sondern demonstrieren auch auf welche Weise der oben geschilderte Vorgang der Erweiterung der Tabelle T Person“ mit solchen Strukturen ” vollzogen werden kann. Es ist leicht zu sehen, daß eingepflegte individuelle Tabellen mit ihren Daten aus den vorhandenen Tabellen der dynamischen Struktur erst ausgelesen werden müssen, etwa für einen Datensatzzugriff. Dies bedeutet, ein einfacher Datenbankzugriff erfolgt nicht mehr ausschließlich über das Datenbanksystem, sondern muß von einer zu den dynamischen Strukturen entwickelten Basisapplikation verwaltet werden. Folgendes Beispiel stellt keine Repräsentationsklasse dar sondern nur eine Klasse für den Datenbankzugriff bzw. die notwendigen Datenbankoperationen bei den gezeigten Strukturen. Sie erzeugt jedoch ein Objekt der Klasse PersonOnly.java“, wobei es sich hier um die speziel” le Repräsentationsklasse ohne Datenbankoperationen aus Abschnitt 4.6.2 handelt. Um dieses – 99 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 23: Tabellendefinitionen durch Strukturmanipulation Codeobjekt erzeugen zu können, muß die Zugriffsklasse die Attributwerte des Datenbankobjekts aus Einzeldatensätzen der fixen Tabellen T Tabellen“ und T Daten“ zusammensetzen: ” ” import java.sql.*; import PersonOnly; public class Acc2DynTab{ private Connection con; private Statement stm; private ResultSet rsIn; private ResultSet rsOut; private PersonOnly onePerson; private String url = "jdbc:odbc:MyTestDB"; // über ODBC im System registrierte Datenbank public void GetAcc(){ System.out.println("Baue Datenbankverbindung auf..."); try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(ClassNotFoundException e){}; try{ con = DriverManager.getConnection(url); stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); }catch(SQLException e){System.out.println(e);}; } public void CloseAcc(){ System.out.println("Baue Datenbankverbindung ab..."); try{ stm.close(); }catch(SQLException e){System.out.println(e);}; } – 100 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 24: Dynamische Tabellendefinitionen durch Datenmanipulation public PersonOnly AccRead(String[] Attributs, String[] AttributeValues){ ResultSet rsIn; try{ rsIn = stm.executeQuery( "SELECT T_Tabellen.Attribut, T_Daten.Wert " + "FROM (T_Daten AS T_Daten_1 INNER JOIN T_Tabellen" + " AS T_Tabellen_1 ON T_Daten_1.TabID = T_Tabellen_1.TabID)" + " INNER JOIN (T_Tabellen INNER JOIN T_Daten" + " ON T_Tabellen.TabID = T_Daten.TabID) ON" + " T_Daten_1.TupelID = T_Daten.TupelID " + "WHERE ((T_Daten_1.Wert=’Homann’)" // *** + " AND (T_Tabellen_1.Attribut=’Name’)" + " AND (T_Tabellen_1.Tabelle=’T_Person’));"); // An dieser Stelle müssen eigentlich die // Suchkriterien aus den Argumenten gesetzt werden. rsIn.beforeFirst(); onePerson = new PersonOnly(); while(rsIn.next()){ onePerson.setAttribute((String)rsIn.getString(1), (String)rsIn.getString(2)); } }catch(SQLException e){System.out.println(e);}; return onePerson; } // ähnlich dann je eine "Write"-Methode für Änderungen // und neue Datensätze } – 101 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 25: Attributwerte bzw. Datensätze bei dynamischen Tabellen Da es sich hier nur um ein Beispiel handelt, ist die mit ***“ gekennzeichnete Stelle nicht ” weiter ausformuliert bzw. nicht variabel. Eine Visualisierung der verwendeten größeren SQLAnweisung ist in Abbildung 26 zu sehen. Ebenfalls ist es hier natürlich denkbar, den Objekttyp bzw. dessen Repräsentationsklasse zu parametrisieren, wie schon z.B. in der Klasse Entities.java“ aus Abschnitt 4.6.2 gesehen, ” sowie allgemeine Repräsentationsklassen zu verwenden. Mehrstufige Objekte lassen sich mit dynamischen Strukturen sehr leicht realisieren. Dazu muß das gezeigte System jedoch ein wenig modifiziert werden. Hierfür existieren viele Möglichkeiten. Es ist z.B. denkbar, die Tabelle T Tabellen“ um ein Attribut ParentID“ zu erweitern, ” ” womit eine Hierarchie der Tabellen bzw. Datenbankobjekte realisiert ist. Die zu verknüpfenden Attribute der Tabellen, meist Schlüssel, müssen ebenfalls noch gekennzeichnet werden. Dies ist möglich, durch ein weiteres Attribut oder Flag in den Tabellen T Daten“ oder T Tabellen“. ” ” Auch könnte man sich einer Steuertabelle behelfen, wie etwa T Relation“ aus Abschnitt 4.7.1. ” Natürlich ist es auch möglich bei dynamischen Strukturen mehrere und verschiedene Datentypen direkt zu behandeln. Dazu ist es zunächst nötig, eine Basistabelle für alle eigentlichen Daten zu entwickeln. Diese verweist dann zu den eigentlichen Attributwerten auf andere Tabellen, bei welchen die Spalte mit dem jeweiligen Wert einen individuellen Datentyp besitzen kann. Bei dieser Variante ist es auch denkbar, definierte Attribute bzw. Felder wiederzuverwenden und zwar schon bei der Tabellendefinition. Dann würde man die Attributsdefinition sowie Zuweisung zu Tabellen auch separat und ausführlich betreiben. Man könnte etwa auch Attributsbeschreibungen oder Wertbeschränkungen einführen o.ä. Die Verknüpfung zwischen Tabellendefinitionen und Attributsdefinitionen wird dann über eine gesonderte Steuertabelle vollzogen, welche die Primärschlüssel der Tabellen- und Attributsdefinitionen in Beziehung setzt. Vorteile • Auch bei dieser Lösung läßt sich prinzipiell ausschließlich von Codeentwicklungsseite aus, also z.B. von Java aus, arbeiten, da die Datenbank zur Applikation immer dieselben festen logischen Strukturen besitzt und folglich immer gleich unabhängig vom Anwendungsszenario eingerichtet wird. – 102 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Abbildung 26: SQL-Anweisung zum Zusammensetzen von Daten aus dynamischen Tabellen • Diese Variante erlaubt es mehrstufige Objekte einfach zu pflegen. Auch müssen dafür z.B. keine verschiedenen Tabellen pro Objekttyp angelegt werden. • Das Erstellen von individuellen Typen und Tabellen für Datenbankobjekte geschieht ausschließlich über Datenmanipulation. Des weiteren lassen sich natürlich allgemeine Repräsentationsklassen verwenden. Somit ist ein flexibles und schnelles Anpassen einer Datenbankapplikation für ein bestimmtes Anwendungsszenario möglich. Zum Vergleich: Beim manuellen Mapping mit speziellen Repräsentationsklassen ist es dafür nötig, Änderungen an der Datenbank, an der Repräsentationsschicht und bei den SQL-Anweisungen für die Datenbankzugriffe vorzunehmen. • Dynamische Strukturen müssen nicht als alleinige Persistierungslösung genutzt werden, sondern lassen sich mit anderen Lösungen kombinieren. So kann man z.B. auch Teilbereiche von dynamischen Strukturen als Steuertabelle für andere Persistierungsarten, z.B. dem manuellen Mapping, verwenden. • Diese Variante ist ebenfalls am besten geeignet, wenn auch nicht im Kontext eines TrustCenters, falls sich innerhalb einer Datenbankapplikation Tabellenstrukturen bei Fernzugriffen oft ändern müssen, diese Änderungen von verschiedenen Benutzern durchgeführt werden können bzw. werden dürfen oder Benutzer gar freie Tabellen definieren können sollen. Denn meist können Datenbanksysteme mit Datenmanipulation besser und flexibler umgehen als mit Strukturänderungen, da es sich bei logischen Strukturen um eine statische Datenbankeigenschaft handelt (siehe auch Abschnitt 3.4.1). Dies gilt gerade bei Fernzugriffen, wie etwa über ODBC oder das Internet. Nachteile • Datenbankzugriffe auf Daten sowie Datensätze werden über SQL gesteuert und SQL muß dazu auch stark genutzt werden. Dadurch wird der Quellcode teilweise sehr SQLlastig, was bei einer einmaligen Entwicklung für die Entwicklungszeit nicht sehr relevant – 103 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER ist. Relevant wird dies jedoch bei der Betriebsleistung, da Datensätze manuell aus mehreren Tabellenzugriffen sozusagen zusammengesucht werden müssen, wodurch je nach Aufkommen an Datenbankzugriffen eine u.U. ineffiziente Rechenleistung entsteht. • Durch das manuelle Implementieren gängiger Datenbankmethoden, wie z.B. dem Zugriff auf einen einfachen Datensatz, verliert man einige Vorteile, aber keinesfalls alle, eines Datenbank Management-Systems (siehe auch Abschnitt 3.2). • Durch das hier notwendige Zusammensetzen eines einzigen Datensatzes, z.B. im Vergleich zu individuellen Tabellen, ist eine Dateneinsicht, etwa für einen Datenbank-Auszug oder einen Datenbank-Bericht, nur durch Programmieraufwand möglich. Dies wird gerade bei der Verwendung von mehreren verschiedenen Datentypen bei dynamischen Strukturen deutlich. Adhoc-Queries sind natürlich möglich, aber wesentlich umfangreicher und schwieriger zu entwickeln (siehe z.B. Abbildung 26). • Bei dieser Variante muß man den Anforderungen der eigenen Applikation entsprechend einen anfänglich großen Entwicklungsaufwand betreiben. 4.9 Bewertung der Persistierungslösungen Die Persistierungslösungen aus den Abschnitten 4.6, 4.7 und 4.8, welche in Abbildung 27 noch einmal zusammengefaßt sind, müssen vor allem unter den Aspekten des TrustCenter-Betriebs aus Abschnitt 4.1 sowie den Aspekten der Ziele aus Abschnitt 4.5.4 bewertet werden, welche bereits als Bewertungskriterien vorgestellt wurden. Des weiteren erfolgt die Bewertung im Kontext des TrustCenter-Produkts FlexiTrust (siehe Kapitel 2 und Abschnitt 4.4) und der vorliegenden Java-Implementierung, welche bereits auf manuellem Mapping basiert. Doch natürlich können die gezeigten Persistierungssysteme zumindest teilweise auch auf andere Applikationen übertragen werden. Abbildung 27: Zusammenfassung der Persistierungsmöglichkeiten – 104 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Die vorhandene OpenRA-Implementierung entstand zwar nicht unter dem Aspekt der optimalen Persistierung von Personendaten, ist diesbezüglich aber dennoch sehr zweckmäßig. Nichtsdestotrotz ist eine Erweiterung bzw. Änderung des vorhandenen Systems möglich sowie sinnvoll und kann bei entsprechender Gelegenheit nach Diskussion sowie Absprache der FlexiTrust-Entwickler erfolgen. Von einer solchen Änderung sind viele Teile von FlexiTrust betroffen. Man kann durchaus sagen, die Wahl einer der vorgestellten Persistierungslösungen ist teilweise Geschmacks- bzw. Ansichtssache. Auch sind mehrere dieser für den TrustCenter-Einsatz geeignet, da sie sich jeweils den Zielen und Idealen aus Abschnitt 4.5.4 nähern. Es wird noch einmal darauf hingewiesen, daß alle Lösungen auf JDBC für die Datenbankverbindung unter Java angewiesen sind. Folgende Lösungen kommen in Betracht und erfüllen, wie auch bereits in den zugehörigen Abschnitten gezeigt, die Bewertungskriterien (siehe Abschnitt 4.5.4) am besten: • Dynamische Strukturen mit einer allgemeinen Java-Repräsentationsschicht, • JDO mit speziellen Java-Repräsentationsschichten ohne Datenbankoperationen, • reines JDBC bzw. manuelles Mapping um allgemeine Java-Repräsentationsschichten erweitert. Diese Lösungen unterscheiden sich stark in ihrer grundsätzlichen Erneuerungsnotwendigkeit zur bisherigen OpenRA-Implementierung und der SQL-Lastigkeit. Hingegen erreichen alle diese Lösungen das Ziel der einseitigen Festlegung, also von Datenbankseite oder Codeentwicklungsseite aus, eines individuellen Datenmodells für die RA, womit die Entwicklungszeit und z.B. Zeit für Fehlerkontrolle stark verkürzt werden kann. Bei JDO geschieht dies von der Java-Seite aus, indem stets eine individuelle Repräsentationsschicht entwickelt wird. Damit wird zwar immer eine Neukompilation dieser und vorhandener Klassen notwendig, aber die Repräsentationsschicht enthält keinerlei Datenbankmethoden bzw. -operationen, da diese von JDO automatisch übernommen werden. Auch ist es denkbar, über eine Hilfstabelle mit JDO allgemeine Repräsentationsschichten zu verwenden, was jedoch nicht sinnvoll ist sowie die Bedeutung und Effizienz von JDO in Frage stellt. Bei dynamischen Strukturen und einer reinen JDBC-Lösung, wie in Abschnitt 4.7.1 beschrieben, ist durch die mögliche Verwendung von allgemeinen Repräsentationsschichten bei individuellen Datenmodellen für TrustCenter-Szenarien keine Neukompilation des OpenRAQuellcodes notwendig. Dafür werden Tabellen bzw. logische Strukturen der Datenbank manuell entwickelt bzw. erstellt. Der große Vorteil von dynamischen Strukturen (siehe Abschnitt 4.8.3) ist, daß die zu definierenden Tabellen immer dieselben sind, da die individuellen Tabellen mittels Datensätzen definiert werden, anders als bei der reinen JDBC-Lösung, bei welcher stets individuelle Tabellendefinitionen erstellt werden. Die gezeigte reine JDBC-Lösung wiederum ist leicht und schnell in das vorhandene OpenRA-Konzept zu integrieren, da sie darauf direkt aufbaut und keine grundlegende Erneuerung darstellt. Des weiteren hat die reine JDBC-Lösung bzw. das manuelle Mapping den großen Vorteil, äußerst flexibel und auch auf ungewöhnliche sowie sehr individuelle Anwendungsszenarien einstellbar zu sein. Der Nachteil von JDO ist die fehlende Unterstützung von SQL für spezielle Datenbankoperationen und das notwendige Benutzen von JDOQL für individuelle Suchvorgänge nach Datenbankobjekten, z.B. nach dem vom TrustCenter vergebenen Distinguished Name für ein PKI-Mitglied. Denn JDOQL hat sich noch nicht durchgesetzt und ist ebenfalls noch nicht standardisiert. SQL ist wesentlich mächtiger und bietet im Gegensatz zu JDOQL den großen – 105 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Vorteil der Verbreitung sowie Unterstützung in allen Datenbanksystemen und Datenbankwerkzeugen, der Standardisierung und der Effizienz bzw. allgemeinen Optimierungsmethoden etc. Des weiteren handelt es sich bei JDO selbst zwar um einen Standard aber ebenfalls nur um eine API, für die es z.Z. noch keine kostenlose Implementierung gibt. Jedoch kann man die jeweilige JDO-Implementierung auf einfache und flexible Weise wechseln. Dennoch ist zu erwähnen, daß JDO für Datenbank-lastige Applikationen gedacht ist, also für Applikationen mit dem Augenmerk auf Datenbankoperationen und einem äußerst großen Aufkommen an Datenbankzugriffen. Der Nachteil von dynamischen Strukturen ist u.U. der ineffizientere Betrieb bzw. die ineffizientere Rechenleistung, da z.B. viele SQL-Zugriffe für einen einfachen Datensatz-Zugriff nötig sind. Dies ist etwa bei der reinen JDBC-Lösung nicht der Fall, womit sie recht effizient wird. Weitere Anmerkungen bzgl. der Realisierung einer TrustCenter-Datenbank finden sich in Abschnitt 4.10. Die dort geschilderten Aspekte beeinflussen die Weiterentwicklung von FlexiTrust ebenfalls grundlegend und somit auch die Wahl einer Persistierungslösung. 4.10 Weiterführende Überlegungen In diesem Abschnitt werden weitere mögliche Datenbank-Anwendungen innerhalb von TrustCentern und von FlexiTrust sowie weitere wichtige Aspekte und Ausbaumöglichkeiten für TrustCenter-Datenbanken beschrieben. Diese bedeuten neben Änderungen an der gezeigten Datenbankapplikation ebenfalls Änderungen am ursprünglichen TrustCenter-Datenmodell aus Abbildung 17 auf Seite 53. 4.10.1 Administration und Absicherung von Datenbanken Z.Z. existiert bei FlexiTrust kein ausgewogenes System bzgl. der Benutzerverwaltung für die TrustCenter-Datenbank. Statt dessen wird beim zugehörigen Datenbanksystem ein Benutzer eingerichtet, welcher von allen berechtigten Personen für Datenbankänderungen benutzt wird und dazu autorisiert ist. Bei zentraler Antragstellung mit zentraler Datenbank ist diese Vorgehensweise noch akzeptabel, sie wird jedoch z.B. auch bei dezentraler Antragstellung mit zentraler Datenbank (siehe auch Abschnitte 2.4 und 4.2) verwendet. Alle gängigen Datenbanksysteme bieten eine ausführliche Benutzerverwaltung an, z.B. für die Verwaltung von Lese- und Schreibrechten, und mittels JDBC hat man auch die Möglichkeit, sich für eine Datenbankverbindung per Benutzernamen und Paßwort an dieser Datenbank anzumelden. Es ist ebenfalls zu beachten, daß u.U. benutzte Persistenz-Frameworks mit der Benutzerverwaltung, z.B. eines SQL-Servers, umgehen und die von JDBC vorgesehene Datenbankanmeldung nutzen können. Des weiteren muß natürlich auch bei der Datenbankapplikation, wie z.B. der OpenRA bei FlexiTrust, die individuelle Anmeldung, etwa mit Benutzername und Paßwort inkl. deren vorheriger Vergabe, vorgesehen sein bzw. eingefügt werden. Eine alternative Lösung ist es, eine Benutzerverwaltung unabhängig von der des Datenbanksystems in der Datenbankapplikation selbst zu realisieren. Dann würden beispielsweise Benutzername und Paßwort in eigenen Tabellen gespeichert, und die Anmeldung an die Datenbank würde durch den eigenen Applikationscode erfolgen, und z.B. nicht über JDBC. Damit erhält man eine beliebige Granularität bzgl. der Zugriffssteuerung für Daten, man muß jedoch auch für ausreichend Sicherheit durch die eigene Applikationsentwicklung sorgen, z.B. bei Fernanmeldungen an die Datenbank. Führt man eine ausführlichere Benutzerverwaltung bei der TrustCenter-Datenbank bzw. Datenbankapplikation ein, hat dies einige Vorteile. So ist es möglich, detaillierte und individuelle – 106 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Logs bzw. Aufzeichnungen zu führen, unabhängig vom benutzten Datenbanksystem sowie von dessen Angebot und Granularität. Dies steigert die Nachvollziehbarkeit und Rückverfolgung von Aktionen, sofern solche Logs41 gespeichert und abgesichert werden. Festhalten folgender Sachverhalte bzgl. Datenbankveränderungen ist beispielsweise denkbar: • Welche Änderungen wurden durchgeführt, • welche Person hat Änderungen durchgeführt, • wann wurde die Änderung durchgeführt usw. Solche Logs können teilweise über Systeme erstellt werden, die das jeweilige Datenbanksystem anbietet, z.B. Vermerk des Einfügedatums eines Datensatzes. Andererseits kann man über die Datenbankapplikation selbst beliebige Aufzeichnungen festlegen und gestalten. So ist es z.B. vorstellbar, Tabellenstrukturen zu verdoppeln und Vorgänger von geänderten Datensätzen als Log zu sichern, wobei hier auch stets der Bezug zum an der Datenbank angemeldeten Benutzer möglich ist. Das Führen derartiger Logs kann natürlich die Effizienz bzw. Rechenleistung der Datenbankapplikation beeinflussen. Die Stärke der Beeinflussung ist je nach Anforderung an die Datenbankapplikation spürbar, also etwa weniger spürbar bei Applikationen, deren Schwerpunkt nicht bei Datenbankzugriffen liegt. Neben Administration der Datenbank und Führen von Logs ist die weitere Absicherung der Datenbank bei lokalen Zugriffen und Fernzugriffen wichtig und überlegenswert. Während Zertifikate stets signiert werden und deren Gültigkeit dadurch gesichert ist, ist eine Signierung von Registrierungsdaten in der TrustCenter-Datenbank nicht sinnvoll. Da der Standort der Datenbank in der Praxis stets abgesichert sein muß, ist dies auch nicht notwendig. Dennoch ist es denkbar, die Datenbank z.B. auf ein verschlüsseltes Dateisystem aufzusetzen. Bei zentraler TrustCenter-Datenbank und dezentraler Registrierung von potentiellen PKIMitgliedern (siehe z.B. Abbildung 19) sind Fernzugriffe auf die TrustCenter-Datenbank und somit Anmeldungen an der Datenbank bzw. Authentifikationsvorgänge unumgänglich. Die Authentifikation ist hierbei sehr sicherheitskritisch, da der Schutz von Registrierungsdaten und von deren Verknüpfung mit Zertifikaten ein hohes Ziel des TrustCenters als Vertrauensinstanz einer PKI ist (siehe auch Abschnitte 2.4 und 4.1). Auf die Verwaltung von verschiedenen Benutzern für Datenbankzugriffe wurde bereits eingegangen. Deren Vorteile sind natürlich auch auf Fernzugriffe übertragbar. Des weiteren muß bei Fernzugriffen die Übertragung zwischen lokaler Applikation und TrustCenter-Datenbank bzw. zentraler Datenbankapplikation geschützt werden, z.B. zwischen einem Web-Formular und dem Server bei der OpenRA. So müssen folgende Aspekte sichergestellt sein: • Registrierungsdaten müssen verschlüsselt und integer übertragen werden, • Registrierungsdaten dürfen nur von autorisierten Personen eingefügt werden, • Paßwort-basierte Authentifikation findet nur verschlüsselt statt und ist auch gegen ReplayAttacken gesichert. Bei Fernzugriffen ist dies deshalb unumgänglich, weil es z.B. möglich ist, Übertragungen mitzuhören oder zu verändern. Das Absichern einer Fernverbindung kann dabei einerseits durch die Datenbankapplikation erfolgen, wodurch die genutzten Methoden, z.B. kryptographische 41 Bei FlexiTrust werden bereits Logs geführt, allerdings in Form einer Datei bzw. eines Logfiles, wie z.B. in der DBAccess.java“ ” (siehe Abschnitt 4.4.1) zu sehen. – 107 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Protokolle, genau festgelegt werden können und müssen. Andererseits kann man sich z.B. im Falle des Web-Formulars auch externen Sicherheitsstrukturen bedienen, wie der TLSImplementierung des verwendeten Browsers.42 Details zum Absichern von Verbindungen über JDBC sind z.B. in [Sam04] beschrieben. Des weiteren ist statt oder ergänzend zu einer Personen-basierten Datenbank-Anmeldung ebenso eine Workstation-basierte denkbar. Und auch die dezentrale Erfassung von Registrierungsdaten bei dezentraler TrustCenter-Datenbank, also deren Verteilung über mehrere Standorte, ist möglich und muß von der Datenbankapplikation abgesichert werden. 4.10.2 Vergabe von Distinguished Names Innerhalb einer PKI (siehe z.B. Abschnitt 2.7.6) kommen den Distinguished Names eine wichtige Bedeutung zu, nämlich als eindeutige aber lesbare Kennzeichner von Zertifikaten bzw. PKI-Mitgliedern. Bei der Antragstellung besteht das Problem, daß zu einem bestimmten Zeitpunkt einem Antragsteller bzw. dessen Registrierungsdatensatz ein Distinguished Name zugeteilt werden muß und zwar weit vor der Freischaltung des PKI-Mitgliedskontos. Denn vor der Freischaltung muß z.B. das Zertifikat des potentiellen PKI-Teilnehmers erstellt werden. Da die Antragstellung bzw. -prüfung, also der Registrierungsvorgang, innerhalb der OpenRA von FlexiTrust in mehreren Schritten erfolgt, muß also ein bestimmter Distinguished Name passend zum Antrag reserviert und u.U. auch wieder freigegeben werden. Doch zunächst wird einer Entity in Form eines Registrierungsdatensatzes bzw. eines Datenbankobjekts ein eindeutiger Zahlenwert als Kennzeichner bzw. Primärschlüssel zugeteilt, wie z.B. beim Attribut EntityNo“ aus dem hier benutzten Datenmodell aus Abbildung 17 auf Seite 53. ” Während ein solcher eindeutiger Kennzeichner ausschließlich interne Verwendung findet, sind Distinguished Names auch nach außen hin sichtbar, z.B. in Zertifikaten, und fördern vor allem die Nachvollziehbarkeit von PKI-Vorgängen (siehe auch Abschnitt 2.7.6). Es ist daher sinnvoll innerhalb des Reservierungsvorgangs für einen Distinguished Name ebenfalls eine Verknüpfung des Distinguished Names und des zugehörigen Datensatz-Kennzeichners, hier mit dem Attribut EntityNo“ als Fremdschlüssel, vorzunehmen. ” Die Grundlage für einen solchen Reservierungsvorgang kann die Tabelle T DNreserved(En” tityNo,DN,InUse,Expires,Expired)“ bilden, welche dann zur Vergabe von Distinguished Names herangezogen wird. Diese Tabelle stellt dabei den Ersatz der Tabelle T DNs“ im Datenmodell ” aus Abbildung 17 dar. Um die Vergabe zu vereinfachen, sollten alle Distinguished Names in dieser Tabelle gespeichert werden, also auch die bereits vergebenen. Letztere können durch das Flag -Attribut InUse“ gekennzeichnet werden. ” Wird nun ein Antrag für eine PKI-Mitgliedschaft gestellt, folgt die Bestimmung eines passenden potentiellen Distinguished Names für den neuen PKI-Teilnehmer. Anschließend wird geprüft, ob dieser noch nicht vergeben ist, indem man die Tabelle T DNreserved“ nach ihm ” durchsucht.43 Ist er nicht enthalten, darf er vergeben werden und die Tabelle erhält einen neuen Datensatz. Dieser Distinguished Name gilt nun als reserviert bis der Registrierungsvorgang, z.B. inkl. Überprüfung der Antragsdaten und persönlichem Erscheinen des Antragstellers bei der Registrierungsstelle, abgeschlossen ist und etwa ein entsprechendes PKI-Zertifikat erstellt44 sowie 42 Es existieren hier vielerlei Angriffsmöglichkeiten, z.B. einfaches Abhören des Netzwerkverkehrs mittels dem Programm Ethereal. Aber auch zum Absichern existieren viele Lösungen, wie das Signieren von Java-Archiven oder eben TLS etc. Die Details hierzu wurden bereits in Kapitel 1 geschildert. 43 Ein effizienter Zugriff auf das Attribut DN“ der Tabelle T DNreserved“ ist durchaus z.B. durch die Definition einer primären ” ” Indexstruktur auf dieses Attribut in der jeweiligen Datenbank möglich. 44 Die Verfahrensweise für Sonder- und Fehlerfälle im Ablauf der Vergabe von Distinguished Names ist keinesfalls trivial. Ein – 108 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER zugestellt wurde, er kann also ebenfalls wieder verfallen. In das Attribut Expires“ wird eine ” Frist für die Reservierung eingetragen, welche der speziellen individuell festgelegten Frist für Registrierungsanträge entspricht, da diese üblicherweise nicht unbegrenzt bestehen, z.B. für den Fall wenn der Antragsteller obwohl gefordert niemals persönlich erscheint. Innerhalb dieses Zeitraums kann der Distinguished Name also nicht für eine andere Person reserviert werden und gilt quasi als vergeben, ist jedoch nach außen nicht sichtbar. Soll nach Ablauf des Zeitraums bzw. der Frist der Distinguished Name für einen anderen neuen Teilnehmer reserviert werden, so kann dies geschehen und im Zuge dieses Vorgangs wird der alte abgelaufene Reservierungsdatensatz gelöscht oder mit dem Flag-Attribut Expired“ ge” kennzeichnet. Auf diese Weise ist auch eine Art Historienaufzeichnung möglich. Jedoch muß dann die Vergabe eines Distinguished Names unter Beachtung dieses Flags erfolgen, da ein Distinguished Name, der nur als Expired“ gekennzeichnet ist und sonst nicht in der Tabelle ” vorkommt, erneut vergeben werden darf. Ist der Registrierungsvorgang erfolgreich beendet, wird das Flag InUse“ gesetzt sowie der ” Distinguished Name auch in anderen Tabellen der TrustCenter-Datenbank genutzt, er ist also nun aktiv. Beim Verfall eines reservierten Distinguished Name ist eine weitere spätere Reservierung bzw. Vergabe sinnvoll, denn dieser Distinguished Name wurde noch nicht aktiv genutzt. Anders verhält es sich, bei bereits verwendeten aber abgelaufenen Distinguished Names (siehe auch Abschnitt 4.10.3). Dies kann z.B. auftreten, wenn ein Teilnehmer eine PKI verläßt. Hierbei kann die erneute Vergabe eines alten Distinguished Names, z.B. bei Namensgleichheit, problematisch sein. Für solche Fälle ist es möglich, die Tabelle T DNreserved“ um das Attribut-Flag Dead“ ” ” zu erweitern, um derartige Distinguished Names zu kennzeichnen. Bei einer Vorgehensweise dieser Art hat die Tabelle T DNreserved“ natürlich keinen Pri” märschlüssel, da selbst EntityNo“ und DN“ doppelte Attributwerte enthalten können, dies ” ” ist aber auch nicht notwendig. Mit Hilfe von folgender SQL-Anweisung z.B. erhält man eine Liste aller z.Z. reservierten Distinguished Names. Man kann ebenfalls zusätzlich noch einen Distinguished Name als Kriterium in die Anweisung einfügen, nach welchem im Speziellen gesucht wird: SELECT T_DNreserved.DN FROM T_DNreserved WHERE (T_DNreserved.Dead=No) AND (T_DNreserved.InUse=No) AND ((T_DNreserved.Expires)<=#9/30/2004#) AND ((T_DNreserved.Expired)=No)); Des weiteren müssen vor der Vergabe eines Distinguished Names separat die Dead“-, Ex” ” pired“- und InUse“-Werte abgeprüft werden. Auch muß nach gewissen Kriterien das Expi” ” red“-Flag gesetzt werden. Eine Alternative zum Umgang mit den einzelnen Flag-Attributen, also InUse“, Expired“ und Dead“, ist eine Kombination dieser zu einem einzigen Zahlenfeld ” ” ” als Attribut. Ebenso ist das Führen von Logs über Veränderungen zu empfehlen (siehe Abschnitt 4.10.1), weil damit die Nachvollziehbarkeit gerade bzgl. Distinguished Names als lesbare Kennzeichner und deren Verknüpfung mit Zahlenwerten als Kennzeichner sowie Zertifikaten gefördert wird. Folglich wird das Ziel der eindeutigen Verknüpfung von erweiterten Registrierungsdaten, also auch von Daten, welche nicht im Zertifikat enthalten sind, und Zertifikaten erreicht. solcher Fall ist das Festlegen der Distinguished Names für zwei Personen, die potentiell beide den selben Namen erhalten müßten. Ein weiteres Beispiel ist das Behandeln reservierter Distinguished Names, bei welchen der zugehörige Registrierungsvorgang erfolgreich verlief, jedoch das Erstellen des Zertifikats fehlschlug. – 109 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Man beachte, daß im Falle der Zustellung von zentral erzeugten privaten Schlüsseln mittels der CMA ein PKI-Mitgliedskonto erst freigeschaltet wird, wenn die Ankunft des privaten Schlüssels beim vorgesehenen Empfänger, dem jeweiligen PKI-Teilnehmer, bestätigt ist. Auch dessen Entry innerhalb des Verzeichnisdienstes (siehe auch Abschnitt 2.7) wird erst danach freigeschaltet und für andere PKI-Teilnehmer sichtbar, wenngleich dieser u.U. bereits besteht.45 4.10.3 Multiple Zertifikate und multiple Distinguished Names Wie in den Abschnitten 2.7.5 und 4.1.1 beschrieben, können bei heutigen PKIs durchaus mehrere Zertifikate und auch Distinguished Names pro einem einzigen PKI-Mitglied vorkommen. Dies muß auch von der Datenbankapplikation des TrustCenters verwaltet werden können. Da Zertifikate über Distinguished Names angesprochen und eindeutig zugeordnet werden können, läßt sich die Verwaltung von multiplen Zertifikaten durch die Verwaltung von multiplen Distinguished Names realisieren, etwa mit einer Tabelle T Certs(DN,Cert,Valid)“. Dennoch ” könnte man eine Tabelle zur Speicherung von Zertifikaten in der TrustCenter-Datenbank, wie bereits bei FlexiTrust vorhanden, erweitern und spezielle Zertifikatseigenschaften (siehe auch Abschnitt 2.7.5) erfassen. Auch ist es denkbar, für verschiedene Zertifikatstypen verschiedene Tabellen zu verwalten und nur eine Gesamttabelle als Verbindung oder Verknüpfung dieser Subtabellen zu führen. Klar ist, daß aus dem Zertifikat selbst z.B. dessen Gültigkeitszeitraum oder aktuell zugeordneter Distinguished Name hervorgeht. Diese Daten kann man auch zwecks einfachem Datenbankzugriff in die Tabelle T Certs“ einfügen. Auch ist es möglich, alte und ” abgelaufene Zertifikate zu archivieren, z.B. durch das Attribut Valid“, oder sie gänzlich zu ” entfernen. Die Zuordnung von Zertifikaten zu PKI-Teilnehmern bzw. deren Registrierungsdaten kann durchaus mittels eines Distinguished Names des Teilnehmers erfolgen. Die Vergabe von einfachen Distinguished Names wurde in Abschnitt 4.10.2 bereits erläutert und auch die Zuordnung von Registrierungsdaten und Distinguished Names wurde dort beschrieben. Daher lassen sich Zertifikate unter Beachtung ihres Gültigkeitszeitraums und von Revokationen über den Distinguished Name und u.U. dessen Gültigkeitszeitraum einem Registrierungsdatensatz eindeutig zuordnen. Dabei stört es nicht, wenn ein Teilnehmer mehrere Zertifikate besitzt. Eine Verwaltung etwa über die Tabelle T Certs“ ist trotzdem einfach möglich. Jedoch muß in diesem Falle natürlich ” bei der Suche nach einem passenden Zertifikat ein eindeutiger Parameter, neben einem Namen oder Distinguished Name, angegeben werden, um das gesuchte Zertifikat identifizieren zu können. Dieser Parameter ist stark abhängig vom Kontext der jeweiligen PKI, ein Beispiel ist die Suche nach dem Zertifikat eines PKI-Mitglieds zum Signieren oder Verschlüsseln – innerhalb einer PKI, bei welcher eine solche Trennung von Zertifikaten durchgeführt wird (siehe auch Abschnitt 2.7.5). Zur Verwaltung von multiplen Distinguished Names läßt sich das Datenmodell von FlexiTrust ebenfalls erweitern, z.B. auch basierend auf der Tabelle T DNreserved“ aus Abschnitt ” 4.10.2. Dazu muß eine Verknüpfung zwischen Zertifikaten trotz verschiedener Distinguished Names zu einer bestimmten Person bzw. zu einem bestimmten PKI-Teilnehmer dennoch eindeutig erfolgen. Es erscheint hierfür sinnvoll, einer solchen Person für interne Vorgänge eine eindeutige Kennzeichnung in Form eines festgelegten Zahlenwerts zu vergeben, eine ID. Im Datenmodell wird z.B. in den Personentabellen, z.B. Entity“, sowieso eine solche ID als Primärschlüssel ” 45 Siehe auch [Kar04] über das Verwalten von PKI-Aufgaben mittels CMA bzw. Verzeichnisdienst. Dabei geht es ebenso u.a. um Zustellung von Schlüsseln und Absichern von Verzeichnisdiensten. – 110 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER benutzt. Eine separate Tabelle, wie etwa T DNToEntity(DN,EntityNo,Valid)“, kann dann die” se IDs mit Distinguished Names verknüpfen. Zusätzliche Informationen, wie Gültigkeitsbeginn und -ende oder aktuelle Gültigkeit an sich sowie weitere sinnvolle Daten, für den jeweiligen Distinguished Name können dann ebenfalls dort gespeichert werden. Nach einer solchen Auslagerung der Distinguished Name-Verwaltung ist es möglich, einer bestimmten registrierten Person, mehrere Distinguished Names eindeutig zu zuordnen und evt. ebenfalls Aufzeichnungen zum Lebenszyklus veralteter Distinguished Names aufzubewahren (siehe auch Abschnitt 4.10.1). Natürlich muß durch die Datenbankapplikation des TrustCenters gewährleistet sein, daß Distinguished Names weiterhin eindeutig vergeben werden und was mit abgelaufenen aber bereits genutzten Distinguished Names im Sinne der PKI geschehen soll. Ebenfalls denkbar ist es, die Verwaltung von multiplen Zertifikaten ähnlich wie bei multiplen Distinguished Names auf Basis der Personen-ID zu gestalten. Da Zertifikate aber öffentlich sind und aufgrund ihrer Signierung einen Distinguished Name jeweils fest integriert haben, müssen sich Zertifikate bei Veränderungen der Distinguished Names ebenfalls ändern, womit sie direkt von den Distinguished Names abhängig sind – zumindest für manche Anforderung der Praxis (siehe z.B. Abschnitt 2.7). 4.10.4 Multiple TrustCenter Es ist denkbar, FlexiTrust an einem Standort oder auf einem Server nicht nur als einzelnes spezielles TrustCenter zu betreiben, sondern dort auch mehrere TrustCenter-Anwendungen, z.B. für verschiedene Gruppierungen bzw. Kunden, zu verwalten. Dazu gehört, die Zuordnung zwischen Entities bzw. deren Tabellen sowie den verschiedenen Kunden herzustellen. Eine einfache Möglichkeit dafür wird von einigen Datenbanksystemen, z.B. dem Microsoft SQL-Server, zur Verfügung gestellt, indem man an einem einzigen auf einem Server installierten Datenbanksystem mehrere Datenbankserver aufbauen kann. Diese können dann individuelle Namen erhalten sowie Tabellen beinhalten und sind voneinander vor allem beim Datenbankzugriff streng getrennt. Um weiterhin flexibel zu bleiben, kann man diese Zuordnung aber auch in die Datenbankapplikation von FlexiTrust und deren Datenmodell direkt integrieren. Hierfür existieren viele Erweiterungsmöglichkeiten des vorhandenen Datenmodells, Beispiele werden im Folgenden beschrieben. • Hilfstabelle hinzufügen: Mit Hilfe einer neuen Tabelle T Customers(TableName,Customer) könnte man Tabellen und Entities in der TrustCenter-Datenbank einem speziellen Kunden-TrustCenter mit eindeutigem Kundennamen zuordnen. • Konfigurationsdateien hinzufügen: Ähnlich wie bei den Hilfstabellen könnte man Kunden und deren Daten in Konfigurationsdateien definieren. • Dynamische Tabellendefinitionen erweitern: Bei dynamischen Tabellen (siehe Abschnitt 4.8.3) könnte man eine weitere feste Tabelle T Customers(CustomerName,TrustCenter” ID,TableID)“ einführen oder die vorhandene T Tabellen“ zur T Tables(Tab,Attr,Tab” ” ID,TrustCenterID)“ erweitern. Im letzten Fall wäre die Definition der T Customers“ ” kleiner. Bei beiden Varianten wären z.B. Entity-Tabellen direkt mit dem jeweiligen speziellen Kunden-TrustCenter verbunden. Der Vorteil dieser Lösung ist, daß die als Daten dynamisch verwalteten Tabellen natürlich auch mehrfach vorkommen dürfen, also beispielsweise mit identischen Namen. Der Primärschlüssel zur eindeutigen Kennzeichnung einer bestimmten Tabelle besteht bei dieser Variante aus den Attributen TabID“ und ” – 111 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER TrustCenterID“, wobei auch das Verbinden mit dem Distinguished Name des speziellen ” TrustCenters vorstellbar ist. • Entity-Tabellen erweitern: Bei Entity-Tabellen könnte man ein neues zusätzliches Attribut TrustCenterID“ einfügen. Die Zuordnung von Kunden und Kundennamen zur ” TrustCenterID“ kann dabei über Hilfstabellen oder Konfigurationsdateien erfolgen, wo” bei auch hier wieder das Verbinden mit dem Distinguished Name des speziellen TrustCenters vorstellbar ist. Konkrete Personendaten könnten dann z.B. über eine Tabelle Entity(...,TrustCenterID)“ gespeichert und jeweils einem der Kunden-TrustCenter zuge” ordnet werden. Bei allen hier gezeigten Möglichkeiten zur Realisierung von multiplen TrustCentern muß der Quellcode von FlexiTrust verändert werden, um mit einer der Lösungen umgehen zu können. Die Repräsentationsklassen der OpenRA etwa, also der Datenbankapplikation, können dazu um einen zusätzlichen Parameter erweitert werden, womit z.B. eine Entity eines eindeutig bezeichneten Kunden angefordert werden kann. Für jeden Teil der TrustCenter-Applikation bedeutet das Vorhandensein multipler TrustCenter, also mehrerer verschiedener Issuer, grundlegende Änderungen. Denn unterschiedliche Issuer führen zu unterschiedlich strukturierten Distinguished Names, was natürlich ebenfalls Auswirkungen auf die Verwaltung von Distinguished Names und das ursprüngliche Datenmodell aus Abbildung 17 hat. Um diese zu unterstützen, müssen alle Applikationsteile dementsprechend angepaßt werden. Des weiteren muß man sichere administrative Vorgänge zur strikten Trennung der Datenquellen für einzelne Kunden entwickeln. Die bisherige Vorgehensweise bei FlexiTrust bzgl. der Benutzerverwaltung der Datenbank (siehe auch Abschnitt 4.10.1) etwa ist dann nicht mehr fortzuführen. Denn auch bei einem TrustCenter-Produkt, welches geeignet ist, viele verschiedene TrustCenter zugleich zur Verfügung zu stellen, müssen grundlegende Ziele von PKIs (siehe auch Abschnitt 2.1) gewährleistet werden, wie z.B. die isolierte Kommunikation innerhalb eines bestimmten Personenkreises. 4.10.5 Unterstützen des Verzeichnisdienstes Es ist ebenfalls möglich, die TrustCenter- bzw. RA-Datenbank oder genauer das zugrundeliegende Datenbanksystem für den LDAP-Verzeichnisdienst des TrustCenters zu nutzen. Je nach Aufteilung von TrustCenter-Komponenten (siehe Abschnitt 2.3.1) ist dies überhaupt möglich, sinnvoll oder sicher (siehe auch [Kar04]). Es kann auch notwendig sein, RA-Datenbank und Verzeichnisdienst zu trennen, obwohl beide mit sich überschneidenden Daten arbeiten. OpenLDAP (siehe Abschnitt 2.7.3 bzw. [Ope04]) beispielsweise besitzt einerseits eine integrierte Datenbank als Back-End, aber es ist andererseits ebenfalls möglich, ODBC-Datenbanken als Back-End zu verwenden. Eine mögliche Anwendung für die Kombination von RA-Datenbank und Verzeichnisdienst liegt bei einer Verzeichnisdienst-Realisierung mit LDAP und Attribute Extraction (siehe Abschnitt 2.7ff.) vor. So könnte man in diesem Falle bestimmte Attribute aus der RA-Datenbank für die Zertifikat-Suche auf dem LDAP-Tree zur Verfügung stellen, z.B. Telefonnummer falls vorhanden, und zwar indem man diese auch im jeweiligen LDAP-Entry ablegt. 4.10.6 Erstellen von Datenbank-Berichten bzw. Datenbank-Auszügen Es ist in der Praxis oftmals sinnvoll oder notwendig Datenbank-Berichte zu erstellen, etwa für Statistiken oder zur Bestimmung fehlerhafter Datensätze. – 112 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Um solche Berichte bei FlexiTrust bzw. innerhalb der OpenRA zu erstellen und auszugeben, existieren u.a. folgende Möglichkeiten: • Erstellen von Java-Klassen für gängige und allgemeine Berichte, • Anbieten einer direkten SQL-Schnittstelle zur Datenbank, • Nutzen von zusätzlichen Datenbank-Werkzeugen. 4.10.7 Wahl des Datenbanksystems und Spezialisierungsbeispiel Offensichtlich ist es sinnvoll, in der Wahl eines Datenbanksystem-Produkts für eine bestimmte Datenbankapplikation frei bleiben oder zumindest sich schnell anpassen zu können. Unter Java existieren durch JDBC viele Möglichkeiten, eine Datenbankverbindung aufzubauen, z.B. über ODBC oder einen speziellen Datenbank-Treiber. Diese beiden Möglichkeiten haben jeweils ihre Vorteile und sind schlichtweg Alternativen. Des weiteren erfolgt die Festlegung einer solchen Verbindungsmethode unter Java über die Angabe eines einfachen Strings, womit einzelne Varianten leicht auszutauschen und z.B. über Konfigurationsdateien einlesbar sind. Im letzteren Fall wäre also nicht einmal eine Neukompilation des Quellcodes der Datenbankapplikation vonnöten. Auch kann man mittels ODBC die Notwendigkeit zur Änderung der Angabe von Strings für die Datenbankverbindung umgehen. Für eine konkrete Datenbankapplikation könnte man einen einmaligen bzw. eindeutigen Namen für die zugehörige im System registrierte ODBCDatenbank wählen, z.B. FlexiDB“ bei FlexiTrust. Somit wären für die Datenbankverbindung ” keine Änderungen im Quellcode oder in Konfigurationsdateien nötig, da stets dieser Name verwendet wird (siehe auch Abschnitt 4.3.1). Natürlich muß bei dieser Variante stets die ODBC-Datenquelle vor Ort eingerichtet werden. Bleibt man flexibel in der Wahl des Datenbanksystems, z.B. beim Einsatz eines TrustCenters aufgrund von jeweiligen Anforderungen oder des möglichen Kundenwunschs (siehe auch Abschnitt 3.7), hat dies natürlich auch Nachteile. Denn man darf im Quellcode Besonderheiten eines speziellen Datenbank Management-Systems (DBMS; siehe Abschnitt 3.2) und auch dessen Vorteile nicht nutzen, z.B. im Umgang mit Transaktionen oder Triggern. Bei einem TrustCenter liegt das Augenmerk jedoch nicht hauptsächlich auf der zugehörigen Datenbank. Denn einerseits ist die wichtigste Aufgabe eines TrustCenters die Realisierung einer PKI und der Umgang mit Kryptosystemen und andererseits sind die technischen Anforderungen an eine TrustCenter-Datenbank nicht mit z.B. denen einer aktiven Datenbank oder eines Online-Shops vergleichbar. Hierbei wiederum ist der Einsatz von Stored Procedures, Transaktionen, Triggern, Methoden des Recoverys usw. äußerst notwendig. Bei der Java-Implementierung FlexiTrust kommen also keine DBMS-speziellen Schnittstellen für Datenbankzugriffe zum Einsatz sondern allgemeine Standard-Wege, wie z.B. JDBC und ODBC. Probleme werden mit Java-Methoden gelöst. Ein Beispiel für die Nutzung der Besonderheiten eines Datenbanksystems bzw. Datenbank Management-Systems ist dennoch bei FlexiTrust zu sehen. Hier wird z.Z. MySQL46 als Back-End für die Datenbankapplikation genutzt. Eigenheiten von MySQL finden bei diesen beiden Java-Klassen Beachtung: • Entity.java, • XMLFormManager.java. 46 Im Unterschied zu manch anderem Datenbanksystem unterstützt MySQL keinerlei Trigger-Funktionen (siehe z.B. [Ste99]). Da diese aufgrund des Ziels der Flexibilität aber nicht genutzt werden würden und weil MySQL eine kostengünstige OpenSourceEntwicklung ist, eignet es sich gut als Back-End bei FlexiTrust. – 113 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER In der Entity.java“ wird der Datentyp der Java-Booleans in Integer umgewandelt, weil ” MySQL keine Booleans unterstützt. Diese Vorgehensweise kann allerdings beibehalten werden, da sie auch auf andere Datenbanksysteme übertragbar ist, und deren evt. Unterstützung für den Typ Boolean nicht genutzt werden muß.47 Außerdem ist in der Praxis bei der Datenerfassung in einigen Fällen die Nutzung von Booleans, also Ja oder Nein“-Werten, nicht empfehlenswert, ” zumindest falls ein entsprechendes Attribut nicht auch den Wert NULL (siehe Abschnitt 3.5.2) zugewiesen bekommen kann. Immer möglich ist es, auch mit dem Verzicht auf Booleans, mittels Zahlenwerten die Kombination Ja, Nein, unbekannt“ zu realisieren mit unbekannt“ ” ” als Standardwert. Bei der XMLFormManager.java“ wird an einer Stelle, bei welcher das Laden eines For” mular-Objekts realisiert wird, eine spezielle SQL-Anweisung des Datenbanksystems MySQL benutzt: query.append(" ORDER BY serialno LIMIT 1"); Diese hat zum Zweck, die Anzahl der zurückgegebenen Datensätze in der Query-Ausgabe zu beschränken und zwar auf einen Datensatz. Java bietet hier jedoch eine äquivalente Lösung an, die somit unabhängig von Eigenheiten eines Datenbanksystems ist. Das Interface java.sql.Statement, aus welchem stets der JavaCursor ResultSet resultiert, sieht die folgende Methode vor: void setMaxRows(int max) Sets the limit for the maximum number of rows that any ResultSet object can contain to the given number. Bei der Wahl des zugrundeliegenden Datenbanksystems kommen Transaktionen und deren Unterstützung von Seiten des DBMS für bestimmte Datenbankapplikationen, wie dem vorgestellten TrustCenter-Modell mit dessen Datenmodell, eine wichtige Rolle zu. Auf diese wird in Abschnitt 4.10.8 näher eingegangen. 4.10.8 Bedeutung von Transaktionen Die Notwendigkeit, daß ein Datenbanksystem, welches als Grundlage für die Datenbankapplikation des vorgestellten TrustCenter-Modells dient, Transaktionen und die ACID-Eigenschaften (siehe auch Abschnitt 3.3) unterstützen muß, wird im Folgenden näher erläutert. Transaktionen und die ACID-Eigenschaften sind die Voraussetzung, daß verschiedene der gezeigten Datenbankoperationen auf dem vorgestellten Datenmodell (siehe Abbildung 17 auf Seite 17) fehlerfrei funktionieren und nicht zu inkonsistenten Datenbeständen führen. Daher muß ein entsprechendes DBMS beide Merkmale, Transaktionen und ACID, besitzen, wobei diese innerhalb von Datenbankverbindungen mittels JDBC auch genutzt werden können. Man beachte, daß Transaktionsmodelle nicht nur für Datenbankoperationen existieren sondern ebenfalls für den Umgang mit reinen Codeobjekten. Im letzteren Falle muß also kein Bezug zu einer Datenbank vorhanden sein. Ein Transaktionsmodell für Java ist das Java Transaction Application Programming Interface bzw. Java Transaction API (JTA), welches Bestandteil der Java 2 Enterprise Edition (J2EE) ist. Hierbei handelt es sich auch um eine Java-Schnittstelle zum Object Transaction Service (OTS) der Common Object Request Broker Architecture (CORBA). Damit wird der Aufbau einer Transaktionsverwaltung für Java-Objekte möglich, was beispielsweise beim synchronen Datenaustausch zwischen Clients und Servern wichtig ist. 47 Wahrheitswerte werden nicht immer in allen Systemen unterstützt, wie z.B. bei Programmiersprachen. Bei C etwa muß man sich zu deren Realisierung ebenfalls mit anderen Datentypen behelfen. – 114 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER In der vorgestellten Datenbankapplikation des TrustCenter-Modells werden sowohl reine Datenbankobjekte sowie Codeobjekte, also Instanzen von Repräsentationsklassen, verwendet. Es reicht für die Datenbankapplikation jedoch nicht aus, eine reine Transaktionsverwaltung für Java-Objekte zu nutzen. Denn für Operationen auf der zugrundeliegenden Datenbank muß auch das DBMS Transaktionen zur Verfügung stellen sowie die ACID-Eigenschaften gewährleisten. Diese beiden Merkmale sind beispielsweise an essentieller Stelle unumgänglich, nämlich beim Umgang mit mehrstufigen Entity-Objekten (siehe auch Abschnitt 4.6.2) des Datenmodells aus Abbildung 17. Sie gewährleisten hier die referentielle Integrität (siehe Abschnitt 3.4.5) des Datenbestandes und sorgen dafür, daß keine Inkonsistenzen entstehen. Folgendes einfaches aber konstruiertes Beispiel zeigt, wie ein inkonsistenter Datensatz entstehen kann, welcher die referentielle Integrität verletzt: Einfügen eines Datensatzes in T_Student [...] (Einfügen erfolgreich) - Systemabsturz Vorgesehenes Einfügen des passendes Datensatzes in T_Person (Findet nicht mehr statt) Vorgesehenes Aktualisieren des Fremdschlüssels in T_Student (Findet nicht mehr statt) Zum Zeitpunkt nach dem Systemabsturz ist in T Student“ ein Datensatz zu finden, für den ” kein Datensatz in T Person“ existiert. Mit Hilfe des Einsatzes von Transaktionen kann ein ” solcher Fall jedoch verhindert werden. Die Aktualisierung bzw. das Einfügen von mehrstufigen Objekten erfolgt dann allgemein so: BOT [...] Datenmanipulation an zwei oder mehr Tabellen [...] EOT Geschieht hier beispielsweise während der Transaktion, also noch vor EOT, ein Systemabsturz, so garantiert das DBMS, daß keine Änderungen an der Datenbank sichtbar sind. Nach einem erfolgreichen EOT jedoch, sind alle Änderungen persistent. Ein solches Vorgehen ist bei der Nutzung von JDBC und Java ebenfalls einfach möglich und wird durch folgendes Zitat aus der API-Dokumentation zum Interface java.sql.Connection gut beschrieben: By default a Connection object is in auto-commit mode, which means that it automatically commits changes after executing each statement. If auto-commit mode has been disabled, the method commit must be called explicitly in order to commit changes; otherwise, database changes will not be saved. Die vorgestellte Variante einer JDO-Realisierung für die Datenbankapplikation nutzt das JDOeigene Interface javax.jdo.Transaction (siehe Klasse testJDOPerson.java“ aus Abschnitt ” 4.7.3). Hierbei handelt es sich um ein separates Transaktionsmodell speziell für JDO im Umgang mit Datenbanken. Auch Concurrent Transactions“ werden hier unterstützt. ” – 115 – 4 DATENBANKAPPLIKATIONEN FÜR TRUSTCENTER Letzteres, also die Unterstützung des Mehrbenutzerbetriebs (siehe auch Abschnitt 3.2), ist ebenfalls für das vorgestellte TrustCenter-Modell bzw. dessen Datenbankapplikation unumgänglich. Der Mehrbenutzerbetrieb setzt voraus, daß das benutzte DBMS die ACID-Eigenschaften gewährleistet und sich somit parallele Transaktionen nicht behindern. Z.B. darf ein von einer Transaktion eingefügter Datensatz erst nach Beendigung des gesamten Einfügevorgangs für andere Transaktionen sichtbar sein (Isolation; siehe Abschnitt 3.3). D.h., selbst beim Verzicht auf mehrstufige Objekte, wodurch also stets nur auf einer Tabelle innerhalb einer Transaktion operiert würde, ist ein DBMS mit ACID-Eigenschaften für den Mehrbenutzerbetrieb der Datenbankapplikation erforderlich. – 116 – A Anhang A.1 Beigefügte Software bzw. Dateien Zu dieser Arbeit gehören die folgenden Java-Klassen und Dateien, welche auch zum Teil in Kapitel 4 genauer beschrieben wurden: • Acc2DynTab.java, • AccJDBC.java, • ChefFromPersonOnly.java, • Entities.java, • JDOPerson.java, • jdori-1 0-fcs-src-04 Mar 2002.zip, • MyTestDB.mdb, • MyTestDB.zip, • PersonSerial.java, • PersonAccResset.java, • PersonOnly.java, • testAcc2DynTab.java, • testAccJDBC.java, • testChefFromPersonOnly.java, • testEntities.java, • testJDOPerson.java, • testJDOPerson.jdo, • testPersonAccResset.java, • testPersonSerial.java, • testPersonSerial.txt. Hierbei sind die Dateien test*.java ausführbare Programme bzw. einfache Test-Klassen für die restlichen bereits in dieser Arbeit vorgestellten Java-Klassen. Des weiteren ist für das JDOBeispiel ein ZIP-Archiv beigefügt, welches das JDO-Paket inkl. Dokumentationen enthält. – 117 – A A.1.1 ANHANG Beispiel-Datenbank MyTestDB.mdb ist eine Access-Datenbankdatei, die für verschiedene Beispiele dieser Arbeit als relationale Datenbank dienen kann und mittels ODBC bzw. JDBC-ODBC-Bridge angesprochen wird. Die Vorteile einer solchen – sehr leistungsfähigen – Datenbank bzw. Datenbankdatei sind: • Gute Eignung für Tests, • einfache Weitergabe und dies ohne Installation, • einfache Kontrolle von Dateninhalten. Zur Nutzung als reine Datengrundlage muß man nicht im Besitz des Erzeugerprogramms Mi” crosoft Access“ sein sondern nur eines passenden ODBC-Treibers. Unter Microsoft Windows“ ” erfolgt die Einrichtung dieser Datei bzw. Datenbank einfach über die Systemsteuerung bzw. den Menüpunkt ODBC-Datenquelle“ und dort über Benutzer-DSN hinzufügen“. An dieser ” ” Stelle gibt man den Pfadnamen zur MDB-Datei an und wählt einen Namen für die ODBCQuelle, z.B. MyTestDB“ wie in den Beispielen dieser Arbeit. ” Selbstverständlich kann als Datenbankgrundlage für die vorgestellten Java-Klassen auch jedes andere Datenbanksystem mittels JDBC und ggf. ODBC genutzt werden, wobei die notwendigen Tabellen für die Beispiele in den jeweiligen Abschnitten dieser Arbeit angegeben sind. Des weiteren enthält die Archiv-Datei MyTestDB.zip Textdateien mit allen benutzten Tabelleninhalten und SQL-Anweisungen. A.2 Technische Voraussetzungen Die Java-Quelltexte zu dieser Arbeit (siehe Abschnitt A.1) wurden mit Ant 1.4.1“ unter dem ” JDK 1.2.2“ kompiliert und getestet. ” JDO bzw. JDORI von Sun, aus dem Internet heruntergeladen – siehe [Sun04-1], wurde in der Version 1.0.1 eingesetzt. Beim Ausführen des JDO-Beispiels waren die folgenden JavaArchive aus dem JDO-Paket im CLASSPATH: • btree.jar, • jdo.jar, • jdori.jar, • jdori-enhancer.jar. – 118 – Literatur [Ada02] Carlisle Adams & Steve Lloyd, Understanding PKI: Concepts, Standards, and Deployment Considerations, Addison-Wesley, Second Edition, 2002 [Bes97] Bestavros et alii, Real-time Database Systems – Issues and Applications, Kluwer Academic Publishers, 1997 [Boe02] Dr. W. Böhmer, VPN – Virtual Private Networks, Carl Hanser-Verlag, 2002 [Buc04] Prof. Dr. Johannes Buchmann, Einführung in die Kryptographie, 3. Auflage, SpringerVerlag, 2004 [Bus02] Dr. Christoph Busch & S. Wolthusen, Netzwerksicherheit, Spektrum Akademischer Verlag, 2002 [Cha00] David W. Chadwick, Secure Directories, 2000 [Cha03-1] David W. Chadwick, Deficiencies in LDAP when used to support Public Key Infrastructures, 2003 [Cha03-2] David W. Chadwick, Modifying LDAP to Support X.509-basedPKIs, 2003 [Dam01] Jens Dambruch, OpenRA – Framework zur flexiblen Formularverarbeitung, Diplomarbeit an der TU Darmstadt – Fachbereich Informatik, 2001 [Dat03] Date, An Introduction to Database Systems, Addison Wesley, 2003 [Eck02] Prof. Dr. Claudia Eckert, IT-Sicherheit, Oldenbourg-Verlag, 2002 [Elm94] Elmasri & Navathe, Fundamentals of Database Systems, Addison Wesley, 1994 [Ern04] Andreas Ernst, Quasi-stellares Objekt, Javamagazin, S.85ff., 03/2004 [Fle04] FlexiProvider, www.flexiprovider.de, 2004 [Fro01] Daniel Fröhlich et alii, Java Data Objects (JDO) im Überblick, Java Spektrum, 04/2001 [Gro93] Grolier Inc., New Grolier Multimedia Encyclopedia/Grolier’s Academic American Encyclopedia, 1993 [Hae99] Härder et alii, Datenbanksysteme – Konzepte und Techniken der Implementierung, Springer-Verlag, 1999 [Heu00] Heuer & Saake, Datenbanken – Konzepte und Sprachen, Thomson Publishing, 2000 [Hom04-1] Frank Homann, Randomized Addition-Subtraction Chains as a Countermeasure against Power Attacks, Seminarvortrag und -ausarbeitung nach dem gleichnamigen Paper an der TU Darmstadt – Fachbereich Informatik, 2004 [Hom04-2] Frank Homann, Verzeichnisdienst in der PKI, Seminarvortrag und -ausarbeitung an der TU Darmstadt – Fachbereich Informatik, 2004 [Inf98] Informix Software Inc., Informix Guide to SQL, 1998 [Jak04] Robert Jakimovski, JDO-Anwendungen entwerfen, Java Spektrum, 01/2004 – 119 – LITERATUR [Jav04] Java Persistence Object Manager (JPOM), www.jpom.de, 2004 [Jor02-1] David Jordan, A comparison between Java Data Objects (JDO), Serialization and JDBC for Java persistence, JDOcentral.com, 03/2002 [Jor02-2] David Jordan, JDOQL – The JDO Query Language, Javapro.com, 07/2002 [Jor03] David Jordan & Craig Russell, JDO or CMP?, ONJava.com, 05/2003 [Kan04] Sebastian Kanthak, XML-Formulare in der RA, Praktikumsarbeit an der TU Darmstadt – Fachbereich Informatik, 2004 [Kar02-1] Vangelis Karatsiolis, Publishing PKI Information, Vortrag an der TU Darmstadt, 2002 [Kar02-2] Vangelis Karatsiolis, Certificate Management and Directories, Vortrag an der TU Darmstadt, 2002 [Kar04] Vangelis Karatsiolis et alii, Using LDAP Directories for Management of PKI Processes, 2004 [Kru00] Guido Krüger, Go To Java 2 – Handbuch der Java-Programmierung, 2. Auflage, Addison Wesley, 2000 [Men96] A. Menezes & P. van Oorschot & S. Vanstone, Handbook of Applied Cryptography, CRC Press, 1996 [Mey90] Meyers Lexikonverlag, Meyers Lexikon, 1990 [Mic00] Microsoft, Microsoft Developer Network (MSDN) Library, 2000 [Mue02] Klaus Müllner et alii, Java-basierte Datenhaltung, Java Spektrum, 11/2002 [Nzz01] NZZ Online, Versteckspiele mit der Musikindustrie, www.nzz.ch/2001/04/27/em/page-article7CTK0.html, 2001 [Ope04] OpenLDAP Project, www.openldap.org, 2004 [Osw01] Elisabeth Oswald & Manfred Aigner, Randomized Addition-Subtraction Chains as a Countermeasure against Power Attacks, Graz University of Technology, 2001 [Poe03] Poet Software GmbH, Performance with FastObjects for JDO, 08/2003 [Ram00] Ramakrishnan, Database Management Systems, McGraw Hill, 2000 [RSA04] RSA Laboratories, Public-Key Cryptography Standards, www.rsasecurity.com, ab 1991 [Rus01] Craig Russell, Java Data Objects - Proposed Final Draft 3, Sun Microsystems Inc., 2001 [Sal97] Arsalan Saljoughy, Object persistence and Java, Javaworld.com, 05/1997 [Sam04] Dr. Bruce J. Sams, Sicheres JDBC, Javamagazin, S.42ff., 03/2004 [Sch01] Markus Schuster, OpenRA – Framework zur flexiblen Formularverarbeitung, Diplomarbeit an der TU Darmstadt – Fachbereich Informatik, 2001 – 120 – LITERATUR [Sol03] SolarMetric, Persistence Frameworks – JDO simplifies the “Buy versus Build“ decision, 2003 [Sta03] Hans Stadtherr, JDO im Einsatz, Java Spektrum, 03/2003 [Ste99] Guido Stepken, MySQL Datenbankhandbuch, 1999 [Sun01] Sun Microsystems, RMI Specification – RMI API and System, 2001 [Sun04-1] Sun Java-Systeme, java.sun.com, 2004 [Sun04-2] Sun-Entwicklerartikel zum Thema Sicherheit“, ” developer.java.sun.com/developer/technicalArticles/Security, 2004 [Tei97] J. Teich, Digitale Hardware/Software-Systeme, Springer-Verlag, 1997 [Ull00] Christian Ullenboom, Java ist auch eine Insel, 2000 [Ver99] VeriSign, Directories and Public Key Infrastructure (PKI), 1999 [Wan04] Gerhard Wanner et alii, Persistenzoperationen mit Mustern optimieren, Java Spektrum, 01/2004 [Wid96] J. Widom & S. Ceri, Active Database Systems – Triggers and Rules for Advanced Database Processing, Morgan Kaufmann, 1996 [Zoe02] Jens Zörkler & Torsten Hofacker, FormsServlet – A servlet for the RegistrationAuthority, Praktikumsarbeit an der TU Darmstadt – Fachbereich Informatik, 2002 [Zoe03] Jens Zörkler, Einführung einer Public-Key-Infrastruktur in einer Universität, Diplomarbeit an der TU Darmstadt – Fachbereich Informatik, 2003 – 121 – Abbildungsverzeichnis Athene – Symbol der TU Darmstadt . . . . . . . . . . . . . . . . . . . . . . . . 1 Einfache Verschlüsselung mit Buchstaben-Tauschsystem . . . . . . . . . . . 2 Symmetrische Verschlüsselung . . . . . . . . . . . . . . . . . . . . . . . . . 3 Asymmetrische Verschlüsselung . . . . . . . . . . . . . . . . . . . . . . . . 4 Erstellen und Verifizieren digitaler Signaturen . . . . . . . . . . . . . . . . . 5 Beispiel für ein Zertifikat mit Distinguished Names . . . . . . . . . . . . . . 6 Struktur des TrustCenters FlexiTrust . . . . . . . . . . . . . . . . . . . . . 7 Auszug aus dem LDAP-Tree am Fachbereich Informatik der TUD . . . . . . 8 Namensgebung der PKI am Fachbereich Informatik der TUD . . . . . . . . . 9 Struktur eines Datenbank Management-Systems . . . . . . . . . . . . . . . 10 Daten ohne und mit Struktur . . . . . . . . . . . . . . . . . . . . . . . . . 11 Nicht-verteilte Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 ERM-Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Beispiel für eine Vereinigung in der Relationenalgebra . . . . . . . . . . . . . 14 Beispiel für ein Kartesisches Produkt in der Relationenalgebra . . . . . . . . 15 Einfache Selektion mit SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Join mit SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Ausschnitt aus dem Datenmodell eines TrustCenters . . . . . . . . . . . . . 18 Praktisches Beispiel für eine real vorkommende Personentabelle . . . . . . . 19 Grafik von der Arbeitsgruppe Prof. Buchmann über das RBG-TrustCenter . . 20 Einfache Personentabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Tabelle T Relation im TrustCenter-Datenmodell . . . . . . . . . . . . . . . 22 Umsetzungsmöglichkeit für eine einfache Steuertabelle . . . . . . . . . . . . 23 Tabellendefinitionen durch Strukturmanipulation . . . . . . . . . . . . . . . 24 Dynamische Tabellendefinitionen durch Datenmanipulation . . . . . . . . . . 25 Attributwerte bzw. Datensätze bei dynamischen Tabellen . . . . . . . . . . . 26 SQL-Anweisung zum Zusammensetzen von Daten aus dynamischen Tabellen 27 Zusammenfassung der Persistierungsmöglichkeiten . . . . . . . . . . . . . . – 122 – . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 7 11 12 16 24 26 32 36 38 41 42 44 45 46 47 48 53 56 58 74 85 98 100 101 102 103 104 Index AES, 11 Angriffe, 17 Anonymität, 9, 15 Attacken, 17 Authentifikation, 8, 10, 14, 107 Authentifizieren, 8, 14 authentisch, 15 Authentisieren, 8 Authentizität, 8, 9, 15, 25 Autorisierung, 8 Brechen, 20 Brute Force-Attacke, 17 Certificate Management Authority, 25, 29 Chipkarten, 20 CMOS-Transistor, 19 Codekarte, 8 CORBA, 114 Cross-Zertifizierung, 33 Daten, 40 Datenbank, 37 Backup, 37 Cursor, 50 Java-Cursor, 50, 80, 82, 95, 114 Recovery, 37 Relationale, 34, 43 Zugriff, 51 Datenbank Management-System, 37 ACID, 39 Atomarität, 39 Backup, 40 Concurrency Control, 40 Correctness Criteria, 40 Coupling Modes, 39 Dauerhaftigkeit, 39 Isolation, 39 Konsistenz, 39 Recovery, 40 Transaktion, 39 Trigger, 39 Datenbankmodell, 6, 52 Back-End, 50, 112 Effizienz, 73 Hilfstabelle, 97 Klassenstruktur, 69 Repräsentationsklasse, 72, 75, 84 Repräsentationsschicht, 69 Steuertabelle, 97 Tabellenstruktur, 99 Zugriffsschicht, 69 Datenbanksystem, 37 Datenhaltung, 52 Datenmodell, 40, 41 Beziehungen, 42–44, 46 Datensatz, 41 Entity, 68 Korrektheitsbedingungen, 41 Objekt, 41 Objekttyp, 41 Operatoren, 41 Relationales, 43 Relationen, 43 Relationenalgebra, 43 Schlüssel, 43 Strukturen, 41 Tupel, 41 Datenunabhängigkeit, 37, 39 Datiertheit, 8, 16 Datierung, 8 DES, 11, 17 Diffie-Hellman, 12, 18 Direct Trust, 22 Directory Service, 25 DoS-Attacke, 18 DPA, 19 ECC, 13 eCommerce, 9 Effizienz, 6, 39, 43, 72, 73, 105, 106, 108 Applikationsentwicklung, 51, 52, 73, 89 Benutzbarkeit, 73 Bereiche, 73 DBMS, 37, 38 Hardware, 51 hocheffizient, 39, 40 Indizes, 49 Kryptosysteme, 8, 12–15, 17, 19 Query, 45 Rechenleistung, 51, 52, 73, 86, 89, 94, 97, 104, 107 Software, 51 SQL, 45, 95, 106 – 123 – INDEX Eingebettete Systeme, 7 EC-Karte, 7 Handy, 7 ElGamal, 12 eMail, 8, 9, 19, 25, 29 Enigma, 7 Entschlüsselung, 10 Ethereal, 108 Flexibilität, 6, 23, 52, 57–59, 68–70, 72, 86, 94, 98, 103, 106, 111, 113 FlexiTrust, 6, 22, 26, 28, 55, 57, 59, 61, 62, 69, 71, 72, 74, 104–106, 108, 110–113 OpenRA, siehe OpenRA Struktur, 25 Framework, 23, 58, 61, 83, 93, 106 Funkverbindung, 9, 20, 21 Hash-Funktionen, 14 Message Digest, 14 HMAC, 15 Home-Banking, 8 IBM DB2, 51 Implementierung, 17 Indizes, 49 Informationen, 30, 37, 40, 41, 43, 55, 69 Informix, 51 Integrität, 8, 15 Internet, 9, 20, 21 IPSec, 21 ISO, 20 J2EE, 57, 87, 89, 114, 118 JDBC, 51, 59, 83, 113 JDO, 83, 89 Join, 43, 46 JTA, 114 Kerberos, 20 Kerckhoff-Prinzip, 17 Key Authority, 25, 28 Keylogger, 7 Kompatibilität, 31, 34, 43, 58, 59, 94 Kryptoanalyse, 7, 17 Kryptographie, 7, 17 Kryptologie, 17 Kryptosystem, 10 Kryptoverfahren, 10 Laufzeit, 13 MAC, 14, 15 Tag, 14 Verifizieren, 14 Man in the Middle, 18, 23 Matrizenmultiplikation, 11 Microsoft SQL-Server, 51, 111 MySQL, 51, 71, 72, 113, 114 Nicht-Abstreitbarkeit, 9 Objekt-Relationales-Mapping, 69, 83 Objektorientierung, 41, 82 Klasse, 41 Konstruktoren, 42 mehrstufige Objekte, 74, 75, 80, 85 Objekt, 41 Vererbung, 64, 80 ODBC, 51, 59, 112, 113 OpenRA, 52, 61, 62, 66, 68, 71, 75, 81, 84, 86, 105–108, 112, 113 Flexibilität, siehe Flexibilität Formulare, 61 Oracle, 51 OSI-Modell, 20 Paßwort, 8 Persistierung, 6, 37, 39, 82, 95 Objekt-basiert, 82–84, 87, 89 Ziele, 71 PGP, 20, 22 PKCS, 57 PKI, 21, 22 Aufgabe, 22 Certification Authority, 22, 32, 33 Policy, 23 Schlüsselmanagement, 22, 29 Sicherheitspolitik, 23 Teilnehmer, 22, 33 Plattformunabhängigkeit, 58 Privatheit, 9 Protokolle, 16, 18, 21 Quantencomputer, 8 Registration Authority, 25–27, 52, 62 dezentral, 57 OpenRA, siehe OpenRA Personalisierung, 28 Registrierungsdaten, 27 Replays, 18 Repräsentationsschicht, 75 Revokation, 24 RMI, 87 RSA, 12 Schlüssel, 10, 16 Angriff auf, 19 Austausch, 13, 29 geheimer, 11 Identität, 13, 21 – 124 – INDEX Key Authority, 28 öffentlicher, 11, 14, 21–23, 29 Personalisierung, 23, 25 privater, 11, 14 Schlüssellänge, 13 Sitzungsschlüssel, 14 symmetrischer, 11, 13, 14 Schlüsseltext, 10 Schutzziele, 8, 15, 20 Script Query Language (SQL), 45 Abfrage, 41 Aggregierung, 48 Applikationen, 50 Dateneingabe, 49 Datenmanipulation, 46 Datenzugriff, 46 Einbettung, 50 Einfaches Beispiel, 46 Join, 46 Query, 37, 41, 45 Query-Optimierung, 45 Query-Sprachen, 45 Strukturmanipulation, 49 Seiteninformation, 19, 20 Seitenkanal-Angriff, 17, 19 Session-Hijacking, 18 SHA-1, 15 Signieren, 7, 9 digitale Signatur, 10, 15, 25 Signatur, 9, 35 Verifikation, 15 SPA, 19 Spoofing, 18 Sprachanalysen, 18 SSL, 21 Steganographie, 8 Stromverbrauch, 19 Telefonbuch, 29 Time Stamp Service, 26, 36 Zeitstempel, 15, 36 TLS, 21 Transaktionen, 37, 39, 51, 69 Coupling Modes, 39 Trigger, 39 TrustCenter, 9, 15, 16, 21, 22, 25, 71 Datenmodell, 52, 82, 85, 106, 108, 111 UMAC, 15 Unveränderlichkeit, 8 Urheber, 8 Verbindlichkeit, 9, 15, 25 Verfügbarkeit, 9 Verschlüsselung, 10, 15 asymmetrisch, 11 hybrid, 14 Praxis, 13 symmetrisch, 10 Verteiltes System, 37 Vertrauensinstanz, 9, 15, 21 Vertraulichkeit, 9, 15 Verzeichnisdienst, 26, 29 Attacke, 33 Attribute Extraction, 34 Aufgaben, 30 Baumebenen, 36 Client, 31 Component Matching, 34 DAP, 30 Datenbank, 30 Directory Service, 26, 29 Distinguished Name, 24, 31, 32, 35, 36 Entry, 30, 32 Internet, 30, 31 LDAP, 30–33, 35 OpenLDAP, 33, 112 TC-Datenbank, 54, 61, 110, 112 userCertificate, 32 Verzeichnis, 30 X.500, 30, 35 X.509, 31 X.509-attribute Parsing Server, 34 VPN, 21 Wahlen, 9 Wiedereinspielung, 18 XML, 51, 92 Zertifikat, 22, 23, 29 ASN.1, 33 Aussteller, 24, 32 Austausch, 29 CRL, 23, 30 Distinguished Name, 24 Gültigkeitszeitraum, 24 Inhaber, 24 Kommunikationspartner, 29 mehrere Zertifikate, 35 Revokation, 24 Seriennummer, 24 Telefonbuch, 29 Veröffentlichung, 23, 29, 32 X.509v3, 24, 31, 33 Zufallszahlen, 19 – 125 –