Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中验证包含注释的XML文件签名时出现问题#_C#_Xml_Xml Signature - Fatal编程技术网

C# 在c语言中验证包含注释的XML文件签名时出现问题#

C# 在c语言中验证包含注释的XML文件签名时出现问题#,c#,xml,xml-signature,C#,Xml,Xml Signature,我想在XML文件中添加数字签名,特别是在对文件签名之前,我想在文件中添加XML注释,然后登录 签名部分似乎工作正常。也就是说,对于我的评论或文件中的不同内容,我会得到不同的签名。此外,Canonilization属性正确显示并显式显示签名包含注释 但是,在XML文件上查找签名时,注释的内容将被忽略。也就是说,如果我更改了注释的内容,签名在任何情况下都被断言为有效 我不明白的一点是,如果签名为注释中的不同内容生成不同的值,那么这是怎么可能的 可能有什么问题 我的示例文件: 原始XML文件: 带

我想在XML文件中添加数字签名,特别是在对文件签名之前,我想在文件中添加XML注释,然后登录

签名部分似乎工作正常。也就是说,对于我的评论或文件中的不同内容,我会得到不同的签名。此外,Canonilization属性正确显示并显式显示签名包含注释

但是,在XML文件上查找签名时,注释的内容将被忽略。也就是说,如果我更改了注释的内容,签名在任何情况下都被断言为有效

我不明白的一点是,如果签名为注释中的不同内容生成不同的值,那么这是怎么可能的

可能有什么问题

我的示例文件:

原始XML文件:


带有示例注释的已签名文件:


2.一个简单的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个具体的概念,一个具体的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个简单的概念,一个概念,一个简单的概念,一个具体的概念,一个具体的概念,一个具体的概念,一个具体的概念,一个概念,一个具体的概念,一个具体的概念,一个具体的概念,一个具体的概念,一个具体的概念,一个具体的概念,一个具体的概念,一个,一个具体的概念,一个具体的概念,一个具体的概念,一个,一个具体的,一个具体的概念,一个,一个,一个,一个,一个,一个,一个,一个,一个,一个,一个,一个,一个,一QFQ+yXYupHMkgW0BMn7AZfqr3XpuQsjGu2SQUxvr0=AQAB
带有不同示例注释的已签名文件:


2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Y45ZJ02TKQOMSN0LLDCR/DGIIDZYWPR4S5UPQCJXLM=AQAB
我的代码中添加注释和签名文件的部分:

public XmlDocument SignXMLString2(string xmlStringToSign){
var originalDocument=newxmldocument{PreserveWhitespace=true};
LoadXml(xmlStringToSign);
string commentString=“Comment 1”;
var documentElement=originalDocument.documentElement;
var commentElement1=originalDocument.CreateComment(commentString);
var commentElement2=originalDocument.CreateComment(commentString);
documentElement.PrependChild(commentElement1);
documentElement.AppendChild(commentElement2);
documentElement.AppendChild(originalDocument.CreateTextNode(“\n”);
var transformEnveloped=新的XmlDsigEnvelopedSignatureTransform();
var reference=新引用{Uri=”“};
reference.AddTransform(transformEnveloped);
var xmldsig=新签名的XML(原始文档);
xmldsig.SignedInfo.CanonicalizationMethod=SignedXml.XmlDsigCanonicalizationWithCommentsUrl;//在此处尝试了不同的方法
//xmldsig.SignedInfo.CanonicalizationMethod=SignedXml.XmlDsigExcC14NWithCommentsTransformUrl;
//xmldsig.SignedInfo.CanonicalizationMethod=SignedXml.XmlDsigC14NWithCommentsTransformUrl;
xmldsig.AddReference(参考);
xmldsig.SigningKey=新的RSACryptServiceProvider();
xmldsig.KeyInfo=新的KeyInfo();
xmldsig.KeyInfo.AddClause(新的RSAKeyValue((RSA)xmldsig.SigningKey));
xmldsig.ComputeSignature();
xmlementsignature=xmldsig.GetXml();
XmlNode signatureNode=originalDocument.ImportNode(签名,true);
originalDocument.DocumentElement.AppendChild(signatureNode);
返回原始文档;
}
验证签名的代码部分:

public bool Validate2(字符串路径签名){
string xmlString=File.ReadAllText(路径:pathSigned,编码:encoding.UTF8);
var signedDocument=newxmldocument{PreserveWhitespace=true};
signedDocument.LoadXml(xmlString);
var xmldsig=新的SignedXml(signedDocument);
var signature=(XmlElement)signedDocument.GetElementsByTagName(“签名”)[0];
LoadXml(签名);
Console.WriteLine(“xmldsig.SignedInfo.CanonicalizationMethod=“+xmldsig.SignedInfo.CanonicalizationMethod”);//这显示了正确的规范化
bool result=xmldsig.CheckSignature();
返回结果;
}
您正在使用URI:“”。这是同一个文档URI(请参阅)。在这种情况下,注释节点将被删除(甚至在任何规范化之前),并且不包括在签名部分中


希望这有帮助。

根据xmldsig规范,签名值是从摘要中计算出来的。因为这两个xml文档有不同的签名值,所以摘要应该是不同的。然而,它们是相同的。此外,如果摘要相同,则表示规范化算法为两个XML生成相同的输出,即排除注释。但是,为什么签名值不同呢?谢谢你的回答Moez。URI的值应该是多少?它应该指向规范化方法URI吗?我浏览了规范,但有点混淆了URI的作用。问题是,应该有什么,以便我可以签署当前文档(包括注释)?在本例中,规范建议使用此URI:#xpointer(/)”。您正在使用的C#实现必须支持xpointer。我刚刚尝试了“#xpointer(/)”。不幸的是,当我更改评论内容时,它仍然不断地说签名是好的@Moez,你用过其他工具吗?可能是.NET实现的一个问题。是的,因此即使设置了#xpointer(/)也似乎.NET实现完全忽略了注释。。。太糟糕了。