使用不同的键在同一文档中签名Xml元素

时间:2013-05-10 09:24:03

标签: c# .net-4.5 xml-signature

业务场景:

  • 更新可以包含包。
  • 包可以包含更改。
  • 每个包裹必须得到某人的批准。
  • 批准后,可能不会更改包裹。

要执行,更新必须拥有100%已批准的软件包。

发展思路:

  • 所有数据都保存为XML文件。
  • Xml“Package”元素将在批准后签署。

问题:

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

我可以发布代码,但在此之前,我想知道这样的事情是否可行?我没有看到任何会阻止我想要做的事情,但我还没有看到任何指示它应该工作。有没有人这样做过,或者有人能指出我尚未找到的资源吗?或者有没有人更好地了解如何使用标准来实现这些要求?

1 个答案:

答案 0 :(得分:2)

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

在.NET实现中,如果签名放在应该签名的标记内,它就不起作用。这要么是因为我遗漏了某些东西,要么是因为一个错误 将签名直接放在根元素内的顶层工作 可以在my answer to your other question中找到有效的实施方案。