Ejemplo de cifrado y descifrado con la biblioteca WSS4j.
package doxy.examples;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.Provider;
import java.security.Security;
import java.util.Enumeration;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.xml.security.Init;
import org.apache.wss4j.common.crypto.Merlin;
import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.common.WSEncryptionPart;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.engine.WSSConfig;
import org.apache.wss4j.dom.engine.WSSecurityEngine;
import org.apache.wss4j.dom.handler.RequestData;
import org.apache.wss4j.dom.message.WSSecTimestamp;
import org.apache.wss4j.dom.message.WSSecEncrypt;
import org.apache.wss4j.dom.message.WSSecHeader;
import org.apache.wss4j.dom.message.WSSecSignature;
import org.apache.wss4j.dom.util.WSSecurityUtil;
import org.w3c.dom.Document;
public class JCAWSS4J {
static {
Init.init();
}
static void writeDocumentToFile(Document doc, String filePath) throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filePath));
transformer.transform(source, result);
}
static Document outbound(Document doc, Merlin merlin,
String signatureAlias, String encryptionAlias) throws Exception {
WSSecHeader header = new WSSecHeader(doc);
header.insertSecurityHeader();
WSSecTimestamp timestamp = new WSSecTimestamp(header);
timestamp.setTimeToLive(60);
timestamp.build();
WSEncryptionPart timestampPart = new WSEncryptionPart("Timestamp", WSConstants.WSU_NS, "");
String soapNs = WSSecurityUtil.getSOAPNamespace(doc.getDocumentElement());
WSEncryptionPart bodyPart = new WSEncryptionPart(WSConstants.ELEM_BODY, soapNs, "Content");
WSSecSignature signature = new WSSecSignature(header);
signature.setUserInfo(signatureAlias, "");
signature.setKeyIdentifierType(WSConstants.ISSUER_SERIAL);
signature.setSignatureAlgorithm("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
signature.setSigCanonicalization(WSConstants.C14N_EXCL_OMIT_COMMENTS);
signature.setDigestAlgo(WSConstants.SHA256);
signature.getParts().add(bodyPart);
signature.getParts().add(timestampPart);
signature.build(merlin);
WSSecEncrypt encrypt = new WSSecEncrypt(header);
encrypt.setUserInfo(encryptionAlias, "");
encrypt.setKeyIdentifierType(WSConstants.ISSUER_SERIAL);
encrypt.setSymmetricEncAlgorithm(WSConstants.TRIPLE_DES);
encrypt.setKeyEncAlgo(WSConstants.KEYTRANSPORT_RSAOAEP);
encrypt.getParts().add(bodyPart);
KeyGenerator keyGen = KeyGenerator.getInstance("DESede", merlin.getCryptoProvider());
keyGen.init(168);
SecretKey symmetricKey = keyGen.generateKey();
encrypt.build(merlin, symmetricKey);
return doc;
}
static Document inbound(Document doc, Merlin merlin)
throws Exception {
WSSConfig wssConfig = WSSConfig.getNewInstance();
RequestData requestData = new RequestData();
requestData.setDecCrypto(merlin);
requestData.setSigVerCrypto(merlin);
requestData.setWssConfig(wssConfig);
requestData.setCallbackHandler(callbacks -> {
for (Object _cb : callbacks) {
if (_cb instanceof WSPasswordCallback) {
WSPasswordCallback pc = (WSPasswordCallback) _cb;
if (pc.getUsage() == WSPasswordCallback.DECRYPT || pc.getUsage() == WSPasswordCallback.SIGNATURE) {
System.out.println("Callback for: " + pc.getIdentifier());
pc.setPassword("");
}
}
}
});
WSSecurityEngine engine = new WSSecurityEngine();
engine.processSecurityHeader(doc, requestData);
return doc;
}
public static void main(String[] args) {
try {
Security.addProvider(new br.com.trueaccess.provider.netdfence.ND());
Provider provider = Security.getProvider("ND");
String pin = "user:password@hsm.local";
FileInputStream fis = null;
KeyStore keystore = KeyStore.getInstance("TACCON", provider);
keystore.load(fis, pin.toCharArray());
String signatureAlias = "C3HMO";
String encryptionAlias = "CIPHMO";
Merlin merlin = new Merlin();
merlin.setKeyStore(keystore);
merlin.setTrustStore(keystore);
merlin.setCryptoProvider("ND");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
{
Document doc = dbf.newDocumentBuilder().parse(new File("message.xml"));
Document processedDoc = outbound(doc, merlin, signatureAlias, encryptionAlias);
writeDocumentToFile(processedDoc, "output.xml");
}
{
Document doc = dbf.newDocumentBuilder().parse(new File("output.xml"));
Document decodedDoc = inbound(doc, merlin);
writeDocumentToFile(decodedDoc, "decrypted.xml");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}