SignedXml Sınıf

Tanım

XML imzaları oluşturmayı kolaylaştırmak için çekirdek XML imza nesnesi üzerinde bir sarmalayıcı sağlar.

public ref class SignedXml
public class SignedXml
type SignedXml = class
Public Class SignedXml
Devralma
SignedXml

Örnekler

Aşağıdaki kod örneğinde zarflı imza kullanarak xml belgesinin tamamını imzalama ve doğrulama gösterilmektedir.

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;

public class SignVerifyEnvelope
{

    public static void Main(String[] args)
    {
        try
        {
           // Generate a signing key.
           RSA Key = RSA.Create();

           // Create an XML file to sign.
           CreateSomeXml("Example.xml");
           Console.WriteLine("New XML file created."); 

           // Sign the XML that was just created and save it in a 
           // new file.
           SignXmlFile("Example.xml", "signedExample.xml", Key);
           Console.WriteLine("XML file signed."); 

           // Verify the signature of the signed XML.
           Console.WriteLine("Verifying signature...");
           bool result = VerifyXmlFile("SignedExample.xml", Key);

           // Display the results of the signature verification to 
           // the console.
           if(result)
           {
               Console.WriteLine("The XML signature is valid.");
           }
           else
           {
            Console.WriteLine("The XML signature is not valid.");
           }
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }
    }

    // Sign an XML file and save the signature in a new file. This method does not  
    // save the public key within the XML file.  This file cannot be verified unless  
    // the verifying code has the key with which it was signed.
    public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
    {
        // Create a new XML document.
        XmlDocument doc = new XmlDocument();

        // Load the passed XML file using its name.
        doc.Load(new XmlTextReader(FileName));

        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);

        // Add the key to the SignedXml document. 
        signedXml.SigningKey = Key;

        // Create a reference to be signed.
        Reference reference = new Reference();
        reference.Uri = "";

        // Add an enveloped transformation to the reference.
        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);

        // Add the reference to the SignedXml object.
        signedXml.AddReference(reference);

        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
        
        if (doc.FirstChild is XmlDeclaration)  
        {
            doc.RemoveChild(doc.FirstChild);
        }

        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
    }

    // Verify the signature of an XML file against an asymmetric 
    // algorithm and return the result.
    public static Boolean VerifyXmlFile(String Name, RSA Key)
    {
        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();

        // Load the passed XML file into the document. 
        xmlDocument.Load(Name);

        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);

        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);

        // Check the signature and return the result.
        return signedXml.CheckSignature(Key);
    }

    // Create example data to sign.
    public static void CreateSomeXml(string FileName)
    {
        // Create a new XmlDocument object.
        XmlDocument document = new XmlDocument();

        // Create a new XmlNode object.
        XmlNode  node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples");
        
        // Add some text to the node.
        node.InnerText = "Example text to be signed.";

        // Append the node to the document.
        document.AppendChild(node);

        // Save the XML document to the file name specified.
        XmlTextWriter xmltw = new XmlTextWriter(FileName, new UTF8Encoding(false));
        document.WriteTo(xmltw);
        xmltw.Close();
    }
}
'
' This example signs an XML file using an
' envelope signature. It then verifies the 
' signed XML.
'
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml



