当命名空间前缀更改时,我该如何验证XML签名?

3

大家好,

我正在测试一些验证XML数字签名的Java代码。我正在使用JDK中的标准JSR 105 API。我使用了独占规范化方法和包含在信封中的签名。传入的XML消息看起来像这样:

<doc xmlns:a="urn:abc.my.domain.com">
    <a:x>12345</a:x>
</doc>

这条消息经过一个复杂的系统,其中涉及各种 XML 解析器(CXF、JAXB、XSLT 等),最终变成了这样:

<doc xmlns:b="urn:abc.my.domain.com">
    <b:x>12345</b:x>
</doc>

更改后,附加的 XML 签名将不再通过验证。引用无效。

我的观点是,即使这个 XML 文档已经变化,它看起来仍然是等效的 XML。唯一变化的是命名空间前缀。我不确定命名空间前缀的更改是否符合 XML 规范化的规则。我的问题是:

  1. 这应该可以实现吗?
  2. 如何实现(转换等)?

感谢任何帮助,

g8torPaul

1个回答

4

很遗憾,XML签名的标准算法(http://www.w3.org/TR/xmldsig-core/#sec-AlgID)只能操作XML文档的规范化表示形式(http://www.w3.org/TR/2001/REC-xml-c14n-20010315), 而不是它的语义。命名空间前缀被认为是文档的签名内容的一部分。

(有些人认为在字符串中使用命名空间前缀是可能的,这些前缀从上下文中隐含地绑定,例如在XSLT中发生的情况。其实这是一个不好的做法,但XML建议确立了它并且已经变得常见...当这样做时,没有完全了解特定类型文档的语义,是无法可靠地进行规范化的。)

因此,尽管最初的想法是前缀只是命名空间URI的"语法糖",但在实践中,不谨慎地更改它们确实会导致某些工具出现问题,特别是更改它们将始终更改XML签名。

这种情况是XML以增量和有些不自然的顺序快速发展的结果。将XML命名空间、XML模式和XML信息集留作事后补救措施确实使XML更快地传递给用户并获得接受...但也使得将这些更复杂的语义与现有的XML语法进行改进变得更加困难,导致阻抗不匹配和疼痛的结果,因为事情并不像应该那样顺利。也许有一天会有一个从信息集开始并从中派生语法和工具的XML 2.0,但在那一天到来之前,我们将被困在一些明显需要的情况下,要么比必要的工作要多得多,要么根本不可能。


感谢您的反馈,keshlam。在阅读了一些XML 2.0规范的提议后,我得出了同样的结论。看起来有计划扩展规范化XML规范以包括命名空间重写,但目前还不支持。 - g8torPaul
你知道的,我有点想引入一个叫做"LMX"的东西,它将是按正确顺序重新派生的XML... 语义可能不完全相同,因为它们会消除冲突... 但既然这明确不是XML,那就没问题了。 - keshlam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接