Практическое руководство. Расшифровка XML-элементов с помощью сертификатов X.509
Для шифрования и расшифровки элемента XML-документа могут использоваться классы, принадлежащие пространству имен System.Security.Cryptography.Xml. Шифрование XML-данных является стандартным способом обмена и хранения XML-данных, защищающим их от несанкционированного прочтения. Дополнительные сведения о стандарте шифрования XML-данных см. в спецификации консорциума W3C по шифрованию XML-данных, расположенной на веб-узле по адресу: http://www.w3.org/TR/xmldsig-core/.
В этом примере производится расшифровка XML-элемента, зашифрованного с помощью метода, описанного в разделе Практическое руководство. Шифрование XML-элементов с помощью сертификатов X.509. Производится поиск элемента EncryptedData, его расшифровка и замещение элемента исходным XML-элементом в формате простого текста.
В данном примере кода выполняется расшифровка XML-элемента с помощью сертификата X.509 из локального хранилища сертификатов текущей учетной записи пользователя. В примере используется метод DecryptDocument для автоматического извлечения сертификата X.509 и расшифровки ключа сеанса, хранящегося в элементе EncryptedKey элемента EncryptedData. Далее метод DecryptDocument автоматически использует ключ сеанса для расшифровки XML-элемента.
Этот пример применим в том случае, если необходимо обеспечить общий доступ к зашифрованным данным со стороны нескольких приложений, или если приложение должно сохранять зашифрованные данные между запусками.
Расшифровка XML-элемента с помощью сертификата X.509
Создайте объект XmlDocument путем загрузки XML-файла с диска. Объект XmlDocument содержит XML-элемент, подлежащий расшифровке.
Dim xmlDoc As New XmlDocument()
XmlDocument xmlDoc = new XmlDocument();
Создайте новый объект EncryptedXml, передав конструктору объект XmlDocument.
Dim exml As New EncryptedXml(Doc)
EncryptedXml exml = new EncryptedXml(Doc);
Произведите расшифровку XML-документа с помощью метода DecryptDocument.
exml.DecryptDocument()
exml.DecryptDocument();
Сохраните объект XmlDocument.
xmlDoc.Save("test.xml")
xmlDoc.Save("test.xml");
Пример
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();
}
}
В этом примере предполагается, что файл с именем "test.xml" существует в том же каталоге, что и скомпилированная программа. Также предполагается, что файл "test.xml" содержит элемент "creditcard". Можно поместить следующий XML-код в файл с именем test.xml и использовать его в данном примере.
<root>
<creditcard>
<number>19834209</number>
<expiry>02/02/2002</expiry>
</creditcard>
</root>
Компиляция кода
Для компиляции этого примера может потребоваться включить ссылку на System.Security.dll.
Включите следующие пространства имен: System.Xml, System.Security.Cryptography и System.Security.Cryptography.Xml.
Безопасность
Сертификат X.509, использованный в данном примере, предназначен только для тестирования. Приложения должны использовать сертификаты X.509, созданные доверенным центром сертификации или сервером сертификации Microsoft Windows.
См. также
Задачи
Практическое руководство. Шифрование XML-элементов с помощью сертификатов X.509
Ссылки
System.Security.Cryptography.Xml