我有一个看起来像这样的XML文件
<Licence>
<Name>Test company</Name>
<Version>1.1.1.1</Version>
<NumberOfServer>2</NumberOfServer>
</Licence>
然后,我使用先前生成的私钥使用以下代码
对XML文件进行签名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");
}
我得到一个看起来像这样的文件,用公钥验证!
<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);
答案 0 :(得分:1)
不,您无法删除SignedInfo
元素。有几个原因:
SignatureValue
的计算结果为SignedInfo
。如果缺少SignedInfo
,则无需验证。在许可证文件中,消息验证者可能知道摘要算法和其他参数,虽然有些“带外”意味着,但我认为您可以认为验证者可以重建SignerInfo
结构。但是,似乎很难证明打破标准并完成所需的额外工作是合理的。