0

我们使用标准 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 提供的标准工具(SOAPMessageSOAPConnection)似乎根本不支持任何加密。我已经看到 SpringWebServiceTemplate支持的ClientInterceptor实例可能对此有所帮助。但是,我将不得不重写我们的 WS 代码以使用 spring-ws。而且我还没有在他们的参考文档中找到解释如何使用 spring-ws 进行这种加密的示例。

我错过了一些加密通信的简单方法吗?如果是,那是什么?如果没有,有哪些好的选择可以实现客户的要求?

更新:使用 HTTPS 作为安全传输不是一种选择。

非常感谢你的帮助。

4

1 回答 1

1

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

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

但是,你会有几个问题,一个是密钥交换,对于 Blowfish,因为它在客户端和服务器端需要相同的密钥,所以你冒着有人拦截密钥的风险,除非你可以在跳跃驱动器上走过它例子。

您可能想查看数据并查看需要加密的部分,然后您可以使用 RSA 加密对称密钥,将其作为参数传递到您的 SOAP 服务中,该密钥用于加密任何需要加密的字段受保护。

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

于 2012-07-30T10:47:47.267 回答