Public Class SignVerifyEnvelope
   
   Overloads Public Shared Sub Main(args() As [String])
      Try
         ' Generate a signing key.
         Dim Key As RSA = RSA.Create()
         
         ' Create an XML file to sign.
         CreateSomeXml("Example.xml")
         Console.WriteLine("New XML file created.")
         
         ' Sign the XML that was just created and save it in a 
         ' new file.
         SignXmlFile("Example.xml", "signedExample.xml", Key)
         Console.WriteLine("XML file signed.")
         
         ' Verify the signature of the signed XML.
         Console.WriteLine("Verifying signature...")
         Dim result As Boolean = VerifyXmlFile("SignedExample.xml", Key)
         
         ' Display the results of the signature verification to 
         ' the console.
         If result Then
            Console.WriteLine("The XML signature is valid.")
         Else
            Console.WriteLine("The XML signature is not valid.")
         End If
      Catch e As CryptographicException
         Console.WriteLine(e.Message)
      End Try
   End Sub 
   
   
   
   ' Sign an XML file and save the signature in a new file. This method does not  
   ' save the public key within the XML file.  This file cannot be verified unless  
   ' the verifying code has the key with which it was signed.
   Public Shared Sub SignXmlFile(FileName As String, SignedFileName As String, Key As RSA)
      ' Create a new XML document.
      Dim doc As New XmlDocument()
      
      ' Load the passed XML file using its name.
      doc.Load(New XmlTextReader(FileName))
      
      ' Create a SignedXml object.
      Dim signedXml As New SignedXml(doc)
      
      ' Add the key to the SignedXml document. 
      signedXml.SigningKey = Key
      
      ' Create a reference to be signed.
      Dim reference As New Reference()
      reference.Uri = ""
      
      ' Add an enveloped transformation to the reference.
      Dim env As New XmlDsigEnvelopedSignatureTransform()
      reference.AddTransform(env)
      
      ' Add the reference to the SignedXml object.
      signedXml.AddReference(reference)
      
      ' Compute the signature.
      signedXml.ComputeSignature()
      
      ' Get the XML representation of the signature and save
      ' it to an XmlElement object.
      Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
      
      ' Append the element to the XML document.
      doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))
      
      If TypeOf doc.FirstChild Is XmlDeclaration Then
         doc.RemoveChild(doc.FirstChild)
      End If
      
      ' Save the signed XML document to a file specified
      ' using the passed string.
      Dim xmltw As New XmlTextWriter(SignedFileName, New UTF8Encoding(False))
      doc.WriteTo(xmltw)
      xmltw.Close()
   End Sub
   
   
   ' Verify the signature of an XML file against an asymmetric 
   ' algorithm and return the result.
   Public Shared Function VerifyXmlFile(Name As [String], Key As RSA) As [Boolean]
      ' Create a new XML document.
      Dim xmlDocument As New XmlDocument()
      
      ' Load the passed XML file into the document. 
      xmlDocument.Load(Name)
      
      ' Create a new SignedXml object and pass it
      ' the XML document class.
      Dim signedXml As New SignedXml(xmlDocument)
      
      ' Find the "Signature" node and create a new
      ' XmlNodeList object.
      Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature")
      
      ' Load the signature node.
      signedXml.LoadXml(CType(nodeList(0), XmlElement))
      
      ' Check the signature and return the result.
      Return signedXml.CheckSignature(Key)
   End Function 
   
   
   
   ' Create example data to sign.
   Public Shared Sub CreateSomeXml(FileName As String)
      ' Create a new XmlDocument object.
      Dim document As New XmlDocument()
      
      ' Create a new XmlNode object.
      Dim node As XmlNode = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples")
      
      ' Add some text to the node.
      node.InnerText = "Example text to be signed."
      
      ' Append the node to the document.
      document.AppendChild(node)
      
      ' Save the XML document to the file name specified.
      Dim xmltw As New XmlTextWriter(FileName, New UTF8Encoding(False))
      document.WriteTo(xmltw)
      xmltw.Close()
   End Sub 
End Class

Aşağıdaki kod örneğinde, zarflama imzası kullanarak XML belgesinin tek bir öğesini imzalama ve doğrulama gösterilmektedir.

//
// This example signs an XML file using an
// envelope signature. It then verifies the
// signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;

public class SignVerifyEnvelope
{

    public static void Main(String[] args)
    {
        // Generate a signing key.
       RSA Key = RSA.Create();

       try
       {
           // Specify an element to sign.
           string[] elements =  { "#tag1" };

           // Sign an XML file and save the signature to a
           // new file.
           SignXmlFile("Test.xml", "SignedExample.xml", Key, elements);
           Console.WriteLine("XML file signed.");

           // Verify the signature of the signed XML.
           Console.WriteLine("Verifying signature...");

           bool result = VerifyXmlFile("SignedExample.xml");

           // Display the results of the signature verification to
           // the console.
           if (result)
           {
               Console.WriteLine("The XML signature is valid.");
           }
           else
           {
               Console.WriteLine("The XML signature is not valid.");
           }
       }
       catch (CryptographicException e)
       {
           Console.WriteLine(e.Message);
       }
       finally
       {
           // Clear resources associated with the
           // RSA instance.
           Key.Clear();
       }
   }

    // Sign an XML file and save the signature in a new file.
    public static void SignXmlFile(string FileName, string SignedFileName, RSA Key, string[] ElementsToSign)
    {
        // Check the arguments.
        if (FileName == null)
            throw new ArgumentNullException("FileName");
        if (SignedFileName == null)
            throw new ArgumentNullException("SignedFileName");
        if (Key == null)
            throw new ArgumentNullException("Key");
        if (ElementsToSign == null)
            throw new ArgumentNullException("ElementsToSign");

        // Create a new XML document.
        XmlDocument doc = new XmlDocument();

        // Format the document to ignore white spaces.
        doc.PreserveWhitespace = false;

        // Load the passed XML file using it's name.
        doc.Load(new XmlTextReader(FileName));

        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);

        // Add the key to the SignedXml document.
        signedXml.SigningKey = Key;

        // Loop through each passed element to sign
        // and create a reference.
        foreach (string s in ElementsToSign)
        {
            // Create a reference to be signed.
            Reference reference = new Reference();
            reference.Uri = s;

            // Add an enveloped transformation to the reference.
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);

