2

我正在学习XML 高级电子签名

要创建“ArchiveTimeStamp”(第 58 页),规范说:

根据 XMLDSIG 的引用处理模型处理检索到的 ds:Reference 元素。

如果结果是 XML 节点集,则对其进行规范化。(...)

参考处理模型结束于此:

<ds:Reference Id="myId" URI="http://fakefile.xml">
    <ds:Transforms>
        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    </ds:Transforms>
    <ds:DigestMethod/>
    <ds:DigestValue/>
</ds:Reference>

该过程使用“URI=...”和“ds:Transforms”来检索数据。

以下是从( 4.3.3.2 参考处理模型)中摘录的部分内容:

URI 解引用或后续转换结果的数据类型是八位字节流或 XPath 节点集。(...)

在本规范中,'same-document' 引用被定义为一个 URI-Reference,它由一个井号 ('#') 和一个片段组成,或者由一个空 URI (...)

除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流。特别是,由 URI 标识的 XML 文档不会被签名应用程序解析,除非 URI 是同一文档引用,或者除非应用了需要 XML 解析的转换。

以下示例演示了 URI 属性标识的内容以及取消引用的方式:

URI="http://example.com/bar.xml"
标识八位字节 (...)

URI="http://example.com/bar.xml#chapter1"
标识外部 XML 资源 (...) 的 ID 属性值为“chapter1”的元素,以八位字节流的形式提供。(...)

URI=""
标识节点集 (...)

URI="#chapter1"
标识包含 (...) 的节点集

这个问题。

对于这些参考:

<ds:Reference Id="myId" URI="http://fakefile.xml">
...
(empty transform list)
...
</ds:Reference>

结果 1#: ( <file> ... childs ... <file>)。不应用摘要转换

<ds:Reference Id="myId" URI="http://fakefile.xml">
...
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
...
</ds:Reference>

结果 2#:( xml with exc-c14n)。不应用摘要转换

<ds:Reference Id="myId" URI="http://fakefile.xml">
...
<ds:Transform "fake_Xpath_transform_to_get_all_childs"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
...
</ds:Reference>

结果 3#:(只有具有 exc-c14n 的孩子<child_1/>...<child_x/>没有应用摘要转换。这不是要解析的有效 XML 文件,没有单个根。但可以在 fakefile.xml 上下文中使用“节点集”。

结果(1#、2# 和 3#)是“八位字节流”吗?

因为: 除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流。

或者它们是 XML 高级电子签名规范化所需的“XML 节点集”?

因为: (...) 特别是,除非 URI 是同文档引用或应用了需要 XML 解析的转换,否则签名应用程序不会解析由 URI 标识的 XML 文档。

或者(除非应用需要 XML 解析的转换)仅在参考上下文中有效并且结果是八位字节流?

欢迎文章。

4

1 回答 1

3

它们都是八位字节流,即二进制,但处理方式不同。

除了参考处理模型部分之外,还请考虑转换元素部分以进行以下说明。

1:因为http://fakefile.xml不是同一个文档引用并且:

除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流

由于没有转换,这个八位字节流是摘要计算的输入

2:如1 http://fakefile.xml中所述,不是同一个文档引用,因此转换的输入是八位字节流。

由于规范化转换适用于 XML 节点,因此必须将其输入转换为 XML 节点集,如参考处理模型部分所述:

如果数据对象是一个八位字节流并且下一个转换需要一个节点集,则签名应用程序必须尝试解析八位字节,通过 [XML] 格式良好的处理产生所需的节点集。

根据定义,规范化变换的输出是一个八位字节流。

3:如1 http://fakefile.xml中所述,不是同一个文档引用,因此转换的输入是八位字节流。

XPath 转换适用于 XML 节点,这意味着必须将八位字节流转换为节点集(在XPath 过滤部分再次说明)。XPath 转换的输出也是一个节点集。

以下转换是规范化,它需要一个 XML 节点集作为输入。由于输入/输出是链接的(变换元素部分),并且先前的输出已经是一个节点集,因此不需要转换。

最后,根据定义,规范化变换的输出是八位字节流。


在您的示例中,转换的输出始终是一个八位字节流,但是如果您有一个 XPath 转换,例如,那么转换的结果是一个 XML 节点集。然后必须按照 ArchiveTimeStamp 属性定义的要求对其进行规范化。在这种情况下,您使用在 ArchiveTimeStamp 属性本身上定义的规范化算法,或 XML-DSIG 默认值(如果未指定)。

希望这可以帮助。

于 2013-08-30T21:02:00.720 回答