XML Canonicalization 알고리즘은 XML 디지털 서명의 일부로 호출 될 때보 다 직접 호출 될 때 두 가지 차이 결과를 제공합니까?

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

문제

디지털 서명을 수행 할 때보 다 일부 XML을 직접 정식화 할 때 동일한 XML 문서의 두 가지 해시를 받고 있습니다. 나는 Digital Signature Canonicalization에는 정식화 및 직접 알고리즘이 그렇지 않을 때 새로운 라인 캐릭터 ' n'및 간격 캐릭터가 포함되어 있다고 밝혔다.

새로운 라인 문자 포함 + 공간은 표준화 사양에 있지 않습니까? 나는 구체적 으로이 버전을보고있다 http://www.w3.org/tr/2001/rec-xml-c14n-20010315

무슨 일이 일어나고 있는지 아는 사람이 있습니까? XML 문서와 코드의 두 구현을 포함시켜 볼 수 있습니다.

이것은 정말로 나를 당황스럽게하고 왜 그런지 알고 싶습니다. 분명한 것을 놓치고 있습니까?

<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;
        }
    }
}

XML 디지털 서명 코드

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 SIG가 공백을 처리하는 방식은 내 의견으로는 깨졌습니다. 그것은 대부분의 올바른 생각을 가진 사람들이 표준화라고 부르는 것을 준수하지 않습니다. 변화하는 공백이 있어야합니다 ~ 아니다 다이제스트에 영향을 미치지 만 XMLSIG에서는 그렇습니다.

가능한 한 가지 해결 방법은 서명 생성 코드에 전달하기 전에 문서를 캐논 화제 루틴을 통해 전달하는 것입니다. 그것은 훨씬 더 예측 가능한 것을 만들어야합니다.

이 기사 사물을 명확히하는 데 도움이 될 수 있습니다.

다른 팁

두 번째 코드에서 보이는 것 같습니다.

xmlDoc.PreserveWhitespace = true;

처음에 당신은 그렇지 않습니다.

내가 이해 한 바와 같이, Canonicalisation Specification은 요소들 사이의 공백을 보존하도록 요청 하므로이 라인을 둘 다에 포함시킬 것을 제안합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top