            // Add the reference to the SignedXml object.
            signedXml.AddReference(reference);
        }

        // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new RSAKeyValue((RSA)Key));
        signedXml.KeyInfo = keyInfo;

        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

        if (doc.FirstChild is XmlDeclaration)
        {
            doc.RemoveChild(doc.FirstChild);
        }

        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
    }
    // Verify the signature of an XML file and return the result.
    public static Boolean VerifyXmlFile(String Name)
    {
        // Check the arguments.
        if (Name == null)
            throw new ArgumentNullException("Name");

        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();

        // Format using white spaces.
        xmlDocument.PreserveWhitespace = true;

        // Load the passed XML file into the document.
        xmlDocument.Load(Name);

        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);

        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);

        // Check the signature and return the result.
        return signedXml.CheckSignature();
    }
}
' This example signs an XML file using an
' envelope signature. It then verifies the 
' signed XML.
'
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml



Module SignVerifyEnvelope



    Sub Main(ByVal args() As String)
        ' Generate a signing key.
        Dim Key As RSA = RSA.Create()

        Try
            ' Specify an element to sign. 
            Dim elements As String() = New String() {"#tag1"}

            ' Sign an XML file and save the signature to a 
            ' new file.
            SignXmlFile("Test.xml", "SignedExample.xml", Key, elements)
            Console.WriteLine("XML file signed.")

            ' Verify the signature of the signed XML.
            Console.WriteLine("Verifying signature...")

            Dim result As Boolean = VerifyXmlFile("SignedExample.xml")

            ' Display the results of the signature verification to \
            ' the console.
            If result Then
                Console.WriteLine("The XML signature is valid.")
            Else
                Console.WriteLine("The XML signature is not valid.")
            End If
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        Finally
            ' Clear resources associated with the 
            ' RSA instance.
            Key.Clear()
        End Try

    End Sub


    ' Sign an XML file and save the signature in a new file.
    Sub SignXmlFile(ByVal FileName As String, ByVal SignedFileName As String, ByVal Key As RSA, ByVal ElementsToSign() As String)
        ' Check the arguments.  
        If FileName Is Nothing Then
            Throw New ArgumentNullException("FileName")
        End If
        If SignedFileName Is Nothing Then
            Throw New ArgumentNullException("SignedFileName")
        End If
        If Key Is Nothing Then
            Throw New ArgumentNullException("Key")
        End If
        If ElementsToSign Is Nothing Then
            Throw New ArgumentNullException("ElementsToSign")
        End If
        ' Create a new XML document.
        Dim doc As New XmlDocument()

        ' Format the document to ignore white spaces.
        doc.PreserveWhitespace = False

        ' Load the passed XML file using it's name.
        doc.Load(New XmlTextReader(FileName))

        ' Create a SignedXml object.
        Dim signedXml As New SignedXml(doc)

        ' Add the key to the SignedXml document. 
        signedXml.SigningKey = Key

        ' Loop through each passed element to sign 
        ' and create a reference.
        Dim s As String
        For Each s In ElementsToSign
            ' Create a reference to be signed.
            Dim reference As New Reference()
            reference.Uri = s

            ' Add an enveloped transformation to the reference.
            Dim env As New XmlDsigEnvelopedSignatureTransform()
            reference.AddTransform(env)

            ' Add the reference to the SignedXml object.
            signedXml.AddReference(reference)
        Next s

        ' Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        Dim keyInfo As New KeyInfo()
        keyInfo.AddClause(New RSAKeyValue(CType(Key, RSA)))
        signedXml.KeyInfo = keyInfo

        ' Compute the signature.
        signedXml.ComputeSignature()

        ' Get the XML representation of the signature and save
        ' it to an XmlElement object.
        Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()

        ' Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))


        If TypeOf doc.FirstChild Is XmlDeclaration Then
            doc.RemoveChild(doc.FirstChild)
        End If

        ' Save the signed XML document to a file specified
        ' using the passed string.
        Dim xmltw As New XmlTextWriter(SignedFileName, New UTF8Encoding(False))
        doc.WriteTo(xmltw)
        xmltw.Close()

    End Sub

    ' Verify the signature of an XML file and return the result.
    Function VerifyXmlFile(ByVal Name As String) As [Boolean]
        ' Check the arguments.  
        If Name Is Nothing Then
            Throw New ArgumentNullException("Name")
        End If
        ' Create a new XML document.
        Dim xmlDocument As New XmlDocument()

        ' Format using white spaces.
        xmlDocument.PreserveWhitespace = True

        ' Load the passed XML file into the document. 
        xmlDocument.Load(Name)

        ' Create a new SignedXml object and pass it
        ' the XML document class.
        Dim signedXml As New SignedXml(xmlDocument)

        ' Find the "Signature" node and create a new
        ' XmlNodeList object.
        Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature")

        ' Load the signature node.
        signedXml.LoadXml(CType(nodeList(0), XmlElement))

        ' Check the signature and return the result.
        Return signedXml.CheckSignature()

    End Function
