التحويل القياسي XML الخوارزمية يعطي نتيجتين الفرق عندما دعا مباشرة مما كانت عليه عندما دعا كجزء من التوقيع الرقمي أكس؟

StackOverflow https://stackoverflow.com/questions/1026432

سؤال

وأنا الحصول على اثنين من تجزئات مختلفة من مستند XML نفسها عندما canonicalize مباشرة بعض أكس مما كانت عليه عندما أقوم توقيع رقمي على ذلك الذي يؤدي أيضا نفس الشيء algoririth التوافق على أكس قبل تجزئة ذلك؟ عملت إلى أن التوقيع الرقمي التوافق يتضمن أحرف سطر جديد '\ ن' وشخصيات تباعد عند التعارف على وخوارزمية مباشرة لا.

وبما في ذلك أحرف سطر جديد + المساحات ليس في مواصفات التوافق على الرغم من؟ أنا أبحث تحديدا في هذا الإصدار http://www.w3.org / TR / 2001 / REC-أكس-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;
    }
}

وأي فكرة ستكون كبيرة! كل شيء C # رمز من جانب الطريق.

وشكرا مقدما

وجون

هل كانت مفيدة؟

المحلول

والطريقة التي XML سيج يعالج بيضاء هي، في رأيي مكسورة. انها بالتأكيد ليست متوافقة مع ما معظم الناس التفكير الصحيح سيدعو التوافق. تغيير المسافات ينبغي <م> لا تؤثر على هضم، ولكن في xmlsig، فإنه لا.

والحل واحد محتمل هو لتمرير وثيقة من خلال روتين canonicalizer قبل تمريرها إلى رمز جيل التوقيع. وينبغي أن يجعل الأمور أكثر قابلية للتنبؤ.

هذه المقالة قد يساعد توضيح الأمور.

نصائح أخرى

ويبدو في قطعة والثاني من التعليمات البرمجية لديك

xmlDoc.PreserveWhitespace = true;

وأثناء وجوده في البداية كنت لا تفعل ذلك.

وكما أفهم، مواصفات canonicalisation تطلب الحفاظ على المسافات بين العناصر، لذلك أقترح عليك تضمين هذا الخط في كليهما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top