Gewusst wie: Entschlüsseln von XML-Elementen mit X.509-Zertifikaten
Aktualisiert: November 2007
Sie können die Klassen im System.Security.Cryptography.Xml-Namespace verwenden, um ein Element innerhalb eines XML-Dokuments zu ver- und zu entschlüsseln. Die XML-Verschlüsselung ist ein gängiges Verfahren zum Austauschen oder Speichern von verschlüsselten XML-Daten, mit dem der nötige Datenschutz gewährleistet wird. Weitere Informationen über den XML-Verschlüsselungsstandard finden Sie in der W3C-Spezifikation (World Wide Web Consortium) für die XML-Verschlüsselung unter http://www.w3.org/TR/xmldsig-core/ (nur auf Englisch verfügbar).
In diesem Beispiel wird ein XML-Element entschlüsselt, das mithilfe der unter Gewusst wie: Verschlüsseln von XML-Elementen mit X.509-Zertifikaten beschriebenen Methoden verschlüsselt wurde. Im Beispiel wird ein <EncryptedData>-Element gesucht, entschlüsselt und anschließend durch das ursprüngliche Nur-Text XML-Element ersetzt.
Im Codebeispiel dieser Prozedur wird ein XML-Element mithilfe eines X.059-Zertifikats entschlüsselt, das aus einem lokalen Zertifikatsspeicher des aktuellen Benutzerkontos stammt. Im Beispiel wird die DecryptDocument-Methode verwendet, um automatisch das X.509-Zertifikat abzurufen und einen im <EncryptedKey>-Element des <EncryptedData>-Elements gespeicherten Sitzungsschlüssel zu entschlüsseln. Die DecryptDocument-Methode verwendet den Sitzungsschlüssel dann automatisch, um das XML-Element zu entschlüsseln.
Das Beispiel eignet sich für Situationen, wenn mehrere Anwendungen verschlüsselte Daten gemeinsam nutzen müssen, oder wenn eine Anwendung verschlüsselte Daten immer dann speichern muss, wenn sie nicht ausgeführt wird.
So entschlüsseln Sie ein XML-Element mit einem X.509-Zertifikat
Erstellen Sie ein XmlDocument-Objekt, indem Sie eine XML-Datei von einem Datenträger laden. Das XmlDocument-Objekt enthält das zu entschlüsselnde XML-Element.
Dim xmlDoc As New XmlDocument()
XmlDocument xmlDoc = new XmlDocument();
Erstellen Sie ein neues EncryptedXml-Objekt, indem Sie das XmlDocument-Objekt an den Konstruktor übergeben.
Dim exml As New EncryptedXml(Doc)
EncryptedXml exml = new EncryptedXml(Doc);
Entschlüsseln Sie das XML-Dokument mittels der DecryptDocument-Methode.
exml.DecryptDocument()
exml.DecryptDocument();
Speichern Sie das XmlDocument-Objekt.
xmlDoc.Save("test.xml")
xmlDoc.Save("test.xml");
Beispiel
Imports System
Imports System.Xml
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Module Program
Sub Main(ByVal args() As String)
Try
' Create an XmlDocument object.
Dim xmlDoc As New XmlDocument()
' Load an XML file into the XmlDocument object.
xmlDoc.PreserveWhitespace = True
xmlDoc.Load("test.xml")
' Decrypt the document.
Decrypt(xmlDoc)
' Save the XML document.
xmlDoc.Save("test.xml")
' Display the decrypted XML to the console.
Console.WriteLine("Decrypted XML:")
Console.WriteLine()
Console.WriteLine(xmlDoc.OuterXml)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Sub Decrypt(ByVal Doc As XmlDocument)
' Check the arguments.
If Doc Is Nothing Then
Throw New ArgumentNullException("Doc")
End If
' Create a new EncryptedXml object.
Dim exml As New EncryptedXml(Doc)
' Decrypt the XML document.
exml.DecryptDocument()
End Sub
End Module
using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.X509Certificates;
class Program
{
static void Main(string[] args)
{
try
{
// Create an XmlDocument object.
XmlDocument xmlDoc = new XmlDocument();
// Load an XML file into the XmlDocument object.
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load("test.xml");
// Decrypt the document.
Decrypt(xmlDoc);
// Save the XML document.
xmlDoc.Save("test.xml");
// Display the decrypted XML to the console.
Console.WriteLine("Decrypted XML:");
Console.WriteLine();
Console.WriteLine(xmlDoc.OuterXml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public static void Decrypt(XmlDocument Doc)
{
// Check the arguments.
if (Doc == null)
throw new ArgumentNullException("Doc");
// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml(Doc);
// Decrypt the XML document.
exml.DecryptDocument();
}
}
Dieses Beispiel setzt voraus, dass eine Datei mit dem Namen "test.xml" im gleichen Verzeichnis wie das kompilierte Programm vorhanden ist. Vorausgesetzt wird auch, dass "test.xml" ein "creditcard"-Element enthält. Sie können die folgende XML in eine Datei mit dem Namen test.xml einfügen und mit diesem Beispiel verwenden.
<root>
<creditcard>
<number>19834209</number>
<expiry>02/02/2002</expiry>
</creditcard>
</root>
Kompilieren des Codes
Um dieses Beispiel zu kompilieren, müssen Sie einen Verweis auf System.Security.dll einfügen.
Fügen Sie die folgenden Namespaces hinzu: System.Xml, System.Security.Cryptography und System.Security.Cryptography.Xml.
Sicherheit
Das in diesem Beispiel verwendete X.509-Zertifikat ist nur für Testzwecke vorgesehen. Anwendungen sollten ein X.059-Zertifikat verwenden, das entweder von einer vertrauenswürdigen Zertifizierungsstelle oder vom Microsoft Windows-Zertifikatsserver generiert wurde.
Siehe auch
Aufgaben
Gewusst wie: Verschlüsseln von XML-Elementen mit X.509-Zertifikaten
Referenz
System.Security.Cryptography.Xml