首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过xml签名文件提取原始内容

如何通过xml签名文件提取原始内容
EN

Stack Overflow用户
提问于 2016-11-04 09:03:25
回答 2查看 3.5K关注 0票数 6

我在处理XML签名。如您所知,XML签名有三种类型:封装、封装、分离。

我找到了关于如何使用java标准API对文件进行签名/验证的教程,但我想知道如何提取(几乎)“原始”内容数据。特别是:

1)在验证了封装的 XML签名文件之后,没有签名的“获取”内容的正确方法是什么?

2)在验证了封装了 XML签名文件之后,有什么正确的方法来“获取”“对象”节点?

对于"get“,我指的是写在一个单独的物理文件上,清除签名(如果可能的话,使用标准API )。

提前谢谢你,

好心的。

米尔科

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-04 13:41:09

信封签名

代码语言:javascript
复制
<yourxml>
   ...
   <Signature>....</Signature>
</yourxml>

签名是XML文档的一个节点。验证XML签名后,查找节点,删除DOM结构的节点并保存文档。

代码语言:javascript
复制
// Instantiate the document to be signed.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(xml));

// Find Signature element.
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");

//... XML Signature validation

//remove signature node from DOM
nl.item(0).getParentNode().removeChild(nl.item(0));

//write to file.
OutputStream os = new FileOutputStream(outputFileName);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));

信封签名

代码语言:javascript
复制
<Signature>
   <Object Id="object">
      <yourxml>...</yourxml>
    </Object>
 </Signature>

你也可以用同样的技术。查找Object节点并将第一个子节点保存到文件中。但是在这种情况下,XMLSignature提供了getObjects方法来获取已签名的对象

代码语言:javascript
复制
//XMLSignature result of validation process
XMLSignature signature = ...

//Gets the node
XMLObject xmlObject = (XMLObject)signature.getObjects().get(0);
Node yourXmlNode = ((DOMStructure)xmlObject.getContent().get(0)).getNode();

//Save to file
OutputStream os = new FileOutputStream(outputFileName);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(yourXmlNode), new StreamResult(os));
票数 4
EN

Stack Overflow用户

发布于 2016-11-07 15:25:46

在用于信封情况的@pedrofb回答中,如果对象数据是XML结构的,代码就会工作。但是,在对象节点中有一个平面数据,因此我使用类似的技术获得原始数据内容:

代码语言:javascript
复制
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Object");
if (nl.getLength() == 0) {
    throw new Exception("*** Cannot find Object element");
}
final String data = nl.item(0).getTextContent();

try {
    File target = new File("/path/output.dat");

    FileWriter writer = new FileWriter(target);
    BufferedWriter bufferedWriter = new BufferedWriter(writer, 8192);
    bufferedWriter.write(data);

    //flush & close writers
    //...

} catch (Exception e) {
    //...

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40418710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档