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

Mir*_*rko 5 java xml digital-signature envelope xml-signature

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

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

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

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

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

先感谢您,

亲切.

米尔科

ped*_*ofb 4

信封签名

<yourxml>
   ...
   <Signature>....</Signature>
</yourxml>
Run Code Online (Sandbox Code Playgroud)

签名是 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));
Run Code Online (Sandbox Code Playgroud)

信封签名

<Signature>
   <Object Id="object">
      <yourxml>...</yourxml>
    </Object>
 </Signature>
Run Code Online (Sandbox Code Playgroud)

您可以应用相同的技术。找到该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));
Run Code Online (Sandbox Code Playgroud)