如何通过 xml 签名文件提取 "original" 内容
How to extract "original" content by xml-signed file
我正在处理 XML-签名。如您所知,XML 签名分为三种类型:包封式、包封式、分离式。
我找到了关于如何使用 java 标准 API 到 sign/verify 文件的很好的教程,但我想知道如何提取(几乎)"original" 内容数据。特别是:
1) 在验证一个 Enveloped XML 签名文件后, "get" 没有签名的 XML 内容的正确方法是什么?
2) 在验证了 Enveloping XML 签名文件后,"get" "Object" 节点的正确方法是什么?
对于 "get" 我的意思是写在一个单独的物理文件上,清理签名(如果可能,使用标准 API)。
提前谢谢你,
亲切。
米尔科
信封签名
<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));
在@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) {
//...
}
我正在处理 XML-签名。如您所知,XML 签名分为三种类型:包封式、包封式、分离式。
我找到了关于如何使用 java 标准 API 到 sign/verify 文件的很好的教程,但我想知道如何提取(几乎)"original" 内容数据。特别是:
1) 在验证一个 Enveloped XML 签名文件后, "get" 没有签名的 XML 内容的正确方法是什么?
2) 在验证了 Enveloping XML 签名文件后,"get" "Object" 节点的正确方法是什么?
对于 "get" 我的意思是写在一个单独的物理文件上,清理签名(如果可能,使用标准 API)。
提前谢谢你,
亲切。
米尔科
信封签名
<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));
在@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) {
//...
}