End Module

Açıklamalar

SignedXml sınıfı, XMLDSIG (XML Dijital İmza) olarak da bilinen World Wide Web Konsorsiyumu (W3C) XML İmza Söz Dizimi ve İşleme Belirtimi'nin .NET uygulamasıdır. XMLDSIG, bir XML belgesinin veya Tekdüzen Kaynak Tanımlayıcısı (URI) ile adreslenebilir diğer verilerin tümünü veya bir bölümünü imzalamanın ve doğrulamanın standartlara dayalı ve birlikte çalışabilir bir yoludur.

SignedXml Uygulamalar veya kuruluşlar arasında imzalı XML verilerini standart bir şekilde paylaşmanız gerektiğinde sınıfını kullanın. Bu sınıf kullanılarak imzalanan tüm veriler, XMLDSIG için W3C belirtiminin uyumlu herhangi bir uygulaması tarafından doğrulanabilir.

sınıfı, SignedXml aşağıdaki üç tür XML dijital imzası oluşturmanıza olanak tanır:

İmza Türü Description
Zarflı imza İmza, imzalanan XML öğesinin içinde yer alır.
Çevreleyen imza İmzalı XML öğesinde <Signature> yer alır.
İç bağımsız imza İmza ve imzalı XML aynı belgede yer alır, ancak öğeden hiçbiri diğerini içermez.

Ayrıca, verilerin ve imzanın ayrı XML belgelerinde yer aldığı dış ayrılmış imza olarak adlandırılan dördüncü bir imza türü de vardır. SignedXml sınıfı dışarıya ayrılmış imzaları desteklemez.

XML imzasının yapısı

XMLDSIG, xml <Signature> belgesinin veya URI'den ele alınabilen diğer verilerin dijital imzalarını içeren bir öğe oluşturur. <Signature> öğesi isteğe bağlı olarak imzayı doğrulayacak bir anahtarın nerede bulunacağı ve imzalama için kullanılan şifreleme algoritması hakkında bilgi içerebilir. Temel yapı aşağıdaki gibidir:

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <Reference URI="">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <DigestValue>Base64EncodedValue==</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>AnotherBase64EncodedValue===</SignatureValue>
</Signature>

Bu yapının ana bölümleri şunlardır:

  • <CanonicalizationMethod> öğesi

    İmza doğrulaması için XML/metin Signature öğesini baytlara yeniden yazma kurallarını belirtir. .NET'teki varsayılan değer, güvenilir bir algoritmayı tanımlayan değeridir http://www.w3.org/TR/2001/REC-xml-c14n-20010315. Bu öğe özelliğiyle SignedInfo.CanonicalizationMethod temsil edilir.

  • <SignatureMethod> öğesi

    <Signature> içindeki değeri üretmek için <SignatureValue> öğesine uygulanan imza oluşturma ve doğrulama için kullanılan algoritmayı belirtir. Önceki örnekte, değer http://www.w3.org/2000/09/xmldsig#rsa-sha1 bir RSA PKCS1 SHA-1 imzası tanımlar. SHA-1 ile ilgili çakışma sorunları nedeniyle Microsoft, SHA-256 veya üzerini temel alan bir güvenlik modeli önerir. Bu öğe özelliğiyle SignatureMethod temsil edilir.

  • <SignatureValue> öğesi

    öğesinin şifreleme imzasını <Signature> belirtir. Bu imza doğrulanmazsa, bloğun <Signature> bir bölümüyle oynanmış ve belge geçersiz kabul edilir. Değerin <CanonicalizationMethod> güvenilir olduğu sürece, bu değer kurcalamaya karşı son derece dayanıklıdır. Bu öğe özelliğiyle SignatureValue temsil edilir.

  • URI öğesinin <Reference> özniteliği

    URI referansını kullanan bir veri nesnesini belirtir. Bu öznitelik özelliğiyle Reference.Uri temsil edilir.

    • özniteliğini URI belirtmemek, yani özelliğini olarak Reference.Uriayarlamaknull, alıcı uygulamanın nesnenin kimliğini bilmesinin beklendiği anlamına gelir. Çoğu durumda, bir null URI özel durum atılmasına neden olur. Uygulamanız bunu gerektiren bir null protokolle birlikte çalışmadığı sürece URI kullanmayın.

    • özniteliğini URI boş bir dize olarak ayarlamak, belgenin kök öğesinin imzalandığını gösterir. Bu, zarflı bir imza biçimidir.

    • Özniteliğin URI değeri # ile başlıyorsa, değerin geçerli belgedeki bir öğeye çözümlenmesi gerekir. Bu form desteklenen imza türlerinden herhangi biriyle (zarflı imza, zarflı imza veya iç ayrılmış imza) kullanılabilir.

    • SignedXml sınıfı tarafından desteklenmeyen her şey, bir dış kaynak bağımsız imzası olarak kabul edilir.

  • <Transforms> öğesi

    İmzalayanın <Transform> özetlenen veri nesnesini nasıl edindiğini açıklayan sıralı bir öğe listesi içerir. Dönüştürme algoritması, kurallı hale getirme yöntemine benzer, ancak <Signature> öğesini yeniden yazmak yerine, URI öğesinin <Reference> niteliği tarafından tanımlanan içeriği yeniden yazar. <Transforms> öğesi sınıfı tarafından TransformChain temsil edilir.

    • Her dönüştürme algoritması, giriş olarak XML (XPath düğüm kümesi) veya bayt alma olarak tanımlanır. Geçerli verilerin biçimi dönüştürme giriş gereksinimlerinden farklıysa dönüştürme kuralları uygulanır.

    • Her dönüştürme algoritması, çıktı olarak XML veya bayt üretme olarak tanımlanır.

    • Son dönüştürme algoritmasının çıkışı bayt cinsinden tanımlanmamışsa (veya hiçbir dönüşüm belirtilmediyse), kurallı hale getirme yöntemi örtük bir dönüşüm olarak kullanılır (öğesinde <CanonicalizationMethod> farklı bir algoritma belirtilse bile).

    • Dönüştürme algoritmasının http://www.w3.org/2000/09/xmldsig#enveloped-signature değerine sahip olması, <Signature> öğesini belgede kaldıracak şekilde yorumlanan bir kuralı kodlar. Aksi takdirde, zarflı bir imzayı doğrulayan kişi, belgeyi imza ile birlikte özetler, ancak imzalayan kişi belgeyi imza uygulanmadan önce özetlediği için farklı sonuçlara yol açar.

  • <DigestMethod> öğesi

    URI öğesi tarafından <Reference> özniteliği ile tanımlanan dönüştürülmüş içeriğe uygulanacak özet (şifreleme karması) yöntemini tanımlar. Bu özellik tarafından Reference.DigestMethod temsil edilir.

