【问题标题】:XmlDSig: The Reference Processing Model (Node set vs Octet stream)XmlDSig:参考处理模型(节点集与八位字节流)
【发布时间】:2013-08-29 22:51:51
【问题描述】:

我正在学习XML Advanced Electronic Signatures

要创建“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 The Reference Processing Model):

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

在本规范中,“同一文档”引用被定义为 由井号 ('#') 后跟一个 片段或由空 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#: (&lt;file&gt; ... childs ... &lt;file&gt;)。 不应用摘要转换

<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 &lt;child_1/&gt;...&lt;child_x/&gt; 的孩子) 没有应用摘要转换。这不是要解析的有效 XML 文件,没有单个根。但可以在 fakefile.xml 上下文中使用“节点集”。

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

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

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

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

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

欢迎文章。

【问题讨论】:

    标签: xml cryptography xml-signature xades4j xml-dsig


    【解决方案1】:

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

    除了Reference Processing Model 部分之外,还请考虑Transforms element 部分以获得以下说明。

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

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

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

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

    由于规范化转换 works over XML nodes,其输入必须转换为 XML 节点集,如 Reference Processing Model 部分所述:

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

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

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

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

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

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


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

    希望这会有所帮助。

    【讨论】:

    • 你是说:(第一种情况)如果我有一个外部 URI“fakefile.xml”,没有转换,这是一个到 ArchiveTimeStamp 的八位字节流。 (第二种情况)与第一种情况相同,有一个 XPath 转换,这是节点集。但是如果ArchiveTimeStamp有exc-c14n变换,可以是第一个case节点集吗?
    • ArchiveTimeStamp 中指定的规范化转换仅在输入是节点集时应用(生成时间戳输入时)。它与引用处理本身无关。
    • 示例“参考处理模型” URI="example.com/bar.xml#chapter1" 标识外部 XML 资源 'example.com/bar.xml' 的 ID 属性值为 'chapter1' 的元素,以八位字节流的形式提供。 “chapter1”是作为八位字节流提供的吗?只能设置“相同文档”引用吗?
    • 我认为这将是 id #chapter1 作为八位字节流提供的元素。 “除非 URI-Reference 是这样的‘same-document’引用,否则取消引用 URI-Reference 的结果必须是八位字节流”。这意味着节点集仅来自同一文档引用。获取节点集的另一种方法是解析八位字节流以获取转换的输入。请注意,规范不鼓励“为了互操作性”而使用片段,因为它取决于资源的 mime 类型,并且实现可能会有所不同。
    • 那么,带有或不带有转换结果“八位字节流”的外部 URI?或外部 URI="fakefile.xml#child1" 结果“八位字节流”和外部 URI="fakefile.xml" 转换 Xpath 以获得 child1 结果“节点集”?
    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2020-06-03
    • 2011-11-03
    相关资源
    最近更新 更多