Material zum Praktikumsversuch Stand: März 2005, zusammengestellt von: Michael Psarros (Lehrstuhl NDS) Version 1.2 Grundpraktikum zur IT-Sicherheit XML Verschlüsselung und Signatur Lehrstuhl für Netz- und Datensicherheit ruhr-universität bochum Bitte beachten Sie, dass dieser im Raum IC4/58 stattfindet. Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 1/13 Was ist XML? Um die Frage zu beantworten schauen wir am besten ein Beispiel an: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE CONTACTLIST SYSTEM "contacts.dtd"> <CONTACTLIST> <CONTACT> <NAME>Michael Psarros</NAME> <ADDRESS>Gebäude IC 4 / 152</ADDRESS> <PHONE type="office">0234 32 27352</PHONE> <PHONE type="fax">0234 32 14347</PHONE> <MAIL>[email protected]</MAIL> </CONTACT> </CONTACTLIST> Die Abbildung zeigt ein XML-Dokument, das die Kontaktinformationen von einer Person enthält. Folgende Dinge fallen an diesem Beispiel auf: • Bei den ersten beiden Zeilen handelt es sich um eine Versionsangabe, die Angabe eines Zeichensatzes sowie die Definition eines Dokumenttyps. Darum kümmern wir uns später. • Die Informationen in einem XML-Dokument werden durch einleitende und abschließende Textelemente eingegrenzt. So steht im Beispiel der Name der jeweiligen Person zwischen <NAME> und </NAME>. Diese Textelemente heißen Tags. Ein einleitendes Tag muss immer auch abgeschlossen werden. Das abschließende Tag erkennt man am Schrägstrich (/), der als erstes Zeichen auftaucht. Tags sind immer in eckige Klammern (<...>) eingeschlossen. • Ein Tag kann mit Attributen versehen werden. Im Beispiel besitzt das Tag PHONE ein Attribut. Das Attribut besitzt den Namen type und kann Werte wie office oder fax annehmen. • Ausnahmslos alle XML-Dokumente sind hierarchisch, oder baumartig, aufgebaut. Im Beispiel macht sich das dadurch bemerkbar, dass ein äußerstes Tag CONTACTLIST existiert, das alle inneren Tags umschließt. Innerhalb von CONTACTLIST dürfen im Beispiel beliebig viele CONTACT Tags auftauchen. Die CONTACT Tags wiederum enthalten die eigentlichen Kontaktangaben. Es handelt sich dabei um den Namen, die Adresse, Telefonnummern mit unterschiedlichem Typ sowie die E-Mail-Adresse einer Person. Zur Terminologie: Elemente sind die grundlegenden Bausteine von XML. Beispiele für XML-Elemente sind CONTACTLIST, CONTACT oder MAIL. Ein Element kann einfachen Text oder andere XML-Elemente enthalten. Ein Element kann auch leer sein. Tags werden zur Kennzeichnung sowie zur Abgrenzung von Elementen in einem XML-Dokument benutzt. Ein Start-Tag wie <ELEMENTNAME> markiert den Beginn eines Elements. Das zugehörige End-Tag </ELEMENTNAME> kennzeichnet das Ende eines Elements. Attribute stellen Zusatzinformationen zu einem Element zur Verfügung. Attribute erscheinen immer im StartTag eines Elements. Sie haben einen Namen und einen Wert. Im Beispiel besitzt das Element PHONE ein Attribut mit dem Namen type, das unterschiedliche Werte annehmen kann. Was ist XML? Jetzt aber wirklich... XML ist eine Möglichkeit, Daten zu strukturieren. Wie im Beispiel gezeigt, lassen sich mittels XML Daten strukturiert darstellen. Jede Information in einem Dokument ist mit Hilfe der umschließenden Tags eindeutig gekennzeichnet und zwar in einer Form die von Computer bearbeitet werden kann. Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 2/13 XML ist ein Standard. XML wurde und wird vom World Wide Web Consortium (kurz: W3C) entwickelt. Das W3C ist die Organisation, die sich um die Weiterentwicklung des WWW sowie der zugehörigen Standards kümmert. Dazu gehören so wichtige Standards wie HTML, HTTP, CSS und viele andere. Der Einsatz von XML sowie den begleitenden Standards ist frei von jeglichen Lizenzgebühren möglich. Außerdem: Aufgrund der Tatsache, dass es sich bei XML um einen offiziellen und akzeptierten Standard handelt, werden zahlreiche begleitende Tools oder Werkzeuge angeboten. Diese Tools erleichtern das Erstellen und die Verarbeitung von XML-Dokumenten. Viele dieser Tools sind kostenlos erhältlich. XML ist textbasiert. Ein XML-Dokument ist nichts anderes als ein einfaches Textdokument, das auf eine definierte Art und Weise aufgebaut ist. Dadurch können XML-Dokumente problemlos und unabhängig vom benutzten Computer oder Betriebssystem gelesen und mit einem beliebigen Texteditor bearbeitet werden. Mit nicht textbasierten Datenformaten (zum Beispiel Word- oder Excel-Dateien) ist dies nicht uneingeschränkt möglich. XML ist nicht nur XML. XML bildet die Basis einer ganzen Reihe von Techniken, Standards und Konventionen. XML definiert, wie strukturierte Daten in einem Textdokument dargestellt werden. Neben XML gibt es zum Beispiel den wichtigen Standard XSL (Extensible Stylesheet Language). Mit Hilfe von XSL kann festgelegt werden, wie ein XMLDokument für unterschiedliche Ausgabemedien dargestellt werden soll. Eine so genannte Document Type Definition oder kurz DTD legt fest, wie XML-Dokumente eines bestimmten Typs auszusehen haben. Verschiedene andere Standards beschreiben beispielsweise, wie von einem XML-Dokument auf ein anderes (oder Teile davon) verwiesen werden kann oder wie mathematische Formeln mit Hilfe von XML spezifiziert werden können. XML ist erweiterbar. XML steht ausgeschrieben für Extensible Markup Language. "Extensible" ist Englisch für "erweiterbar", die Erweiterbarkeit ist also schon im Namen der Technologie verankert. In XML sind keine Tags vordefiniert. Der Autor von XMLDokumenten kann und muss alle nötigen Tags selber definieren. Das ist ein Vorteil, denn auf diese Weise können für beliebige Informationen die passenden Tags oder Attribute sowie eine geeignete Dokumentstruktur festgelegt werden. Was sind DTD und XML-Schema? XML-Dokumente sind erweiterbar. Es lassen sich beliebig komplexe Strukturen mit beliebigen Tag- und Attributnamen erstellen. Eine DTD (Document Type Definition) hilft dabei, die Struktur und den genauen Aufbau von XML-Dokumenten festzulegen. Mit Hilfe einer DTD wird die Struktur von XML-Dokumenten verbindlich und zentral festgelegt. Alle XML-Dokumente desselben Typs können anhand derselben DTD bezüglich ihrer Struktur geprüft werden. Das ist hilfreich, weil viele XML-Editoren und andere XML-verarbeitende Tools eine solche Prüfung nach Wunsch automatisch vornehmen können. Auf diese Weise werden Sie als Autor oder Benutzer von XML-basierten Informationen sofort auf allfällige Strukturverletzungen aufmerksam gemacht. Die automatisierte Prüfung ist insbesondere dann nützlich, wenn Informationen von anderen Personen empfangen werden und vor der Weiterverarbeitung im Hinblick auf die strukturelle Gültigkeit geprüft werden sollen. Außerdem sind DTDs ein hilfreiches Werkzeug, wenn sich mehrere Personen oder Organisationen über ein gemeinsam unterstütztes Format zum Datenaustausch einigen wollen. In solchen Fällen legt die DTD das gemeinsame Format eindeutig und formalisiert fest. Nach Einführung der DTDs wurde festgestellt, dass einige Limitierungen da waren. Speziell ist eine DTD in SGML und nicht XML beschrieben und es fehlte ihnen die Fähigkeit, Elemente hinsichtlich Datentypen zu beschreiben, Validierungsbereiche zu definieren oder Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 3/13 Elemente mit Namensräumen zu verkapseln. Um diese Probleme zu lösen, wurde durch die XML Schema Definition der Begriff der XML-Schemata eingeführt. DTD Hier ist die DTD des einführenden XML-Beispiels mit den Kontaktinformationen: <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ATTLIST CONTACTLIST (CONTACT)*> CONTACT (NAME, ADDRESS?, PHONE*, MAIL)> NAME (#PCDATA)> ADDRESS (#PCDATA)> MAIL (#PCDATA)> PHONE (#PCDATA)> PHONE type (mobile | private | office | fax) #REQUIRED> Einige Erklärungen zur DTD: • Die erste Zeile definiert das Element CONTACTLIST als eine Folge von beliebig vielen CONTACT-Elementen. Das "beliebig viele" wird durch den Stern (*) festgelegt und erlaubt auch eine leere Liste mit keinem einzigen CONTACT-Element. • Das CONTACT-Element in der zweiten Zeile ist als eine Folge von NAME-, ADDRESS, PHONE- und MAIL-Elementen festgelegt. Die Reihenfolge der Elemente ist verbindlich und muss in einem gültigen XML-Dokument genau eingehalten sein. Das Fragezeichen im Anschluss an das ADDRESS-Element besagt, dass dieses Element optional ist und folglich wahlweise auftauchen oder weggelassen werden kann. Der Stern hinter dem PHONE-Element ermöglicht wie oben zwischen Null und beliebig vielen Wiederholungen des Elements. • Die nachfolgenden Zeilen definieren die Elemente NAME, ADDRESS, PHONE und MAIL als einfache Textelemente. Die Bezeichnung #PCDATA bedeutet, dass diese Elemente bloss Text und keine weiteren Elemente enthalten dürfen. PCDATA steht für "Parsed Character Data". • Die letzten drei Zeilen definieren das Attribut type, das zum Element PHONE gehört. Gemäss der Definition kann das Attribut type einen der Werte mobile, private, office oder fax annehmen. Ausserdem wird durch den Zusatz #REQUIRED festgelegt, dass das Attribut zwingend anzugeben ist, falls das Element PHONE benutzt wird. Damit unser XML-Dokument "weiß", welche DTD dafür gültig ist, wird wie im Beispiel auf die passende DTD verwiesen mit einer Zeile wie: <!DOCTYPE CONTACTLIST SYSTEM "contacts.dtd">. Die Zeile besagt, dass das XML-Dokument vom Typ CONTACTLIST ist und sich die zugehörige DTD in der Datei "contacts.dtd" befindet. XML-Schema Als Schema würde die DTD des Beispieles folgendermaßen aussehen: <?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="CONTACTLIST"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="CONTACT"> <xs:complexType> <xs:sequence> <xs:element name="NAME" type="xs:string"/> <xs:element name="ADDRESS" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="PHONE" type="phoneComp" Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 4/13 minOccurs="0" maxOccurs="unbounded"/> <xs:element name="MAIL" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="phoneComp" mixed="true"> <xs:attribute name="type" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="mobile"/> <xs:enumeration value="private"/> <xs:enumeration value="office"/> <xs:enumeration value="fax"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:schema> Der Hauptunterschied zwischen eine DTD und ein XML-Schema ist sofort sichtbar: während eine DTD in SGML geschrieben ist, ist ein Schema selbst ein XML-Dokument. Speziell die Tags eines XML-Schema folgen die Regeln eines anderen Schemas, was unter http://www.w3.org/2001/XMLSchema definiert ist. Außerdem besitzt das Schema mehr Datentypen und mehr Möglichkeiten für die genauere Definition eines Elementes. „Wohlgeformtheit“ und „Gültigkeit“ eines XML-Dokumentes Der Begriff "Wohlgeformtheit", der Ihnen im Zusammenhang mit XML immer wieder begegnen wird, bedeutet, dass eine Datei die Regeln von XML korrekt einhält. D.h., die eckigen Klammern werden richtig benutzt und die Elemente sind korrekt geschachtelt. Korrekte Schachtelung bedeutet, dass, wenn das Start-Tag innerhalb eines Elements ist, auch das End-Tag innerhalb dieses Elementes sein muss. Ein wohlgeformtes XML-Dokument wird als gültig oder valid bezeichnet, wenn es den Regeln einer DTD oder eines Schemas folgt. Ein Dokument kann also wohlgeformt und nicht gültig sein, aber niemals gültig und nicht wohlgeformt. Außerdem ergibt sich, dass ein Dokument immer nur bezüglich einer DTD/Schema, und nicht von sich aus gültig sein kann. Sicherheitsmechanismen in XML Um das unsichere Internet für kritische Business-Transaktionen nutzen zu können, bedarf es hoch entwickelter Sicherheitstechnologien: Es müssen die Eindeutigkeit der Unterzeichneridentität, die Einmaligkeit der zum Dokument gehörigen Unterschrift, die Integrität des Dokuments und schließlich die Unleugbarkeit der Signierung gewährleistet sein. Um diese Anforderungen gerecht zu werden, hat das W3C Standards zur digitalen Signatur und Verschlüsselung verabschiedet. Sie definieren keine neuen Verschlüsselungsmechanismen, sondern bilden alle gängigen Verschlüsselungstechniken in die XML-Syntax ab. Einer der zentralen Vorteile dieser Technologien ist die Möglichkeit, nur bestimmte Teile eines Dokuments zu signieren bzw. verschlüsseln. Das ist nützlich wenn mehrere Personen für verschiedene Teile eines Dokumentes verantwortlich sind (z.Bsp. bei einen Bestellablauf). Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 5/13 XML-Signatur Damit Sicherheit und Integrität der ausgetauschten XML-Daten gewährleistet sind, müssen diese digital signiert und verschlüsselt werden. Die XML-Signatur selbst ist entweder im Dokument enthalten (der XML-Signaturteil ist Teil des XML-Sourcecodes), umfasst das Dokument (das Sourcedokument ist Teil der Signatur) oder liegt extern in einem zusätzlichen XML-Dokument vor. Diese drei Varianten heißen enveloped-, enveloping- und detachedsignature. XML-Verschlüsselung Die gleichen Vorteile der XML-Signatur bieten auch die XML-Verschlüsselung. Da kann man auch nur einzelne Teilbäume verschlüsseln. Der verschlüsselte Teil des Dokumentes wird immer in die Position der ursprünglichen Daten gespeichert. Deswegen gibt es für die Verschlüsselung nur die „enveloped“ Variante. Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 6/13 Versuch Versuchsaufbau Nach den einleitenden Informationen erhalten Sie nun eine konkrete Versuchsbeschreibung. Auf den Rechnern ist Windows XP mit JDK Version 1.5 und Eclipse installiert. Sie bearbeiten den Versuch meistens mit Kommandozeilen-Befehlen. Sie können einen Editor Ihrer Wahl benutzen: falls Sie keine Präferenz bzw. Kenntnisse haben, wird notepad vorgeschlagen. Alle Dateien befinden sich in Verzeichnis c:\XMLSecurity Die Beschreibungen der einzelnen Schritte enthalten die Vorgabe in fetter Schrift und die Erläuterungen dazu jeweils in normaler Schrift. Falls Sie etwas nicht verstehen, fragen Sie bitte zu Beginn den Mitarbeiter, der das Praktikum betreut. Ziel ist es, dass Sie die Vorgabe jedes Schrittes erfüllen und das Ergebnis für sich dokumentieren. Schreiben Sie am besten bei jedem Schritt das Zwischenergebnis auf, damit der Bericht vollständig den Versuch abdeckt. Unvollständige Berichte werden vom Versuchsleiter nicht akzeptiert, was dazu führen kann, dass Sie die Schritte dann noch mal durchführen müssen. Schritt 1: Erstellen einer einfachen XML Datei und Validierung mittels DTD und Schema • Erstellen Sie mittels eines ASCII-Editors eine XML-Datei mit zwei Kontakten. Nennen Sie die Datei daten.xml. • Überprüfen Sie ob das Dokument gültig ist: java sax.Counter -v -s -f daten.xml • Passen Sie das Dokument soweit an, dass es das Schema, statt die DTD benutzt. • Überprüfen Sie ob das Dokument auch mit dem Schema gültig ist: java sax.Counter -v -s -f daten.xml In beiden Fällen machen Sie kleine Änderungen in Ihre XML-Datei, wie reagiert sax.Counter in diesem Fall? Schritt 2: Verschlüsseln der XML Datei • Verschlüsseln Sie mittels des Programmes jEncrypt die Datei: java jEncrypt • Versuchen Sie zu verstehen wie eine XML-Verschlüsselung abläuft. Welche Daten werden benötigt und wie ist der Ablauf. Schritt 3: Entschlüsseln der XML Datei • Kopieren Sie das Programm jEncrypt in eine Datei jDecrypt. • Schreiben Sie das Programm soweit um, dass es die verschlüsselte Datei diesmal entschlüsselt. Sie können die neue Datei mittels javac jDecrypt kompilieren oder auch die Entwicklungsumgebung Eclipse benutzen. • Versuchen Sie zu verstehen wie eine XML-Entschlüsselung abläuft. Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 7/13 Schritt 4: Public-Keys unter Java Kryptographische Schlüssel werden in Java in so genannte Keystore-Dateien gespeichert. Die Datei keystore.jks ist so eine Datei. Mittels des Programms keytool (was bei einer Java-Installation dabei ist) können Keystores erzeugt werden bzw. die Informationen angezeigt werden. • Was für Schlüssel liegen in dieser Datei? Schreiben Sie alle Informationen auf. Das Passwort der Datei ist „xmlsecurity“. Schritt 5: Signieren der XML Datei • Signieren Sie mittels des Programmes jSign die Datei: java jSign • Versuchen Sie zu verstehen wie eine XML-Signierung abläuft. Welche Daten werden benötigt und wie ist der Ablauf. Schritt 6: Überprüfung der Signatur • Kopieren Sie das Programm jSign in eine Datei jSignVerifier. • Schreiben Sie das Programm soweit um, dass es die signierte Datei diesmal überprüft. Sie können die neue Datei mittels javac jSignVerifier kompilieren oder auch die Entwicklungsumgebung Eclipse benutzen. • Versuchen Sie zu verstehen wie eine XML-Signaturverifikation abläuft. • Was sind die Gefahren bei einer Signatur-Überprüfung? Schritt 7 (optional): Signieren mit XPath • Passen Sie das Programm jSign so an, dass es nur die PHONE-Elemente statt das ganze Dokument signiert. • Muss auch jSignVerifier angepasst werden? Wieso und was für Anpassungen sind nötig? Ende des Versuchs Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 8/13 Voraussetzungen für die Teilnahme an diesem Versuch • • • • Grundkenntnisse zu Java Grundkenntnisse zum Arbeiten mit Windows Sie müssen mit Kommandozeilen umgehen können Dieses Dokument muss vorher gelesen werden; siehe Kontrollfragen zum Verständnis des Dokumentes Kontrollfragen Sie sollten folgende Fragen beantworten können (bevor der Versuch beginnt): • Was ist XML? • Was sind die Stärken von XML? • Was sind die Schwächen von XML? • Was ist eine DTD? • Was ist ein XML-Schema? • Was ist der Unterschied zwischen eine DTD und ein Schema? • Was bedeutet „wohlgeformt“? • Was bedeutet „gültig“? • Istein wohlgeformtes Dokument auch gültig? • Ist ein gültiges Dokument auch wohlgeformt? • Was ist der Unterschied zwischen enveloped, enveloping und dettached Signatur? • Was sind die erforderlichen Schritte um ein XML-Dokument zu signieren? • Was sind die erforderlichen Schritte um eine XML-Signatur zu überprüfen? • Was sind die erforderlichen Schritte um ein XML-Dokument zu verschlüsseln? • Was sind die erforderlichen Schritte um ein XML-Dokument zu entschlüsseln? Schriftliche Versuchsauswertung Jedes Team fertigt eine schriftliche Auswertung an. Diese sollte insbesondere die bei jedem Schritt verwendeten Befehle enthalten (also unbedingt dokumentieren, was Sie bei der Versuchsdurchführung getan haben) und die Ausgabe der Befehle erläutern. Bitte geben Sie auch Feedback, ob Sie den Praktikumsversuch als interessant empfunden haben und ob dieses Dokument für Sie bei der Versuchsdurchführung hilfreich war. Verbesserungsvorschläge sind willkommen! Die Versuchsauswertung ist schriftlich beim nächsten Termin mitzubringen Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 9/13 Weiterführende Informationen - Links Einführung in XML XML in 10 points: http://www.w3.org/XML/1999/XML-in-10-points XML Tutorial vom W3C: http://www.w3schools.com/xml/default.asp Standards XML: http://www.w3.org/TR/REC-xml/ XML-Schema: http://www.w3.org/TR/xmlschema-0/ XML-Signature: http://www.w3.org/TR/xmldsig-core/ XML-Encryption: http://www.w3.org/TR/xmlenc-core/ XML Path Language: http://www.w3.org/TR/xpath Tools: Java: http://java.sun.com/ Eclipse: http://www.eclipse.org/ XML Libraries von Apache: http://xml.apache.org/ The Legion of the Bouncy Castle: http://www.bouncycastle.org/ Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 10/13 Anhang jEncrypt.java /** jEncrypt: Simple programm to encrypt a XML file */ import java.io.File; import java.io.FileOutputStream; import java.security.Key; import javax.crypto.KeyGenerator; import import import import import org.apache.xml.security.encryption.XMLCipher; org.apache.xml.security.encryption.EncryptedData; org.apache.xml.security.encryption.EncryptedKey; org.apache.xml.security.keys.KeyInfo; org.apache.xml.security.utils.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; public class jEncrypt { public static void main(String unused[]) throws Exception { // Initialisieren der XML-Funktionen org.apache.xml.security.Init.init(); // Oeffne unser XML-Dokument File XMLFile = new File("daten.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(XMLFile); // Kreiere einen symmetrischen Schluessel und speichere in // verschluesselt in die Datei kekfile KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); Key symmetricKey = keyGenerator.generateKey(); keyGenerator = KeyGenerator.getInstance("DESede"); Key kek = keyGenerator.generateKey(); byte[] keyBytes = kek.getEncoded(); File kekFile = new File("kekfile"); FileOutputStream fkek = new FileOutputStream(kekFile); fkek.write(keyBytes); fkek.close(); System.out.println("Key encryption key ist in Datei " + kekFile.toURL().toString() + " gespeichert"); // Verschluesseln der Datei XMLCipher keyCipher = XMLCipher.getInstance(XMLCipher.TRIPLEDES_KeyWrap); keyCipher.init(XMLCipher.WRAP_MODE, kek); EncryptedKey encryptedKey = keyCipher.encryptKey(doc, symmetricKey); Element rootElement = doc.getDocumentElement(); XMLCipher xmlCipher = XMLCipher.getInstance(XMLCipher.AES_128); Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 11/13 xmlCipher.init(XMLCipher.ENCRYPT_MODE, symmetricKey); EncryptedData encryptedData = xmlCipher.getEncryptedData(); // Fuege Schluesselinformation in der Datei KeyInfo keyInfo = new KeyInfo(doc); keyInfo.add(encryptedKey); encryptedData.setKeyInfo(keyInfo); xmlCipher.doFinal(doc, rootElement, true); // Und schreibe die Ausgabedatei File encryptedFile = new File("VerschluesselteDaten.xml"); FileOutputStream f = new FileOutputStream(encryptedFile); XMLUtils.outputDOMc14nWithComments(doc, f); f.close(); System.out.println("Verschluesseln erfolgreich, neue Datei: " + encryptedFile); } } jSign.java /** jSign: Simple programm to sign a XML file */ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.X509Certificate; import import import import org.apache.xml.security.signature.XMLSignature; org.apache.xml.security.transforms.Transforms; org.apache.xml.security.utils.Constants; org.apache.xml.security.utils.XMLUtils; import org.w3c.dom.Document; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; public class jSign { public static void main(String unused[]) throws Exception { // Initialisieren der XML-Funktionen org.apache.xml.security.Init.init(); // Parameter fuer die Schluesseldatei String keystoreType = "JKS"; String keystoreFile = "keystore.jks"; String keystorePass = "xmlsecurity"; String privateKeyAlias = "test"; String privateKeyPass = "xmlsecurity"; String certificateAlias = "test"; KeyStore ks = KeyStore.getInstance(keystoreType); FileInputStream fis = new FileInputStream(keystoreFile); ks.load(fis, keystorePass.toCharArray()); PrivateKey privateKey = (PrivateKey) ks.getKey(privateKeyAlias, privateKeyPass.toCharArray()); Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 12/13 // Unsere Ein- und Ausgabe- Dateien File XMLFile = new File("daten.xml"); // Oeffne unser XML-Dokument DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(XMLFile); // Kreiere Signaturbaum im Speicher String BaseURI = XMLFile.toURL().toString(); XMLSignature sig = new XMLSignature(doc, BaseURI, XMLSignature.ALGO_ID_SIGNATURE_DSA); // Enveloped Signatur: Fuege das Signatur-Element bevor der Signatur doc.getDocumentElement().appendChild(sig.getElement()); // Sorge das die Applikation offline ablaeuft sig.getSignedInfo().addResourceResolver(new MyOfflineResolver()); // Kreiere die Transformation fuer das signieren Transforms transforms = new Transforms(doc); // Zuerst muss die Signatur rausgenommen werden: transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE); // Dann muss das Dokument auch kanonisiert werden. transforms.addTransform(Transforms.TRANSFORM_C14N_WITH_COMMENTS); // Fuege die Transformationen zur Signatur sig.addDocument("", transforms, Constants.ALGO_ID_DIGEST_SHA1); // Schreibe Informationen ueber den benutzten Schluessel X509Certificate cert = (X509Certificate) ks.getCertificate(certificateAlias); sig.addKeyInfo(cert); sig.addKeyInfo(cert.getPublicKey()); // Signiere das Dokument sig.sign(privateKey); // Und schreibe die Ausgabedatei File signatureFile = new File("signierteDaten.xml"); FileOutputStream f = new FileOutputStream(signatureFile); XMLUtils.outputDOMc14nWithComments(doc, f); f.close(); System.out.println("Signieren erfolgreich, signierte Datei: " + signatureFile); } } Praktikumsversuch XML Sicherheit Lehrstuhl Netz- und Datensicherheit 13/13