Kurallı hale getirme yöntemi seçme

Farklı bir değerin kullanılmasını gerektiren bir belirtimle birlikte çalışmadığınız sürece, değeri http://www.w3.org/TR/2001/REC-xml-c14n-20010315olan XML-C14N 1.0 algoritması olan varsayılan .NET kurallı hale getirme yöntemini kullanmanızı öneririz. XML-C14N 1.0 algoritmasının, özellikle de uygulanacak örtük bir son dönüşüm olduğundan, XMLDSIG'nin tüm uygulamaları tarafından desteklenmesi gerekir.

Açıklamaları korumayı destekleyen kurallılaştırma algoritmalarının sürümleri vardır. Yorum koruma kurallı hale getirme yöntemleri "görülenleri işaretle" ilkesini ihlal ettiğinden önerilmez. Başka bir ifadeyle, bir <Signature> öğedeki açıklamalar, imzanın nasıl gerçekleştirileceğine ilişkin işlem mantığını değiştirmez, yalnızca imza değerinin ne olduğudur. Zayıf bir imza algoritmasıyla birleştirildiğinde, açıklamaların eklenmesine izin vermek, saldırgana bir karma çakışması yaratmak için gereksiz bir serbestlik tanır ve bu da üzerinde oynanmış bir belgenin meşru görünmesini sağlar. .NET Framework'te varsayılan olarak yalnızca yerleşik kurallı oluşturucular desteklenir. Ekstra veya özel kurallılaştırıcıları desteklemek için SafeCanonicalizationMethods özelliğine bakın. Belge özelliği tarafından SafeCanonicalizationMethods temsil edilen koleksiyonda olmayan bir kurallılaştırma yöntemi kullanıyorsa, CheckSignature yöntemi döndürür false.

Note

Son derece savunma amaçlı bir uygulama, imzalayanların koleksiyondan SafeCanonicalizationMethods kullanmasını beklemediği tüm değerleri kaldırabilir.

Referans değerleri değişikliğe karşı korumalı mı?

Evet, <Reference> değerler kurcalanmaya karşı güvenlidir. .NET, herhangi bir <SignatureValue> değerini ve bunlarla ilişkili dönüşümlerini işlemeye başlamadan önce <Reference> hesaplamayı doğrular ve potansiyel olarak kötü niyetli işleme talimatlarını önlemek için işlemi erkenden iptal eder.

İmzalayacak öğeleri seçme

Mümkünse özniteliği için URI "" değerini kullanmanızı (veya özelliğini boş bir dize olarak ayarlamanızı Uri ) öneririz. Bu, tüm belgenin özet hesaplaması için dikkate alındığı anlamına gelir ve bu da belgenin tamamının kurcalanmaya karşı korunduğu anlamına gelir.

