Material zum Praktikumsversuch XML Verschlüsselung und Signatur

Werbung
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
Herunterladen