我们使用标准的Java / SAAJ功能来创建SOAP消息并执行Web服务(WS)调用。到目前为止,通信已经通过HTTP传输进行了加密,并且使用这种方法调用端点上的WS工作正常:
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection con = scf.createConnection();
URL endpoint = new URL(endpointUrl); // configured HTTP URL
// "message" is passed as parameter (a SOAPMessage object)
SOAPMessage response = con.call(message, endpoint);
con.close();
现在我们的客户希望我们使用Blowfish加密所有流量。我知道我可以使用以下简单方法加密任意数据(此示例仅使用随机密钥):
KeyGenerator kgen = KeyGenerator.getInstance("Blowfish");
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
String inputString = "This is just an example";
byte[] encrypted = cipher.doFinal(inputString.getBytes());
Cipher decCipher = Cipher.getInstance("Blowfish");
decCipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = decCipher.doFinal(encrypted);
assertEquals(inputString, new String(decrypted));
但是,缺少的链接是:如何将这两个部分组合在一起,以便我可以使用Blowfish加密有效负载并在收到响应后对其进行解密?
Java提供的标准工具(SOAPMessage
,SOAPConnection
等等)似乎根本不支持任何加密。我已经看到Spring的WebServiceTemplate
支持ClientInterceptor
个实例可能对此有所帮助。但是,我必须重写我们的WS代码才能使用spring-ws。我还没有在their reference docs中找到一个例子,它解释了如何使用spring-ws进行这种加密。
我错过了一些加密通信的简单方法吗?如果是,那是什么?如果没有,那么有哪些好的选择可以实现客户的要求?
更新:使用HTTPS作为安全传输不是一种选择。
非常感谢你的帮助。
答案 0 :(得分:1)
这篇文章很长,所以很难在这里总结一下,但你可能想要使用Web Services Security,而且IBM有一篇很好的文章。
http://www.ibm.com/developerworks/java/library/j-jws5/index.html
但是,对于Blowfish,你会遇到一些问题,一个是密钥交换,因为它需要在客户端和服务器端使用相同的密钥,因此你冒着被人拦截密钥的风险,除非你可以在例如,跳车。
您可能希望查看数据并查看需要加密的部分,然后您可以使用RSA加密对称密钥,将其作为SOAP服务中的参数传递,并且该密钥用于加密任何字段需要得到保护。
通过使用公钥加密来执行此操作,您可以在每次呼叫时更改Blowfish密钥,并且密钥交换仍然是安全的,因为需要私钥(在服务器上)来恢复密钥。