Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Xml belgesi içindeki bir öğeyi System.Security.Cryptography.Xml şifrelemek için ad alanında sınıfları kullanabilirsiniz. XML Şifrelemesi, verilerin kolayca okunması konusunda endişelenmeden hassas XML'yi depolamanıza veya taşımanıza olanak tanır. Bu kod örneği, Gelişmiş Şifreleme Standardı (AES) algoritmasını kullanarak xml öğesinin şifresini çözer.
Bu yordamı kullanarak bir XML öğesini şifreleme hakkında bilgi için bkz . Nasıl yapılır: XML Öğelerini Simetrik Anahtarlarla Şifreleme.
XML verilerini şifrelemek için AES gibi bir simetrik algoritma kullandığınızda, XML verilerini şifrelemek ve şifresini çözmek için aynı anahtarı kullanmanız gerekir. Bu yordamdaki örnekte, şifrelenmiş XML'in aynı anahtar kullanılarak şifrelendiği ve şifreleme ve şifre çözme taraflarının kullanılacak algoritma ve anahtar konusunda anlaşıldığı varsayılır. Bu örnek, AES anahtarını şifrelenmiş XML içinde depolamaz veya şifrelemez.
Bu örnek, tek bir uygulamanın verileri bellekte depolanan bir oturum anahtarına veya paroladan türetilmiş şifreleme açısından güçlü bir anahtara göre şifrelemesi gereken durumlar için uygundur. İki veya daha fazla uygulamanın şifrelenmiş XML verilerini paylaşması gereken durumlarda, asimetrik algoritmayı veya X.509 sertifikasını temel alan bir şifreleme şeması kullanmayı göz önünde bulundurun.
XML öğesinin şifresini bir simetrik anahtarla çözmek için
Nasıl yapılır: XML Öğelerini Simetrik Anahtarlarla Şifreleme başlığı altında açıklanan teknikleri kullanarak bir XML öğesini daha önce oluşturulan anahtarla şifreleyin.
Şifrelenmiş XML içeren <
EncryptedData
> bir XmlDocument nesnede öğesini bulun (XML Şifreleme standardıyla tanımlanır) ve bu öğeyi temsil etmek için yeni XmlElement bir nesne oluşturun.XmlElement? encryptedElement = Doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
Dim encryptedElement As XmlElement = Doc.GetElementsByTagName("EncryptedData")(0)
Daha önce oluşturulan XmlElement nesneden ham XML verilerini yükleyerek bir EncryptedData nesne oluşturun.
EncryptedData edElement = new(); edElement.LoadXml(encryptedElement);
Dim edElement As New EncryptedData() edElement.LoadXml(encryptedElement)
Yeni EncryptedXml bir nesne oluşturun ve şifreleme için kullanılan anahtarı kullanarak XML verilerinin şifresini çözmek için kullanın.
EncryptedXml exml = new(); // Decrypt the element using the symmetric key. byte[] rgbOutput = exml.DecryptData(edElement, Alg);
Dim exml As New EncryptedXml() ' Decrypt the element using the symmetric key. Dim rgbOutput As Byte() = exml.DecryptData(edElement, Alg)
Şifrelenmiş öğeyi XML belgesinde yeni şifresi çözülen düz metin öğesiyle değiştirin.
exml.ReplaceData(encryptedElement, rgbOutput);
exml.ReplaceData(encryptedElement, rgbOutput)
Örnek
Bu örnekte, adlı "test.xml"
bir dosyanın derlenen programla aynı dizinde mevcut olduğu varsayılır. Ayrıca bir "creditcard"
öğe içerdiğini "test.xml"
varsayar. Aşağıdaki XML'yi adlı test.xml
bir dosyaya yerleştirebilir ve bu örnekle kullanabilirsiniz.
<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;
namespace CSCrypto
{
class Program
{
static void Main(string[] args)
{
Aes? key = null;
try
{
// Create a new AES key.
key = Aes.Create();
// Load an XML document.
XmlDocument xmlDoc = new()
{
PreserveWhitespace = true
};
xmlDoc.Load("test.xml");
// Encrypt the "creditcard" element.
Encrypt(xmlDoc, "creditcard", key);
Console.WriteLine("The element was encrypted");
Console.WriteLine(xmlDoc.InnerXml);
Decrypt(xmlDoc, key);
Console.WriteLine("The element was decrypted");
Console.WriteLine(xmlDoc.InnerXml);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
key?.Clear();
}
}
public static void Encrypt(XmlDocument Doc, string ElementName, SymmetricAlgorithm Key)
{
// Check the arguments.
ArgumentNullException.ThrowIfNull(Doc);
ArgumentNullException.ThrowIfNull(ElementName);
ArgumentNullException.ThrowIfNull(Key);
////////////////////////////////////////////////
// Find the specified element in the XmlDocument
// object and create a new XmlElement object.
////////////////////////////////////////////////
XmlElement? elementToEncrypt = Doc.GetElementsByTagName(ElementName)[0] as XmlElement;
// Throw an XmlException if the element was not found.
if (elementToEncrypt == null)
{
throw new XmlException("The specified element was not found");
}
//////////////////////////////////////////////////
// Create a new instance of the EncryptedXml class
// and use it to encrypt the XmlElement with the
// symmetric key.
//////////////////////////////////////////////////
EncryptedXml eXml = new();
byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, Key, false);
////////////////////////////////////////////////
// Construct an EncryptedData object and populate
// it with the desired encryption information.
////////////////////////////////////////////////
EncryptedData edElement = new()
{
Type = EncryptedXml.XmlEncElementUrl
};
// Create an EncryptionMethod element so that the
// receiver knows which algorithm to use for decryption.
// Determine what kind of algorithm is being used and
// supply the appropriate URL to the EncryptionMethod element.
string? encryptionMethod;
if (Key is Aes)
{
encryptionMethod = EncryptedXml.XmlEncAES256Url;
}
else
{
// Throw an exception if the transform is not AES
throw new CryptographicException("The specified algorithm is not supported or not recommended for XML Encryption.");
}
edElement.EncryptionMethod = new EncryptionMethod(encryptionMethod);
// Add the encrypted element data to the
// EncryptedData object.
edElement.CipherData.CipherValue = encryptedElement;
////////////////////////////////////////////////////
// Replace the element from the original XmlDocument
// object with the EncryptedData element.
////////////////////////////////////////////////////
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
}
public static void Decrypt(XmlDocument Doc, SymmetricAlgorithm Alg)
{
// Check the arguments.
ArgumentNullException.ThrowIfNull(Doc);
ArgumentNullException.ThrowIfNull(Alg);
// Find the EncryptedData element in the XmlDocument.
XmlElement? encryptedElement = Doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
// If the EncryptedData element was not found, throw an exception.
if (encryptedElement == null)
{
throw new XmlException("The EncryptedData element was not found.");
}
// Create an EncryptedData object and populate it.
EncryptedData edElement = new();
edElement.LoadXml(encryptedElement);
// Create a new EncryptedXml object.
EncryptedXml exml = new();
// Decrypt the element using the symmetric key.
byte[] rgbOutput = exml.DecryptData(edElement, Alg);
// Replace the encryptedData element with the plaintext XML element.
exml.ReplaceData(encryptedElement, rgbOutput);
}
}
}
Imports System.Xml
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Module Program
Sub Main(ByVal args() As String)
Dim key As Aes = Nothing
Try
' Create a new Aes key.
key = Aes.Create()
' Load an XML document.
Dim xmlDoc As New XmlDocument()
xmlDoc.PreserveWhitespace = True
xmlDoc.Load("test.xml")
' Encrypt the "creditcard" element.
Encrypt(xmlDoc, "creditcard", key)
Console.WriteLine("The element was encrypted")
Console.WriteLine(xmlDoc.InnerXml)
Decrypt(xmlDoc, key)
Console.WriteLine("The element was decrypted")
Console.WriteLine(xmlDoc.InnerXml)
Catch e As Exception
Console.WriteLine(e.Message)
Finally
' Clear the key.
If Not (key Is Nothing) Then
key.Clear()
End If
End Try
End Sub
Sub Encrypt(ByVal Doc As XmlDocument, ByVal ElementName As String, ByVal Key As SymmetricAlgorithm)
' Check the arguments.
ArgumentNullException.ThrowIfNull(Doc)
ArgumentNullException.ThrowIfNull(ElementName)
ArgumentNullException.ThrowIfNull(Key)
''''''''''''''''''''''''''''''''''''''''''''''''''
' Find the specified element in the XmlDocument
' object and create a new XmlElemnt object.
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim elementToEncrypt As XmlElement = Doc.GetElementsByTagName(ElementName)(0)
' Throw an XmlException if the element was not found.
If elementToEncrypt Is Nothing Then
Throw New XmlException("The specified element was not found")
End If
''''''''''''''''''''''''''''''''''''''''''''''''''
' Create a new instance of the EncryptedXml class
' and use it to encrypt the XmlElement with the
' symmetric key.
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim eXml As New EncryptedXml()
Dim encryptedElement As Byte() = eXml.EncryptData(elementToEncrypt, Key, False)
''''''''''''''''''''''''''''''''''''''''''''''''''
' Construct an EncryptedData object and populate
' it with the desired encryption information.
''''''''''''''''''''''''''''''''''''''''''''''''''
Dim edElement As New EncryptedData()
edElement.Type = EncryptedXml.XmlEncElementUrl
' Create an EncryptionMethod element so that the
' receiver knows which algorithm to use for decryption.
' Determine what kind of algorithm is being used and
' supply the appropriate URL to the EncryptionMethod element.
Dim encryptionMethod As String = Nothing
If TypeOf Key Is Aes Then
encryptionMethod = EncryptedXml.XmlEncAES256Url
Else
' Throw an exception if the transform is not in the previous categories
Throw New CryptographicException("The specified algorithm is not supported or not recommended for XML Encryption.")
End If
edElement.EncryptionMethod = New EncryptionMethod(encryptionMethod)
' Add the encrypted element data to the
' EncryptedData object.
edElement.CipherData.CipherValue = encryptedElement
''''''''''''''''''''''''''''''''''''''''''''''''''
' Replace the element from the original XmlDocument
' object with the EncryptedData element.
''''''''''''''''''''''''''''''''''''''''''''''''''
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, False)
End Sub
Sub Decrypt(ByVal Doc As XmlDocument, ByVal Alg As SymmetricAlgorithm)
' Check the arguments.
If Doc Is Nothing Then
Throw New ArgumentNullException("Doc")
End If
If Alg Is Nothing Then
Throw New ArgumentNullException("Alg")
End If
' Find the EncryptedData element in the XmlDocument.
Dim encryptedElement As XmlElement = Doc.GetElementsByTagName("EncryptedData")(0)
' If the EncryptedData element was not found, throw an exception.
If encryptedElement Is Nothing Then
Throw New XmlException("The EncryptedData element was not found.")
End If
' Create an EncryptedData object and populate it.
Dim edElement As New EncryptedData()
edElement.LoadXml(encryptedElement)
' Create a new EncryptedXml object.
Dim exml As New EncryptedXml()
' Decrypt the element using the symmetric key.
Dim rgbOutput As Byte() = exml.DecryptData(edElement, Alg)
' Replace the encryptedData element with the plaintext XML element.
exml.ReplaceData(encryptedElement, rgbOutput)
End Sub
End Module
Kod Derleniyor
.NET Framework'ün hedef olduğu bir projede, öğesine
System.Security.dll
bir başvuru ekleyin..NET Core veya .NET 5'i hedefleyen bir projede, System.Security.Cryptography.Xml NuGet paketini yükleyin.
Şu ad alanlarını ekleyin: System.Xml, System.Security.Cryptographyve System.Security.Cryptography.Xml.
.NET Güvenliği
Şifreleme anahtarını hiçbir zaman düz metin olarak depolamayın veya düz metin olarak makineler arasında anahtar aktarmayın.
Simetrik şifreleme anahtarı kullanmayı bitirdiğinizde, her bayt değerini sıfır olarak ayarlayarak veya yönetilen şifreleme sınıfının yöntemini çağırarak Clear bellekten temizleyin.