ID özniteliği "foo" olan bir öğeye işaret eden #foo gibi bağlantı biçimindeki URI değerlerini görmek çok yaygındır. Ne yazık ki, bağlamı değil yalnızca hedef öğenin içeriğini içerdiğinden, üzerinde oynanması kolaydır. Bu ayrımı kötüye kullanarak XML İmza Sarmalama (XSW) olarak bilinir.

Uygulamanız açıklamaların anlamsal olduğunu düşünüyorsa (XML ile çalışırken yaygın değildir), "" yerine "#xpointer(/)" ve "#foo" yerine "#xpointer(id('foo'))" kullanmanız gerekir. #xpointer sürümleri yorumlar dahil edilerek ele alınırken, kısa isim formları ise yorumları hariç tutar.

Belgelerin yalnızca kısmen korunduğu durumlarda ve imzanın koruduğu içeriği okuduğunuzdan emin olmak istediğinizde GetIdElement yöntemini kullanın.

KeyInfo öğesiyle ilgili güvenlik konuları

İmzayı doğrulamak için bir anahtar içeren isteğe bağlı <KeyInfo> öğesindeki (yani KeyInfo özelliğindeki) verilere güvenilmemelidir.

Özellikle, KeyInfo değeri bir RSA, DSA veya ECDSA çıplak ortak anahtarını temsil ettiğinde, imzanın geçerli olduğunu bildiren CheckSignature yöntemine rağmen belge üzerinde oynanmış olabilir. Bu durum, üzerinde değişiklik yapan varlığın yalnızca yeni bir anahtar oluşturması ve üzerinde oynanan belgeyi bu yeni anahtarla yeniden imzalaması gerektiğinden oluşabilir. Bu nedenle, uygulamanız ortak anahtarın beklenen bir değer olduğunu doğrulamadığı sürece, belge üzerinde oynanmış gibi davranılmalıdır. Bu, uygulamanızın belgenin içine eklenmiş ortak anahtarı incelemesini ve belge bağlamı için bilinen değerler listesinde doğrulamasını gerektirir. Örneğin, belgenin bilinen bir kullanıcı tarafından verildiği anlaşılabilseydi, bu kullanıcı tarafından kullanılan bilinen anahtarlar listesinde anahtarı denetlersiniz.

Belgeyi işledikten sonra CheckSignatureReturningKey yöntemi yerine CheckSignature yöntemini kullanarak anahtarı doğrulayabilirsiniz. Ancak en iyi güvenlik için anahtarı önceden doğrulamanız gerekir.

Alternatif olarak, <KeyInfo> öğesinin içindekileri okumak yerine, kullanıcının kayıtlı ortak anahtarlarını denemeyi düşünün.

X509Data öğesiyle ilgili güvenlik konuları

İsteğe bağlı <X509Data> öğe öğenin alt <KeyInfo> öğesidir ve X509 sertifikaları için bir veya daha fazla X509 sertifikası veya tanımlayıcısı içerir. öğesindeki <X509Data> verilere de doğal olarak güvenilmemelidir.

Eklenmiş <X509Data> öğeyle belge doğrulanırken, .NET yalnızca verilerin ortak anahtarı belge imzasını doğrulamak için başarıyla kullanılabilen bir X509 sertifikasına çözümlendiğini doğrular. CheckSignature yönteminin verifySignatureOnly olarak ayarlanmış false parametresiyle çağrılması durumunun aksine, herhangi bir iptal denetimi yapılmaz, zincir güveni kontrol edilmez ve süre sonu doğrulanmaz. Uygulamanız sertifikanın kendisini ayıklayıp CheckSignature parametresini verifySignatureOnly olarak ayarlayarak false yöntemine geçirse bile, bu yine de belge üzerinde değişiklik yapılmasını önlemek için yeterli bir doğrulama değildir. Sertifikanın imzalanan belge için uygun olduğu yine de doğrulanmalıdır.

Katıştırılmış bir imzalama sertifikası kullanmak, <X509Data> bölümünde ya da belge içeriğinde yararlı anahtar döndürme stratejileri sağlayabilir. Bu yaklaşımı kullanırken uygulamanın sertifikayı el ile ayıklaması ve aşağıdakine benzer bir doğrulama gerçekleştirmesi gerekir:

  • Sertifika, genel sertifikası uygulamaya eklenmiş olan bir Sertifika Yetkilisi (CA) tarafından doğrudan veya bir zincir üzerinden verildi.

    İşletim sistemi tarafından sağlanan güven listesini, bilinen bir konu adı gibi kriterlerle ek denetimler olmadan kullanmak, SignedXml üzerinde oynanmasını önlemek için yeterli değildir.

  • Sertifikanın belge imzalama sırasında süresinin dolmadığı doğrulanır (veya neredeyse gerçek zamanlı belge işleme için "şimdi").

  • ca tarafından verilen ve iptali destekleyen uzun süreli sertifikalar için sertifikanın iptal edilmediğini doğrulayın.

  • Sertifika konusu geçerli belgeye uygun olduğu doğrulanır.

