-1

业务场景:

  • 更新可以包含包。
  • 包可以包含更改。
  • 每个包裹都必须经过某人的批准。
  • 经批准后,不得更改包裹。

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

发展思路:

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

问题:

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

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

4

1 回答 1

2

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

在 .NET 实现中,如果将签名放在应签名的标记内,则它不起作用。这要么是由于我遗漏了某些东西,要么是由于错误。
将签名直接放在根元素内的顶层是可行的。在我对您的其他问题的回答中
可以找到一个有效的实现。

于 2013-05-13T11:13:29.670 回答