2009-04-17 73 views
1

我有一個看起來像這樣使用的RSACryptoServiceProvider

<Licence> 
     <Name>Test company</Name> 
     <Version>1.1.1.1</Version> 
     <NumberOfServer>2</NumberOfServer> 
</Licence> 

然後我用以前生成的私鑰使用foloowing代碼

private void SignFile(XmlDocument doc) 
{ 
    SignedXml signedXml = new SignedXml(doc2); 

    _cryptoServiceProvider.FromXmlString(XmlDocument.Load("private.key").Root.ToString()); 

    signedXml.SigningKey = _cryptoServiceProvider; 

    Signature XMLSignature = signedXml.Signature; 

    Reference reference = new Reference(""); 

    XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform(); 
    reference.AddTransform(env); 

    XMLSignature.SignedInfo.AddReference(reference); 

    signedXml.ComputeSignature(); 

    XmlElement xmlDigitalSignature = signedXml.GetXml(); 

    doc.DocumentElement.AppendChild(doc2.ImportNode(xmlDigitalSignature, true)); 

    doc.Save("signed.xml"); 
} 
簽署XML文件中的XML文件最小化的簽名段的信息

我得到一個看起來像這樣的文件,並用公鑰驗證!

<Licence> 
    <Name>Test company</Name> 
    <Version>1.1.1.1</Version> 
    <NumberOfServer>2</NumberOfServer> 
    <Signature xmlns="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>tmGyr97mgGDviRpzcWjpMdNNMSI=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>Vc5R/OWiup4Rv7+1Tu8Ino83P0mh6npLkNYEaq0QVa6j+OvISOPERO57EllCQWdB1Lgjc7B+lmV4JiSvdfovkldhNZb4+iFgdrI+qOdSEIsBk/KhGS93PfekhDd3qirGerpeGbLAEqZ36jT0aT/QruZXpOX6Y6H5fqGj4prUZaM=</SignatureValue> 
    </Signature> 
</Licence> 

我必須在那裏通過SignedInfo領域,我怎麼能擺脫它?

我使用類似的東西來驗證。

_cryptoServiceProvider.FromXmlString(XDocument.Load("public.key").Root.ToString()); 

    XmlDocument doc = new XmlDocument(); 
    doc.Load("signed.xml"); 

    SignedXml signedXml = new SignedXml(doc); 

    XmlNodeList nodeList = doc.GetElementsByTagName("Signature"); 
    signedXml.LoadXml((XmlElement)nodeList[0]); 

    bool valid = signedXml.CheckSignature(_cryptoServiceProvider); 

回答

1

不,您不能刪除SignedInfo元素。有幾個原因:

  1. 這是XML簽名架構所要求的。如果您將其刪除,則支持XML Signature的軟件將會中斷。
  2. SignatureValue通過SignedInfo進行計算。如果SignedInfo不存在,則無需驗證。

在許可文件,在該消息驗證可能知道摘要算法等參數雖然有些「出帶外」的意思,我想你可以說,驗證可以重建SignerInfo結構。但是,似乎很難證明打破標準和做額外的工作是必要的。 OK。

+0

OK。我善良的想法,但不知何故讓我相信自己變得更容易。謝謝。很好的答案。 – Riri 2009-04-17 20:08:14

相關問題