Dönüştürme algoritmasını seçme

Belirli değerleri (XrML gibi) dikte eden bir belirtim ile çalışıyorsanız, belirtimi izlemeniz gerekir. Zarflı bir imzanız varsa (örneğin, belgenin tamamını imzalarken) kullanmanız http://www.w3.org/2000/09/xmldsig#enveloped-signature gerekir (sınıf tarafından XmlDsigEnvelopedSignatureTransform temsil edilir). Örtük XML-C14N dönüşümünü de belirtebilirsiniz, ancak bu gerekli değildir. Zarf biçiminde veya bağımsız imza için dönüşüm gerekmez. Örtük XML-C14N transformasyonu her şeyi halleder.

Microsoft Güvenlik Bülten MS16-035 tarafından sunulan güvenlik güncelleştirmesi sayesinde, belge doğrulamada hangi dönüşümlerin varsayılan olarak kullanılabileceğini kısıtlamış .NET. Güvenilmeyen dönüşümler her zaman döndürülmesini CheckSignaturesağlarfalse. Özellikle, kötü amaçlı kullanıcılar tarafından kötüye kullanılmaya açık olmaları nedeniyle ek giriş gerektiren dönüşümlere (XML'de alt öğeler olarak belirtilir) izin verilmez. W3C, bu kısıtlamalardan etkilenen iki ana dönüşüm olan XPath ve XSLT dönüşümlerinden kaçınmayı önerir.

Dış başvurularla ilgili sorun

Bir uygulama dış başvuruların geçerli bağlam için uygun göründüğünü doğrulamazsa, birçok güvenlik açığını (Hizmet Reddi, Dağıtılmış Yansıma Hizmet Reddi, Bilgilerin Açığa Çıkması, İmzayı Atlama ve Uzaktan Kod Yürütme dahil) sağlayacak şekilde kötüye kullanılabilir. Bir uygulama dış başvuru URI'sini doğrulasa bile, kaynağın iki kez yüklenmesiyle ilgili bir sorun kalır: biri uygulamanız tarafından okunduğunda ve diğeri SignedXml tarafından okunduğunda. Uygulama okuma ve belge doğrulama adımlarının aynı içeriğe sahip olduğunu garanti etmediğinden, imza güvenilirlik sağlamaz.

Dış başvuruların riskleri göz önüne alındığında, SignedXml dış başvuruyla karşılaşıldığında bir özel durum oluşturur. Bu sorun hakkında daha fazla bilgi için bkz. .NET uygulamalar özel durum hatalarıyla karşılaşır.

Oluşturucular

Name Description
SignedXml()

SignedXml sınıfının yeni bir örneğini başlatır.

SignedXml(XmlDocument)

Belirtilen XML belgesinden sınıfın SignedXml yeni bir örneğini başlatır.

SignedXml(XmlElement)

Belirtilen SignedXml nesneden sınıfının yeni bir örneğini XmlElement başlatır.

Alanlar

Name Description
m_signature

Signature Geçerli SignedXml nesnenin nesnesini temsil eder.

m_strSigningKeyName

Nesneyi imzalamak için kullanılacak yüklü anahtarın SignedXml adını temsil eder.

XmlDecryptionTransformUrl

XML modu şifre çözme dönüşümü için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigBase64TransformUrl

Temel 64 dönüşümü için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigC14NTransformUrl

Kurallı XML dönüşümü için Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder. Bu alan sabittir.

XmlDsigC14NWithCommentsTransformUrl

Kurallı XML dönüşümü için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) açıklamalarla temsil eder. Bu alan sabittir.

XmlDsigCanonicalizationUrl

XML dijital imzaları için standart kurallılaştırma algoritması için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigCanonicalizationWithCommentsUrl

XML dijital imzaları için standart kurallılaştırma algoritması için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder ve açıklamalar içerir. Bu alan sabittir.

XmlDsigDSAUrl

XML dijital imzaları için standart DSA algoritma için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigEnvelopedSignatureTransformUrl

Zarflı imza dönüşümü için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigExcC14NTransformUrl

Özel XML kurallı hale getirme için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigExcC14NWithCommentsTransformUrl

Açıklamalarla, özel XML kurallı hale getirme için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigHMACSHA1Url

XML dijital imzaları için standart HMACSHA1 algoritma için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigMinimalCanonicalizationUrl

XML dijital imzaları için standart minimum kurallı hale getirme algoritması için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigNamespaceUrl

XML dijital imzaları için standart ad alanının Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder. Bu alan sabittir.

XmlDsigRSASHA1Url

XML dijital imzaları için standart RSA imza yöntemi için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigRSASHA256Url

XML dijital imzaları için SHA-256 imza yöntemi varyasyonu RSA için Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder. Bu alan sabittir.

