Поделиться через


Практическое руководство. Расшифровка XML-элементов с помощью сертификатов X.509

Классы можно использовать в пространстве имен System.Security.Cryptography.Xml для шифрования и расшифровки элемента XML-документа. Шифрование XML-данных — это стандартный способ обмена зашифрованными XML-данными и их хранения, позволяющий не беспокоиться о том, что эти данные могут быть прочитаны. Дополнительные сведения о стандарте шифрования XML см. в спецификации консорциума W3C для XML-шифрования, расположенного по адресу https://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

  1. Создайте объект XmlDocument, загрузив XML-файл с диска. Объект XmlDocument содержит XML-элемент для расшифровки.

    XmlDocument xmlDoc = new XmlDocument();
    
    Dim xmlDoc As New XmlDocument()
    
  2. Создайте новый объект EncryptedXml, передав объект XmlDocument в конструктор.

    EncryptedXml exml = new EncryptedXml(Doc);
    
    Dim exml As New EncryptedXml(Doc)
    
  3. Выполните расшифровку XML-документа при помощи метода DecryptDocument.

    exml.DecryptDocument();
    
    exml.DecryptDocument()
    
  4. Сохраните объект XmlDocument.

    xmlDoc.Save("test.xml");
    
    xmlDoc.Save("test.xml")
    

Пример

В этом примере предполагается, что файл с именем "test.xml" существует в том же каталоге, что и скомпилированная программа. Кроме того, предполагается, что "test.xml" содержит элемент "creditcard". Можно поместить следующий XML-код в файл с именем test.xml и использовать его вместе с данным примером.

<root>  
    <creditcard>  
        <number>19834209</number>  
        <expiry>02/02/2002</expiry>  
    </creditcard>  
</root>  
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();
    }
}
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.  
        ArgumentNullException.ThrowIfNull(Doc)

        ' Create a new EncryptedXml object.
        Dim exml As New EncryptedXml(Doc)
        ' Decrypt the XML document.
        exml.DecryptDocument()
    End Sub
End Module

Компиляция кода

Безопасность .NET

Используемый в этом примере сертификат X.509 предназначен исключительно для тестирования. Приложения должны использовать сертификат X.509, созданный доверенным центром сертификации.

См. также