XSLT中的XMLSignature java的变换?(XSLT transform in xmlS

2019-06-24 14:42发布

我有document.I正在使用签名的XMLSignature中的文档的一部分的XML。 寻找消化之前, 我想申请XSLT转换。

根据我读,XSLT转换XML文档为另一种格式(可以是XML也)。 现在我很困惑的是,
其中,将被转换的新文件是即时拍摄?

如何从这个新创建的文档检索值,如果我想将它展示给用户?

我的XML文档

<r1>
 <user>asd</user>
 <person>ghi</person>
</r1>

代码转换

Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));

据XPath的改造,每当用户元素的值发生变化不应该被验证了的XMLSignature。 如果人的要素的价值变动则签名应该进行验证。 但是,当我改变人的要素的价值签名不验证。 为什么?

Answer 1:

签署文件时,变换所使用的XSLT涉及到如何计算签名时选择在源XML节点。

这个问题/答案由戴夫使用xpath2涉及到XML文档的签名部分。 在肖恩Mullans'后链接在这个答案表明xpath2是比较合适的,因为XPath表达式的评估每个节点完成签署一份文件的部分。

因此,基于该太阳DSIG例如 ,你可以使用替换基准制作:

List<XPathType> xpaths = new ArrayList<XPathType>();
xpaths.add(new XPathType("//r1/user", XPathType.Filter.INTERSECT));

Reference ref = fac.newReference
  ("", fac.newDigestMethod(DigestMethod.SHA1, null),
        Collections.singletonList
          (fac.newTransform(Transform.XPATH2, 
                  new XPathFilter2ParameterSpec(xpaths))),
             null, null); 

这让// R1 /用户用签名来保护,而文档的其余部分可以改变。

与的xpath / xpath2选择的问题是,可以为/一些/节点/该/并/不/存在被生成的签名。 你是对的修改测试文件,并确保该签名是工作,你期望的方式。

你可能会通过生成一个签名,然后与验证之前的XML节点篡改测试在测试程序中的文件:

NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");


到一个XPath选择一个更可靠的替代方法可能是把一个ID在你希望签下像XML文档元素:

<r1>
 <user id="sign1">asd</user>
 <person>ghi</person>
</r1>

然后在包膜转移的第一个参数引用该ID作为URI:

Reference ref = fac.newReference
  ("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
    Collections.singletonList
      (fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
          null, null); 


对于输出,一个签名操作添加到DOM已加载到内存中一个新的签名元素。 您可以通过将像这样流的输出:

TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");

trans.transform(new DOMSource(doc), new StreamResult(System.out)); 


Answer 2:

XSLT规范并没有定义会发生什么结果文档; 多数民众赞成由你选择的XSLT处理器的API规范定义。 例如,如果你使用JAXP接口从Java调用XSLT,你可以要求该结果作为内存中的DOM树或它会存储到磁盘上的指定文件。

您已为问题的“Java”这是你给你的处理环境的唯一线索。 我的猜测是要转换到一个DOM,然后利用DOM接口来得到新的文档的价值。 但如果你正在使用XSLT 2.0和萨克森的s9api界面比原生JAXP接口更有用。



Answer 3:

在XSLT部分定义只变换定义,没有别的。 看看这个:

Java的XSLT教程

在弗朗索瓦砾石回答的input.xml文件是会转化的文件时,transform.xslt是描述如何将XML文件的XSLT定义。 output.out是结果,这可能是XML,但它也可以是HTML,平面文件...

这是我从我使用XSLT时:

http://www.w3schools.com/xsl/default.asp

看一看这也:

http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog



文章来源: XSLT transform in xmlSignature java?