XmlDsigRSASHA384Url

XML dijital imzaları için RSA SHA-384 imza yöntemi varyasyonu için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigRSASHA512Url

XML dijital imzaları için SHA-512 imza yöntemi varyasyonunun RSA Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder. Bu alan sabittir.

XmlDsigSHA1Url

XML dijital imzaları için standart SHA1 özet yöntemi için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigSHA256Url

XML dijital imzaları için standart SHA256 özet yöntemi için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigSHA384Url

XML dijital imzaları için standart SHA384 özet yöntemi için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigSHA512Url

XML dijital imzaları için standart SHA512 özet yöntemi için Tekdüzen Kaynak Tanımlayıcısı'nı (URI) temsil eder. Bu alan sabittir.

XmlDsigXPathTransformUrl

XML Yol Dili (XPath) için Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder. Bu alan sabittir.

XmlDsigXsltTransformUrl

XSLT dönüştürmeleri için Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder. Bu alan sabittir.

XmlLicenseTransformUrl

İmzalar için XrML lisanslarını normalleştirmek için kullanılan lisans dönüştürme algoritmasının Tekdüzen Kaynak Tanımlayıcısını (URI) temsil eder.

Özellikler

Name Description
EncryptedXml

XML şifreleme işleme kurallarını tanımlayan bir EncryptedXml nesneyi alır veya ayarlar.

KeyInfo

Geçerli KeyInfo nesnenin SignedXml nesnesini alır veya ayarlar.

Resolver

Geçerli XmlResolver nesneyi ayarlar.

SafeCanonicalizationMethods

Kurallılaştırma algoritmalarına açıkça izin verilen yöntemlerin adlarını alır.

Signature

Signature Geçerli SignedXml nesnenin nesnesini alır.

SignatureFormatValidator

XML imzasının biçimini (şifreleme güvenliğini değil) doğrulamak için çağrılacak bir temsilci alır.

SignatureLength

Geçerli SignedXml nesnenin imza uzunluğunu alır.

SignatureMethod

Geçerli SignedXml nesnenin imza yöntemini alır.

SignatureValue

Geçerli SignedXml nesnenin imza değerini alır.

SignedInfo

SignedInfo Geçerli SignedXml nesnenin nesnesini alır.

SigningKey

Bir SignedXml nesneyi imzalamak için kullanılan asimetrik algoritma anahtarını alır veya ayarlar.

SigningKeyName

Nesneyi imzalamak için kullanılacak yüklü anahtarın SignedXml adını alır veya ayarlar.

Yöntemler

Name Description
AddObject(DataObject)

İmzalanacak nesneler listesine bir DataObject nesne ekler.

AddReference(Reference)

Reference Xml dijital imzası oluşturmak için kullanılacak özet yöntemini, özet değerini ve dönüştürmeyi açıklayan nesneye bir nesne SignedXml ekler.

CheckSignature()

özelliğin Signature imzadaki ortak anahtarı kullanarak doğrulanıp doğrulamayacağını belirler.

CheckSignature(AsymmetricAlgorithm)

Özelliğin Signature belirtilen anahtar için doğrulanıp doğrulanmamış olduğunu belirler.

CheckSignature(KeyedHashAlgorithm)

Özelliğin Signature belirtilen ileti kimlik doğrulama kodu (MAC) algoritması için doğrulanıp doğrulanmaz belirler.

CheckSignature(X509Certificate2, Boolean)

Özelliğin Signature belirtilen X509Certificate2 nesne için doğrulanıp doğrulanmaz ve isteğe bağlı olarak sertifikanın geçerli olup olmadığını belirler.

CheckSignatureReturningKey(AsymmetricAlgorithm)

özelliğin Signature imzadaki ortak anahtarı kullanarak doğrulanıp doğrulamayacağını belirler.

ComputeSignature()

XML dijital imzayı hesaplar.

ComputeSignature(KeyedHashAlgorithm)

Belirtilen ileti kimlik doğrulama kodu (MAC) algoritmasını kullanarak xml dijital imzasını hesaplar.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetIdElement(XmlDocument, String)

XmlElement Belirtilen nesneden XmlDocument belirtilen kimlikle nesneyi döndürür.

GetPublicKey()

İmzanın ortak anahtarını döndürür.

GetType()

Geçerli örneğin Type alır.

(Devralındığı yer: Object)
GetXml()

Bir SignedXml nesnenin XML gösterimini döndürür.

LoadXml(XmlElement)

XML SignedXml öğesinden bir durumu yükler.

MemberwiseClone()

Geçerli Objectbasit bir kopyasını oluşturur.

(Devralındığı yer: Object)
ToString()

Geçerli nesneyi temsil eden bir dize döndürür.

(Devralındığı yer: Object)

Şunlara uygulanır

Ayrıca bkz.