如何提取"原创"内容由xml签名的文件

时间:2016-11-04 09:03:25

标签: java xml digital-signature xml-signature envelope

我正在处理XML签名。如您所知,有三种类型的XML签名:包络,包络,分离。

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

1)验证 Enveloped XML签名文件后,获取" get"的正确方法是什么?没有签名的XML内容?

2)验证 Enveloping XML签名文件后,获得" get"的正确方法是什么? "对象"节点

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

提前谢谢你,

麻烦。

的Mirko

2 个答案:

答案 0 :(得分:3)

已签名的签名

<yourxml>
   ...
   <Signature>....</Signature>
</yourxml>

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

// 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));

包络签名

<Signature>
   <Object Id="object">
      <yourxml>...</yourxml>
    </Object>
 </Signature>

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

//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));

答案 1 :(得分:1)

在包含案例的@pedrofb答案中,如果对象数据是XML结构的,则代码可以正常工作。但是我在对象节点中有一个平面数据,因此我使用类似的技术获取原始数据内容:

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) {
    //...

}