Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SAAJ对Java SOAP调用进行Blowfish加密_Java_Soap_Encryption_Blowfish_Saaj - Fatal编程技术网

使用SAAJ对Java SOAP调用进行Blowfish加密

使用SAAJ对Java SOAP调用进行Blowfish加密,java,soap,encryption,blowfish,saaj,Java,Soap,Encryption,Blowfish,Saaj,我们使用标准Java/SAAJ特性来创建SOAP消息和执行web服务(WS)调用。到目前为止,HTTP传输中的通信尚未加密,使用这种方法在端点上调用WS可以很好地工作: SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance(); SOAPConnection con = scf.createConnection(); URL endpoint = new URL(endpointUrl); // configured HTTP

我们使用标准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加密所有流量。我知道我可以使用以下简单方法加密任意数据(本例仅使用随机密钥):

但是,缺少的链接是:如何将这两部分放在一起,以便使用河豚对有效负载进行加密,并在收到响应时对其进行解密?

Java提供的标准工具(
SOAPMessage
SOAPConnection
等等)似乎根本不支持任何加密。我已经看到Spring的
WebServiceTemplate
支持
ClientInterceptor
实例,这可能会有所帮助。然而,我必须重写我们的WS代码以使用SpringWS。我还没有找到一个例子来解释如何使用SpringWS进行这种加密

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

更新:使用HTTPS作为安全传输不是一个选项


非常感谢您的帮助。

这篇文章很长,因此很难在这里进行总结,但您可能希望使用Web服务安全性,IBM在这方面有一篇很棒的文章

但是,您将面临两个问题,一个是针对Blowfish的密钥交换,因为它在客户端和服务器端都需要相同的密钥,因此您可能会有人截获密钥,除非您可以在跳转驱动器上查看该密钥

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


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

计划将Blowfish与对称密钥加密一起使用,因此我们不会实现握手。将密钥放在两侧并不是问题(已知的含义是将其放在那里——以及在所有备份中)。感谢您的链接,我们将仔细查看。如果您使用的是http传输层,则可以使用标准HTTPS SSL安全性。我认为这与您想要做的(物理加密消息)略有不同,但很容易设置-即设置服务器证书,将请求重定向到此SOAP连接器到SSL端口。感谢您指出。不幸的是,引入HTTPS作为传输不是一种选择。我已相应地更新了问题。
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));