XmlDSig:参考处理模型(节点集与Octet流)

时间:2013-08-29 22:51:52

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

我正在研究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解除引用或后续结果的数据类型   转换是八位字节流或XPath节点集。 (...)

     

在本说明书中,“同一文档”引用被定义为a   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}}的孩子)不应用摘要变换。这不是要解析的有效XML文件,没有单根。但可以在fakefile.xml上下文中使用“节点集”。

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

由于: 除非URI-Reference是这样的'同一文档'引用,否则取消引用URI-Reference的结果必须是一个八位字节流。

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

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

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

欢迎收到文章。

1 个答案:

答案 0 :(得分:2)

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

除了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缺省值(如果未指定)。

希望这有帮助。