Panduan: Mendekripsi Elemen XML dengan Kunci Asimetris
Anda dapat menggunakan kelas di namespace layanan System.Security.Cryptography.Xml untuk mengenkripsi dan mendekripsi elemen dalam dokumen XML. Enkripsi XML adalah cara standar untuk bertukar atau menyimpan data XML terenkripsi, tanpa khawatir tentang data yang mudah dibaca. Untuk informasi selengkapnya tentang standar Enkripsi XML. Enkripsi file XML, lihat rekomendasi Konsorsium World Wide Web (W3C) Sintaks dan Pemrosesan XML-Signature .
Catatan
Kode ini berlaku untuk Windows.
Contoh ini mendekripsi elemen XML yang dienkripsi menggunakan metode yang dijelaskan di: Cara: Mengenkripsi Elemen XML menggunakan Kunci Asimetris. Ini menemukan elemen <EncryptedData
>, mendekripsi elemen, dan kemudian mengganti elemen dengan elemen XML teks biasa asli.
Contoh ini mengenkripsi elemen XML menggunakan dua kunci. Ini mengambil kunci privat RSA yang dihasilkan sebelumnya dari kontainer kunci, lalu menggunakan kunci RSA untuk mendekripsi kunci sesi yang disimpan dalam elemen <EncryptedKey
> dari elemen <EncryptedData
>. Contoh kemudian menggunakan kunci sesi untuk mendekripsi elemen XML.
Contoh ini sesuai untuk situasi di mana beberapa aplikasi perlu berbagi data terenkripsi atau di mana aplikasi perlu menyimpan data terenkripsi antara waktu berjalannya.
Untuk mengenkripsi elemen XML dengan kunci asimetris
Buat objek CspParameters dan tentukan nama kontainer kunci.
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
Dim cspParams As New CspParameters() cspParams.KeyContainerName = "XML_ENC_RSA_KEY"
Ambil kunci asimetris yang dihasilkan sebelumnya dari kontainer menggunakan objek RSACryptoServiceProvider. Kunci secara otomatis diambil dari kontainer kunci saat Anda meneruskan objek CspParameters ke konstruktor RSACryptoServiceProvider.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
Dim rsaKey As New RSACryptoServiceProvider(cspParams)
Buat objek EncryptedXml baru untuk mendekripsi dokumen.
// Create a new EncryptedXml object. EncryptedXml exml = new EncryptedXml(Doc);
' Create a new EncryptedXml object. Dim exml As New EncryptedXml(Doc)
Tambahkan pemetaan kunci/nama untuk mengaitkan kunci RSA dengan elemen dalam dokumen yang harus didekripsi. Anda harus menggunakan nama yang sama untuk kunci yang Anda gunakan saat mengenkripsi dokumen. Perhatikan bahwa nama ini terpisah dari nama yang digunakan untuk mengidentifikasi kunci dalam kontainer kunci yang ditentukan di langkah 1.
exml.AddKeyNameMapping(KeyName, Alg);
exml.AddKeyNameMapping(KeyName, Alg)
Panggil metode DecryptDocument untuk mendekripsi elemen <
EncryptedData
>. Metode ini menggunakan kunci RSA untuk mendekripsi kunci sesi dan secara otomatis menggunakan kunci sesi untuk mendekripsi elemen XML. Ini juga secara otomatis mengganti elemen <EncryptedData
> dengan teks biasa asli.exml.DecryptDocument();
exml.DecryptDocument()
Simpan dokumen XML.
xmlDoc.Save("test.xml");
xmlDoc.Save("test.xml")
Contoh
Contoh ini mengasumsikan bahwa file yang bernama test.xml
berada dalam direktori yang sama dengan program yang dikompilasi. Ini juga mengasumsikan bahwa test.xml
berisi elemen XML yang dienkripsi menggunakan teknik yang dijelaskan dalam Cara: Mengenkripsi Elemen XML dengan Kunci Asimetris.
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
Mengompilasi Kode
Dalam proyek yang menargetkan .NET Framework, sertakan referensi ke
System.Security.dll
.Dalam proyek yang menargetkan .NET Core atau .NET 5, instal paket NuGet System.Security.Cryptography.Xml.
Sertakan namespace layanan berikut: System.Xml, System.Security.Cryptography, dan System.Security.Cryptography.Xml.
.NET Keamanan
Jangan pernah menyimpan kunci kriptografi simetris dalam teks biasa atau mentransfer kunci simetris antara mesin dalam teks biasa. Selain itu, jangan pernah menyimpan atau mentransfer kunci privat dari pasangan kunci asimetris dalam teks biasa. Untuk informasi selengkapnya tentang kunci kriptografi simetris dan asimetris, lihat Membuat Kunci untuk Enkripsi dan Dekripsi.
Jangan pernah menyematkan kunci langsung ke dalam kode sumber Anda. Kunci yang disematkan dapat dengan mudah dibaca dari perakitan menggunakan Ildasm.exe (Il Disassembler) atau dengan membuka rakitan di editor teks seperti Notepad.
Ketika Anda selesai menggunakan kunci kriptografi, bersihkan dari memori dengan mengatur setiap byte ke nol atau dengan memanggil metode Clear kelas kriptografi terkelola. Kunci kriptografi terkadang dapat dibaca dari memori oleh debugger atau dibaca dari hard drive jika lokasi memori di-page ke disk.