2012-04-25 105 views
4

假設客戶端和服務器應用程序在不同的機器上運行如何保護客戶端/服務器socket通信

今天:

// Server will receive the request and cast it as needed 
ProxyResponse message = (ProxyResponse) objStream.readObject(); 

// Update message with some content 
... 

// Sent it back to client 
ObjectOutputStream oos = new ObjectOutputStream(toClient); 
oos.writeObject(message); 

我想進一步加強本作送出確保數據有點受到保護。你會如何建議我處理這個問題?

我正在尋找一個如何在客戶端和服務器之間傳遞數據的例子,這個服務器在兩端都被加密和解密並通過SSL發送。

+0

受到什麼保護?竊聽?由惡意中介修改?請提供一些關於您試圖防範的威脅的更多詳細信息。 – 2012-04-25 22:46:28

+0

@GregKopff我更新了這個問題 – JAM 2012-04-25 22:50:19

+0

你的意思是「受到某種程度上的保護」究竟是什麼意思?如果你打算通過SSL發送它,你爲什麼還認爲你需要做任何事情?您是否知道這正是SSL已經做的事情? – EJP 2012-04-26 01:33:50

回答

11

該JDK provides an SSL socket實現,似乎是一個合適的地方開始。它使用簡單。

本來,你可能有這樣的代碼:

final SocketFactory factory = SocketFactory.getDefault(); 
final Socket socket = factory.createSocket(host, port); 

只需改變工廠:

final SocketFactory factory = SSLSocketFactory.getDefault(); 
final Socket socket = factory.createSocket(host, port); 

同樣是真實的ServerSocketFactory

2

您可以使用asymmetric或加密。看看BouncyCastle庫。使用對稱密鑰加密,這將會像每一邊都有一個用於加密數據的共享密鑰一樣簡單。

根據您更新的答案,我同意您應該查看SSLSocket

+0

你建議BouncyCastle超過JRE中加密的原因是什麼? – 2012-04-25 22:57:10

+2

原來的問題含糊不清。我已經更新了我的答案。但是,在某些情況下,客戶端可以更好地控制加密過程。客戶端可能希望生成公鑰 - 私鑰對,將公鑰傳遞給服務器,以便服務器可以驗證未來連接的客戶端。 Google TV配對協議使用此方法。 https://developers.google.com/tv/remote/docs/pairing – Steve 2012-04-25 23:01:37