2013-05-26 38 views
1

我目前正在使用java.net。*下的類來創建我正在創建的MMORPG的Java應用程序。它將與Unity3D遊戲連接(使用.NET Socket for TCP)。我不確定如何處理玩家的登錄/身份驗證。用於遊戲登錄/認證的Java Socket服務器

對此提出建議?我正在考慮通過https的安全形式處理身份驗證,在數據庫中創建並存儲一個臨時登錄密鑰,然後將密鑰發送回客戶端,使用隨機生成的密鑰將其分配一分鐘以連接到遊戲服務器。這是一個安全可靠的解決方案,還是有更好的我可以做的?

服務器類

import java.io.IOException; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 

public class Server extends Thread { 

    public static final int MAX_CLIENTS = 500; 

    private ServerSocket listener; 
    protected ArrayList<Client> clients; 

    public Server(int listenPort) throws IOException { 
     listener = new ServerSocket(
       listenPort, MAX_CLIENTS, 
       InetAddress.getLocalHost() 
     ); 

     clients = new ArrayList<Client>(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       Socket socket = listener.accept(); 
       Client client = new Client(socket, this); 
       clients.add(client); 

       new Thread(client).start(); 
      } catch (IOException e) {} 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     new Server(4428).start(); 
    } 
} 

客戶端類

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Client implements Runnable { 

    private Socket socket; 
    private Server server; 
    private BufferedReader in; 
    private PrintWriter out; 

    public Client(Socket sock, Server serv) { 
     socket = sock; 
     server = serv; 
     in = null; 
     out = null; 
    } 

    @Override 
    public void run() { 
     try { 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      out = new PrintWriter(socket.getOutputStream(), true); 

      while (true) { 
       // Read Data with read() 
      } 
     } catch (IOException e) {} 
    } 

    public void read() throws IOException { 
    } 

    public void send(String data) { 
    } 
} 
+1

發表一些代碼。如果您向我們展示您迄今爲止所做的工作,這會有所幫助。 – EnKrypt

+0

我發佈了迄今爲止我所擁有的。我還沒有開始任何身份驗證,因爲這可以使用登錄服務器完成,或作爲Unity的www表單完成。 –

回答

2

我會建議使用HTTPS用於登錄,重要帳戶操作(買/賣/轉讓項目)。當客戶端通過HTTPS登錄到服務器時,服務器應該生成一個存儲在數據庫中的長(64-128字節)的隨機會話ID。還爲客戶端的TCP連接生成一個臨時的一次性身份驗證令牌(長隨機值)。

之所以使用HTTPS是幫助竊取用戶的遊戲資源停止MITM攻擊。

如果客戶&服務器之間的通信是低,你可以使用TLS插槽,而不是正常的TCP套接字。只要確保讓客戶端驗證(由受信任的CA簽署,並且域匹配)服務器的證書即可。

即使你使用HTTPS重要行動MITM攻擊仍然混亂與用戶的動作(移動,攻擊,聊天)或更改用戶所看到的(隱藏的怪物或其他用戶)。