Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
U kunt de klassen in de System.Security.Cryptography.Xml naamruimte gebruiken om een element in een XML-document te versleutelen en ontsleutelen. XML-versleuteling is een standaardmethode voor het uitwisselen of opslaan van versleutelde XML-gegevens, zonder dat u zich zorgen hoeft te maken over de gegevens die gemakkelijk kunnen worden gelezen. Zie de aanbeveling XML Signature Syntax en Processing (World Wide Web Consortium) voor meer informatie over de XML-versleutelingsstandaard.
Notitie
De code in dit artikel is van toepassing op Windows.
In het voorbeeld in deze procedure wordt een XML-element ontsleuteld dat is versleuteld met behulp van de methoden die worden beschreven in Procedure: XML-elementen versleutelen met Asymmetrische sleutels. Er wordt een <EncryptedData> element gevonden, het element ontsleutelt en vervolgens het element vervangen door het oorspronkelijke XML-element zonder opmaak.
In dit voorbeeld wordt een XML-element ontsleuteld met twee sleutels. Hiermee wordt een eerder gegenereerde persoonlijke RSA-sleutel opgehaald uit een sleutelcontainer en wordt vervolgens de RSA-sleutel gebruikt om een sessiesleutel te ontsleutelen die is opgeslagen in het <EncryptedKey> element van het <EncryptedData> element. In het voorbeeld wordt vervolgens de sessiesleutel gebruikt om het XML-element te ontsleutelen.
Dit voorbeeld is geschikt voor situaties waarin meerdere toepassingen versleutelde gegevens moeten delen of waar een toepassing versleutelde gegevens moet opslaan tussen de tijden waarop deze wordt uitgevoerd.
Een XML-element ontsleutelen met een asymmetrische sleutel
Maak een CspParameters object en geef de naam van de sleutelcontainer op.
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "XML_ENC_RSA_KEY";Dim cspParams As New CspParameters() cspParams.KeyContainerName = "XML_ENC_RSA_KEY"Haal een eerder gegenereerde asymmetrische sleutel op uit de container met behulp van het RSACryptoServiceProvider object. De sleutel wordt automatisch opgehaald uit de sleutelcontainer wanneer u het CspParameters object doorgeeft aan de RSACryptoServiceProvider constructor.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);Dim rsaKey As New RSACryptoServiceProvider(cspParams)Maak een nieuw EncryptedXml object om het document te ontsleutelen.
// Create a new EncryptedXml object. EncryptedXml exml = new EncryptedXml(Doc);' Create a new EncryptedXml object. Dim exml As New EncryptedXml(Doc)Voeg een sleutel/naamtoewijzing toe om de RSA-sleutel te koppelen aan het element in het document dat moet worden ontsleuteld. U moet dezelfde naam gebruiken voor de sleutel die u hebt gebruikt bij het versleutelen van het document. Deze naam staat los van de naam die wordt gebruikt om de sleutel te identificeren in de sleutelcontainer die is opgegeven in stap 1.
exml.AddKeyNameMapping(KeyName, Alg);exml.AddKeyNameMapping(KeyName, Alg)Roep de DecryptDocument methode aan om het <
EncryptedData> element te ontsleutelen. Deze methode gebruikt de RSA-sleutel om de sessiesleutel te ontsleutelen en gebruikt automatisch de sessiesleutel om het XML-element te ontsleutelen. Het element wordt ook automatisch vervangen door <EncryptedData> de oorspronkelijke tekst zonder opmaak.exml.DecryptDocument();exml.DecryptDocument()Sla het XML-document op.
xmlDoc.Save("test.xml");xmlDoc.Save("test.xml")
Opmerking
In dit voorbeeld wordt ervan uitgegaan dat een bestand met de naam test.xml bestaat in dezelfde map als het gecompileerde programma. Ook wordt ervan uitgegaan dat het een XML-element bevat dat test.xml is versleuteld met behulp van de technieken die worden beschreven in Procedure: XML-elementen versleutelen met asymmetrische sleutels.
using System;
using System.Xml;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Runtime.Versioning;
[SupportedOSPlatform("windows")]
class Program
{
static void Main(string[] args)
{
// Create an XmlDocument object.
XmlDocument xmlDoc = new XmlDocument();
// Load an XML file into the XmlDocument object.
try
{
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load("test.xml");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
// Get the RSA key from the key container. This key will decrypt
// a symmetric key that was imbedded in the XML document.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
try
{
// Decrypt the elements.
Decrypt(xmlDoc, rsaKey, "rsaKey");
// Save the XML document.
xmlDoc.Save("test.xml");
// Display the encrypted XML to the console.
Console.WriteLine();
Console.WriteLine("Decrypted XML:");
Console.WriteLine();
Console.WriteLine(xmlDoc.OuterXml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
// Clear the RSA key.
rsaKey.Clear();
}
Console.ReadLine();
}
public static void Decrypt(XmlDocument Doc, RSA Alg, string KeyName)
{
// Check the arguments.
if (Doc == null)
throw new ArgumentNullException("Doc");
if (Alg == null)
throw new ArgumentNullException("Alg");
if (KeyName == null)
throw new ArgumentNullException("KeyName");
// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml(Doc);
// Add a key-name mapping.
// This method can only decrypt documents
// that present the specified key name.
exml.AddKeyNameMapping(KeyName, Alg);
// Decrypt the element.
exml.DecryptDocument();
}
}
Imports System.Xml
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Module Program
Sub Main(ByVal args() As String)
' Create an XmlDocument object.
Dim xmlDoc As New XmlDocument()
' Load an XML file into the XmlDocument object.
Try
xmlDoc.PreserveWhitespace = True
xmlDoc.Load("test.xml")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
Dim cspParams As New CspParameters()
cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
' Get the RSA key from the key container. This key will decrypt
' a symmetric key that was imbedded in the XML document.
Dim rsaKey As New RSACryptoServiceProvider(cspParams)
Try
' Decrypt the elements.
Decrypt(xmlDoc, rsaKey, "rsaKey")
' Save the XML document.
xmlDoc.Save("test.xml")
' Display the encrypted XML to the console.
Console.WriteLine()
Console.WriteLine("Decrypted XML:")
Console.WriteLine()
Console.WriteLine(xmlDoc.OuterXml)
Catch e As Exception
Console.WriteLine(e.Message)
Finally
' Clear the RSA key.
rsaKey.Clear()
End Try
Console.ReadLine()
End Sub
Sub Decrypt(ByVal Doc As XmlDocument, ByVal Alg As RSA, ByVal KeyName As String)
' Check the arguments.
ArgumentNullException.ThrowIfNull(Doc)
ArgumentNullException.ThrowIfNull(Alg)
ArgumentNullException.ThrowIfNull(KeyName)
' Create a new EncryptedXml object.
Dim exml As New EncryptedXml(Doc)
' Add a key-name mapping.
' This method can only decrypt documents
' that present the specified key name.
exml.AddKeyNameMapping(KeyName, Alg)
' Decrypt the element.
exml.DecryptDocument()
End Sub
End Module
De code compileren
Neem in een project dat is gericht op .NET Framework een verwijzing naar
System.Security.dll.Installeer nuGet-pakket System.Security.Cryptography.Xml in een project dat is gericht op .NET Core of .NET 5.
Neem de volgende naamruimten op: System.Xml, System.Security.Cryptographyen System.Security.Cryptography.Xml.
.NET-beveiliging
Sla nooit een symmetrische cryptografische sleutel op in platte tekst of draag een symmetrische sleutel over tussen computers in platte tekst. Sla de persoonlijke sleutel van een asymmetrisch sleutelpaar bovendien nooit op in tekst zonder opmaak. Zie Sleutels genereren voor versleuteling en ontsleuteling voor meer informatie over symmetrische en asymmetrische cryptografische sleutels.
Sluit nooit rechtstreeks een sleutel in uw broncode in. Ingesloten sleutels kunnen eenvoudig uit een assembly worden gelezen met behulp van Ildasm.exe (IL Disassembler) of door de assembly te openen in een teksteditor zoals Kladblok.
Wanneer u klaar bent met het gebruik van een cryptografische sleutel, wist u deze van het geheugen door elke byte in te stellen op nul of door de Clear methode van de beheerde cryptografieklasse aan te roepen. Cryptografische sleutels kunnen soms vanuit het geheugen worden gelezen door een foutopsporingsprogramma of worden gelezen vanaf een harde schijf als de geheugenlocatie naar de schijf wordt gepaginad.