2012-07-30 3 views
0

우리는 표준 Java/SAAJ 기능을 사용하여 SOAP 메시지를 작성하고 웹 서비스 (WS) 호출을 수행합니다. 지금까지 통신은 HTTP 전송을 통해 unecrypted되었으며, 엔드 포인트에 WS를 호출하면이 방법을 사용하여 잘 작동했습니다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를 사용하기 위해 WS 코드를 다시 작성해야한다. 그리고 나는 아직 봄 - ws로 이런 종류의 암호화를하는 방법을 설명하는 their reference docs에서 예제를 발견하지 못했습니다.

통신을 암호화하는 몇 가지 쉬운 방법이 누락 되었습니까? 그렇다면 무엇입니까? 그렇지 않다면 클라이언트가 요구하는 것을 달성하기 위해 어떤 좋은 옵션이 존재합니까?

업데이트 : HTTPS를 보안 전송으로 사용하는 것은 옵션이 아닙니다.

도움을 주셔서 감사합니다.

+0

http 전송 계층을 사용하는 경우 표준 HTTPS SSL 보안을 사용할 수 있습니다. 나는 이것이 당신이 원하는 것 (물리적으로 메시지를 암호화)과 약간 다르다고 생각하지만 설정하기 쉽다. 즉 서버 인증서를 설정하고 요청을이 SOAP 커넥터에서 SSL 포트로 리다이렉트한다. – Davos555

+0

지적 해 주셔서 감사합니다. 불행히도 전송으로 HTTPS를 도입하는 것은 선택 사항이 아닙니다. 그에 따라 질문을 업데이트했습니다. –

답변

1

이 기사는 꽤 길기 때문에 여기서 요약하기는 어렵지만 웹 서비스 보안을 사용하는 것이 좋습니다. IBM은 이에 대한 훌륭한 기사를 가지고 있습니다.

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

, 당신은 문제의 몇 가지있을 것이다는 클라이언트와 서버 측에 동일한 키를 필요로 당신이하지 않는 키를 가로채는 사람을 위험하므로, 하나는 복어를위한 키 교환은,이다 예를 들어 점프 드라이브로 끝낼 수 있습니다.

데이터를보고 암호화해야하는 부분을 확인한 다음 RSA를 사용하여 대칭 키를 암호화하고이를 SOAP 서비스의 매개 변수로 전달하고 해당 키를 사용하여 암호화합니다 필드를 보호해야합니다.

공용 키 암호화를 사용하면 모든 호출에서 복어 키를 변경할 수 있으며 키 교환을 위해서는 개인 키 (서버에 있음)가 필요하므로 키 교환은 여전히 ​​안전합니다.

+0

Blowfish를 대칭 비밀 키 암호화와 함께 사용할 계획이므로 핸드 셰이크를 구현하지 않을 것입니다. 키를 양면에 배치하는 것은 문제가되지 않습니다 (모든 백업에서 - 그리고 거기에 앉아있는 것으로 알려진 의미가 있음). 링크를 가져 주셔서 감사합니다. –

+0

제임스 감사합니다. –