.NET签名的XML前缀

mjm*_*nto 11 .net xml xml-signature

有没有办法在签名XML文档的签名(.Net中的SignedXml类)上设置前缀?

所以代替:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#>
...
</Signature>
Run Code Online (Sandbox Code Playgroud)

我可以有以下内容:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#>
...
</ds:Signature>
Run Code Online (Sandbox Code Playgroud)

小智 8

它无法完成.如果在签名后修改XML ,则可能无法对其进行验证,这在上面的示例中就是这种情况.IMO这是MSFT数字签名实现中的一个缺陷,您将不得不忍受.

很多人会说没有理由这样做,而且技术上是正确的.但是当你与一个巨大的供应商(即州政府或银行)打交道时,祝他们在最后改变它.大多数参考实现包括它.

更新:签名对SignedInfo元素中的所有内容进行签名,因此如果您在事后更新该元素,则签名不再有效.你已经"篡改"了这条消息.


Eri*_*ger 7

首先,没有任何充分理由这样做.这两种形式在功能上是等同的.任何表现良好的XML处理器都将完全相同地处理它们.所以,除非你正在试图说服一个不正确地实现XML命名空间的应用程序,它的更好(IMO)只是独自离开默认的形式.(即使在这种情况下,它会更好,如果可能的话,要得到,而不是固定的应用程序错误.)

这就是说,你可以手动设置在由SignedXml.GetXml()和使用XPath这样它的子元素返回的XmlElement前缀:

XmlElement signature = signedXml.GetXml();
foreach (XmlNode node in signature.SelectNodes(
    "descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']"))
{
    node.Prefix = "ds";
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意它是相同的,它应该工作.但是,我不确定如果没有ds前缀,我是否能够让另一方工作.生成sig之后更改前缀的简单行为是否会导致验证失败? (5认同)