2009-06-22 5 views
8

मुझे एक ही एक्सएमएल दस्तावेज़ के दो अलग-अलग हैंश मिल रहे हैं जब मैं उस पर डिजिटल हस्ताक्षर करने की तुलना में कुछ एक्सएमएल को सीधे कैननिकलाइज करता हूं जो कि इसे पहले से ही एक्सएमएल पर समान कैननिकलाइजेशन एल्गोरिथिथ करता है? मैंने काम किया कि डिजिटल हस्ताक्षर कैनोलिकलाइजेशन में नए लाइन वर्ण '\ n' और कैनोनिकलिंग और प्रत्यक्ष एल्गोरिदम नहीं होने पर वर्णों को अंतरण करना शामिल है।एक्सएमएल कैनोनिकललाइजेशन एल्गोरिदम दो अंतर परिणामों को देता है जब एक एक्सएमएल डिजिटल हस्ताक्षर के हिस्से के रूप में बुलाया जाता है?

नए लाइन वर्णों सहित + रिक्त स्थान कैननिकलाइजेशन विनिर्देशन में नहीं है? मैं विशेष रूप से इस संस्करण को देख रहा हूं http://www.w3.org/TR/2001/REC-xml-c14n-20010315

क्या किसी को पता है कि क्या हो रहा है? मैंने एक्सएमएल दस्तावेज़ और कोड के दोनों कार्यान्वयन को शामिल किया है ताकि आप देख सकें।

यह वास्तव में मुझे परेशान कर रहा है और मैं जानना चाहता हूं कि मुझे कुछ स्पष्ट क्यों याद आ रहा है?

<root> 
    <child1>some text</child1> 
    <child2 attr="1" /> 
</root> 

प्रत्यक्ष कैनॉनिकलाइज़ेशन कोड

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Security.Cryptography.Xml; 
using System.Security.Cryptography; 
using System.IO; 
using System.ComponentModel; 

namespace XML_SignatureGenerator 
{ 
    class XML_C14N 
    { 
     private String _filename; 
     private Boolean isCommented = false; 
     private XmlDocument xmlDoc = null; 

     public XML_C14N(String filename) 
     { 
      _filename = filename; 
      xmlDoc = new XmlDocument(); 
      xmlDoc.Load(_filename); 
     } 

     //implement this spec http://www.w3.org/TR/2001/REC-xml-c14n-20010315 
     public String XML_Canonalize(System.Windows.Forms.RichTextBox tb) 
     { 
      //create c14n instance and load in xml file 
      XmlDsigC14NTransform c14n = new XmlDsigC14NTransform(isCommented); 

      c14n.LoadInput(xmlDoc); 

      //get canonalised stream 
      Stream s1 = (Stream)c14n.GetOutput(typeof(Stream)); 
      SHA1 sha1 = new SHA1CryptoServiceProvider(); 
      Byte[] output = sha1.ComputeHash(s1); 

      tb.Text = Convert.ToBase64String(output); 

      //create new xmldocument and save 
      String newFilename = _filename.Substring(0, _filename.Length - 4) + "C14N.xml"; 
      XmlDocument xmldoc2 = new XmlDocument(); 
      xmldoc2.Load(s1); 
      xmldoc2.Save(newFilename); 

      return newFilename; 
     } 

     public void set_isCommented(Boolean value) 
     { 
      isCommented = value; 
     } 

     public Boolean get_isCommented() 
     { 
      return isCommented; 
     } 
    } 
} 

एक्सएमएल डिजिटल हस्ताक्षर कोड

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Security.Cryptography; 
using System.Security.Cryptography.Xml; 

namespace XML_SignatureGenerator 
{ 
class xmlSignature 
    { 
     public xmlSignature(String filename) 
     { 
      _filename = filename; 
     } 

     public Boolean SignXML() 
     { 
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
      XmlDocument xmlDoc = new XmlDocument(); 
      xmlDoc.PreserveWhitespace = true; 
      String fname = _filename; //"C:\\SigTest.xml"; 
      xmlDoc.Load(fname); 

      SignedXml xmlSig = new SignedXml(xmlDoc); 
      xmlSig.SigningKey = rsa; 

      Reference reference = new Reference(); 
      reference.Uri = ""; 

      XmlDsigC14NTransform env = new XmlDsigC14NTransform(false); 
      reference.AddTransform(env); 

      xmlSig.AddReference(reference); 
      xmlSig.ComputeSignature(); 

      XmlElement xmlDigitalSignature = xmlSig.GetXml(); 
      xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, true)); 

      xmlDoc.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/SignedXML.xml"); 

      return true; 
     } 
     private String _filename; 
    } 
} 

किसी भी विचार बहुत अच्छा होगा! यह सभी सी # कोड रास्ते से है।

अग्रिम

जॉन

उत्तर

7

जिस तरह एक्सएमएल सिग संभालती खाली स्थान के है, मेरी राय टूटा में धन्यवाद। यह निश्चित रूप से अनुपालन नहीं करता है कि सबसे सही सोचने वाले लोग कैननिकलाइजेशन कहेंगे। व्हाइटस्पेस बदलना पाचन को प्रभावित नहीं करना चाहिए, लेकिन xmlsig में, यह करता है।

एक संभावित कामकाज हस्ताक्षर पीढ़ी कोड को पास करने से पहले दस्तावेज़ को कैननिकलाइज़र दिनचर्या के माध्यम से पास करना है। इससे चीजों को और अधिक अनुमानित बनाना चाहिए।

This article चीजों को स्पष्ट करने में मदद कर सकता है।

+0

आह, तो समस्या सी 14 एन एल्गोरिदम के साथ नहीं है, इसलिए एक्सएमएल-डिजिटल हस्ताक्षर spec निर्दिष्ट करता है कि व्हाईटस्पेस और नए लाइन वर्ण दस्तावेज़ को कैनोनिकल करते समय बने रहें? यह एक ऐसा नुकसान है जिसे मैं नहीं जानता था। मैं हस्ताक्षरकर्ता को पास करने से पहले एक्सएमएल को कैनोनोकलाइज करने के बारे में आपके सुझाव का प्रयास करूंगा। यह निश्चित रूप से पिछड़ा तर्क है, हालांकि, डब्लू 3 सी ने उस समय किसी भी एक्सएमएल दस्तावेज़ को एक नहर के रूप में प्राप्त करने के लिए एक नमूना के साथ आना शुरू किया और फिर खुद को एक्सएमएल-डिजिटल हस्ताक्षर spec में विरोधाभास किया? बहुत अजीब लगता है। क्या आप इस कारण से जानते हैं कि यह क्यों है? आपकी मदद के लिए धन्यवाद! – Jon

0

यह कोड के अपने दूसरे टुकड़े में की तरह दिखता है आप

xmlDoc.PreserveWhitespace = true; 

है, जबकि पहले में आप नहीं।

जैसा कि मैं इसे समझता हूं, वैचारिककरण विनिर्देश तत्वों के बीच सफेद जगह को संरक्षित करने के लिए कहता है, इसलिए मेरा सुझाव है कि आप दोनों में यह पंक्ति शामिल करें।

संबंधित मुद्दे