用于Java SOAP的Blowfish加密与SAAJ的SOAP调用
我们使用标准的Java/SAAJ功能来创建SOAP消息并执行Web服务(WS)调用。到目前为止,通信已跨unecrypted HTTP传输和调用端点上的WS已使用这种方法工作得很好:用于Java SOAP的Blowfish加密与SAAJ的SOAP调用
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();
现在,我们的客户希望我们使用加密河豚的所有流量。我知道我可以用下面简单的方法进行加密任意数据(这个例子只是使用一个随机密钥):
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
等)似乎根本不支持任何加密。我已经看到,春天的WebServiceTemplate
支持ClientInterceptor
实例,这可能有助于这一点。不过,我必须重写我们的WS代码才能使用spring-ws。我还没有在their reference docs中找到一个例子,它解释了如何使用spring-ws来完成这种加密。
我错过了加密通信的一些简单方法吗?如果是,那是什么?如果没有,有哪些好的选择来实现客户的要求?
更新:使用HTTPS作为安全传输不是一种选择。
非常感谢您的帮助。
这篇文章很长,所以在这里很难总结,但是您可能想要使用Web服务安全性,IBM有一篇很棒的文章。
http://www.ibm.com/developerworks/java/library/j-jws5/index.html
但是,你们有几个问题,一个是密钥交换,为河豚,因为它需要在客户端和服务器端的同一个按键上,这样你可能有人拦截,除非你的关键例如,可以在跳跃驱动器上行走。
您可能需要查看数据并查看哪些部分需要加密,然后可以使用RSA加密对称密钥,将其作为SOAP服务中的参数传递,然后使用该密钥加密领域需要得到保护。
通过使用公钥加密来完成此任务,您可以在每次调用时更改Blowfish密钥,并且密钥交换仍然安全,因为需要私钥(在服务器上)来恢复密钥。
该计划是使用对称密钥加密的Blowfish,所以我们不会实现握手。把钥匙放在双方都不是问题(有一个问题就是让它坐在那里 - 在所有的备份中)。感谢您的链接,请仔细阅读。 – 2012-07-30 12:22:28
接受最好的答案,谢谢詹姆斯。 – 2012-08-06 12:16:58
如果您使用http传输层,则可以使用标准HTTPS SSL安全性。我认为这与你想要做的事情稍有不同(物理加密消息),但很容易设置 - 即设置服务器证书,将请求重定向到此SOAP连接器以SSL端口。 – Davos555 2012-07-30 12:36:53
谢谢你指出。不幸的是,将HTTPS作为传输方式不是一种选择。我已经相应地更新了这个问题。 – 2012-07-30 12:51:07