2009-04-17 6 views
1

J'ai un fichier XML qui ressemble à ceciRéduire au minimum les informations dans un segment de signature à l'aide RSACryptoServiceProvider

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

J'utilise ensuite une clé privée générée précédente pour signer le fichier XML en utilisant le code 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"); 
} 

Je reçois un fichier qui ressemble à ceci et qui valide avec la clé publique!

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

MAIS dois-je avoir le champ SignedInfo là-bas et comment puis-je me débarrasser?

J'utilise quelque chose comme ça pour valider.

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

Répondre

1

Non, vous ne pouvez pas supprimer l'élément SignedInfo. Il y a plusieurs raisons:

  1. Il est requis par le schéma de signature XML. Si vous le supprimez, les logiciels prenant en charge la signature XML seront supprimés. Le SignatureValue est calculé sur SignedInfo. Si SignedInfo est absent, il n'y a rien à vérifier.

Dans un fichier de licence, où le vérificateur de message peut connaître l'algorithme de synthèse et d'autres paramètres bien que certains « hors bande », je suppose que vous pourriez faire valoir que le vérificateur pourrait reconstruire la structure SignerInfo. Mais, il semble difficile de justifier de casser la norme et de faire le travail supplémentaire requis.

+0

OK. Je pensais bien mais je me suis convaincu que c'était plus facile. Merci. Bonne réponse. – Riri

Questions connexes