gpt4 book ai didi

java - xmlSignature java 中的 XSLT 转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:28 26 4
gpt4 key购买 nike

我有一个 XML 文档。我正在使用 xmlsignature 对文档的一部分进行签名。在找到摘要之前,我想应用 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。如果 person 元素的值发生变化,则应验证 Signature。但是当我更改 person 元素的值时,签名未被验证。为什么?

最佳答案

签署文档时使用的 xslt 转换与计算签名时如何选择源 XML 中的节点有关。

This question/answer通过 Dave涉及使用 xpath2 对 XML 文档的部分进行签名。 link to Sean Mullans' post在此答案中建议 xpath2 更适合签署文档的各个部分,因为 xpath 表达式的评估是按节点完成的。

所以基于sun dsig example您可以使用以下方式替换引用创建:

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/user,同时可以更改文档的其余部分。

xpath/xpath2选择的问题是可以为/some/node/that/does/not/exist生成签名。您修改测试文档并确保签名按您期望的方式工作是正确的。

您可以通过生成签名然后在验证前篡改 xml 节点来在测试程序中测试文档:

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


一个比 xpath 选择器更可靠的替代方法可能是在您希望签名的 xml 文档元素上放置一个 ID,例如:

<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 添加一个新的 Signature 元素。您可以通过像这样转换它来流式传输输出:

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

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

关于java - xmlSignature java 中的 XSLT 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10662841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com