使用不同的密钥对同一文档中的Xml元素进行签名

本文关键字:元素 Xml 文档 密钥对 | 更新日期: 2023-09-27 18:13:03

业务场景:

  • 更新可以包含程序包
  • 包可以包含更改
  • 每个包裹都必须有人批准
  • 批准后,包不得更改

要执行更新,必须具有100%批准的程序包。

发展思路:

  • 所有数据都保存为XML文件
  • Xml"Package"元素将在批准后进行签名

问题:

无论我尝试什么并在谷歌上搜索,所有的例子都是关于对整个文档进行签名,或者对整个文档使用相同的密钥对子元素签名。但我想用不同的密钥来签署每个子元素(Package(,该密钥是批准包的人的密钥。所以我需要每个元素一个签名。虽然所有.NET Framework函数似乎都支持这一点,但我有一些奇怪的行为。例如,在对元素进行签名时,您需要给元素的URI。如果我给所有包提供相同的ID,它就会验证,如果我给每个元素提供不同的ID,并在它们各自的签名中引用该ID,我只能验证第一个。ID的想法首先对我的场景没有意义,因为我的元素与签名是1:1的关系。

我可以发布代码,但在发布之前,我想知道这样的事情是否可能?我没有看到任何东西会禁止我想做的事情,但我也没有看到任何迹象表明它应该起作用。有人这样做过吗?或者有人能给我指一个我还没有找到的资源吗?或者有人更清楚如何使用标准来实现需求吗?

使用不同的密钥对同一文档中的Xml元素进行签名

在同一XML文档中用不同的键对不同的元素进行签名当然是可能的。这基本上将具有不同内部引用(#<ID>(的多个签名添加到文档中
ID的内部引用是必需的,没有标准支持的方法。URI为空或缺失的引用并不表示要对父元素进行签名,而是表示要对整个文档进行签名
如果不能将ID添加到包中,则可以使用非标准方法来实现目标,方法是将每个包有效地视为独立的XML文档,并将引用URI留空。但这意味着您的XML文档和所有包只能由您的程序进行验证,因为在验证之前必须将XML文档拆分为多个文档。

在.NET实现中,如果签名被放置在应该签名的标记中,那么它就不起作用。这要么是因为我错过了什么,要么是因为一个bug
将签名直接放置在根元素内部的顶层是有效的
在我对你的另一个问题的回答中可以找到一个有效的实施方案。

相关文章: