2012-07-30 61 views
0

我们使用标准的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作为安全传输不是一种选择。

非常感谢您的帮助。

+0

如果您使用http传输层,则可以使用标准HTTPS SSL安全性。我认为这与你想要做的事情稍有不同(物理加密消息),但很容易设置 - 即设置服务器证书,将请求重定向到此SOAP连接器以SSL端口。 – Davos555 2012-07-30 12:36:53

+0

谢谢你指出。不幸的是,将HTTPS作为传输方式不是一种选择。我已经相应地更新了这个问题。 – 2012-07-30 12:51:07

回答

1

这篇文章很长,所以在这里很难总结,但是您可能想要使用Web服务安全性,IBM有一篇很棒的文章。

http://www.ibm.com/developerworks/java/library/j-jws5/index.html

但是,你们有几个问题,一个是密钥交换,为河豚,因为它需要在客户端和服务器端的同一个按键上,这样你可能有人拦截,除非你的关键例如,可以在跳跃驱动器上行走。

您可能需要查看数据并查看哪些部分需要加密,然后可以使用RSA加密对称密钥,将其作为SOAP服务中的参数传递,然后使用该密钥加密领域需要得到保护。

通过使用公钥加密来完成此任务,您可以在每次调用时更改Blowfish密钥,并且密钥交换仍然安全,因为需要私钥(在服务器上)来恢复密钥。

+0

该计划是使用对称密钥加密的Blowfish,所以我们不会实现握手。把钥匙放在双方都不是问题(有一个问题就是让它坐在那里 - 在所有的备份中)。感谢您的链接,请仔细阅读。 – 2012-07-30 12:22:28

+0

接受最好的答案,谢谢詹姆斯。 – 2012-08-06 12:16:58