2016-11-04 66 views
4

我正在處理XML簽名。如您所知,有三種類型的XML簽名:封裝,封裝,分離。如何通過xml簽名文件提取「原始」內容

我發現了很好的關於如何使用java標準API來簽名/驗證文件的教程,但我想知道如何提取(幾乎)「原始」內容數據。特別是:

1)在驗證了封裝的 XML簽名文件之後,沒有簽名的情況下「獲取」XML內容的正確方法是什麼?

2)在驗證了封裝 XML簽名文件後,「獲取」「對象」節點的正確方法是什麼?對於「get」,我的意思是在一個單獨的物理文件上寫入,清理簽名(如果可能,使用標準API)。

預先感謝您,

親切。

的Mirko

回答

3

封裝簽名

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

簽名是XML文檔的一個節點。驗證XML簽名後,找到該節點,將其刪除並保存該文檔。

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

非常感謝。優雅的解決方 – Mirko

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

}