我正在开发基于Java套接字的客户端/服务器应用程序,我想了解如何使这些安全/加密的指导方针。 所以,我在过去两周一直在阅读有关SSL,安全性,公钥和私钥加密,对称和非对称方法的内容,我想通过以下方法在客户端/服务器之间实现安全连接:
服务器:为加密创建公钥,为解密创建私钥
客户端:使用服务器的公钥加密其凭据以及请求的时间戳,以便加密值在每次要验证自己时都不会相同。连接到此消息的客户端还包括客户端/服务器应连接的共享密钥(对称加密)。
服务器:使用私钥解密邮件,检查用户的凭据和时间戳。如果凭据正确,则它使用对称密钥发送成功响应。
其余的通信继续使用客户端的对称密钥。
以下Java代码是如何使用SSL套接字实现SSL通信的示例。 clientKeyStore.jks 是客户端的Java密钥库,它包含服务器的公钥。创建套接字时,我猜,客户端使用公钥来启动通信。我的问题是对称密钥的交换发生的地方(如果发生了?)。我是否应该考虑到任何漏洞,或者这对于中间人攻击是否安全?
提前谢谢
SSLSocketServer
public class SSLSocketServer {
private SSLServerSocket serverSocket;
public SSLSocketServer(int port) throws IOException {
System.setProperty("javax.net.ssl.keyStore","serverKeyStore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "serverKeyStorePass");
SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
serverSocket = (SSLServerSocket) factory.createServerSocket(port);
start();
}
public void start() {
while (true) {
try {
// Client is connected
SSLSocket clientSocket = (SSLSocket) serverSocket.accept();
System.out.println("User connected successfully?");
} // try
catch (IOException e) {
e.printStackTrace();
} // catch
} // while
} // run
} // class SSLSocketServer
SSLSocketClient
public class SSLSocketClient {
public SSLSocketClient(String serverHost, int serverPort) throws UnknownHostException, IOException {
System.setProperty("javax.net.ssl.trustStore","clientKeyStore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "clientKeyStorePass");
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(serverHost, serverPort);
} // SocketClient()
} // class SSLSocketClient