2009-04-17 6 views
1

ich eine XML-Datei, dieMinimieren Sie die Informationen in einer Signatur Segment mit RSACryptoServiceProvider

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

ich dann mit einem vorherigen generierten privaten Schlüssel signieren die XML-Datei mit dem foloowing Code

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"); 
} 
sieht wie folgt aus

Ich bekomme eine Datei wie folgt und das validiert mit dem öffentlichen Schlüssel!

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

ABER ich dort die SignedInfo Bereich haben müssen und wie kann ich es loswerden?

Ich verwende so etwas zu validieren.

_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); 

Antwort

1

Nein, Sie können das Element SignedInfo nicht entfernen. Es gibt eine Reihe von Gründen:

  1. Es wird vom XML-Signaturschema benötigt. Wenn Sie es entfernen, wird Software, die XML-Signatur unterstützt, unterbrochen.
  2. Die SignatureValue wird über SignedInfo berechnet. Wenn SignedInfo nicht vorhanden ist, gibt es nichts zu überprüfen.

In einer Lizenzdatei, in dem die Nachricht Verifizierer den Digest-Algorithmus und andere Parameter obwohl einige „out-of-band“ bedeutet vielleicht wissen, nehme ich an, dass der Prüfer die SignerInfo Struktur rekonstruieren könnte argumentieren könnte. Aber es scheint schwer zu rechtfertigen, den Standard zu brechen und die zusätzliche Arbeit zu leisten.

+0

OK. Ich dachte es mir irgendwie gut, aber irgendwie überzeugte ich mich zu glauben, dass es einfacher war. Vielen Dank. Gute Antwort. – Riri

Verwandte Themen