客户端已知的客户端 - 服务器应用程序的加密和身份验证

时间:2015-02-03 14:51:19

标签: java sockets ssl encryption cryptography

我想编写一个安全的客户端 - 服务器应用程序,其中只有少数(例如五个)客户端通过TCP套接字与服务器交换数据。所有客户都是事先知道的,并且可以离线共享密钥等。

我想要三件事:

  1. 客户需要确保他们与正确的服务器通信
  2. 服务器需要确保它只与这五个客户进行对话
  3. 通讯需要加密
  4. 如何实现这样的设置?

    我的第一个想法是支持SSL / TLS的套接字,但在考虑了一段时间之后,我觉得握手中的密钥交换是我真正不需要的。此外,需要解决自签名证书的整个证书颁发机构业务似乎不合适。

    另一种选择似乎是定期进行套接字通信,并在两端进行加密/解密和签名。与基于gpg的电子邮件设置类似,我可以为服务器和每个客户端创建密钥对,并确保服务器具有所有客户端的所有公钥,并且每个客户端都具有服务器的公钥。因为我可以将文件本地复制到每台机器,所以可以假设这种密钥交换是安全的。

    或者我是否应该使用对称加密,所有客户端和服务器都知道一个密钥?

    我在网上找到的几乎所有东西都是关于" classic"设置服务器通过证书颁发机构(即类似HTTPS的设置)向许多任意客户端验证自身的设置。

    我打算用Java编写它,但实际上我认为我的问题与语言无关。

1 个答案:

答案 0 :(得分:1)

我建议你使用TLS。它包含许多所谓的cipher suites,它们是包含的加密算法的预定义组合,它们确保对等身份验证,非对称密钥交换,对称加密和消息身份验证。它们在现实世界中经过了久经考验。

使用证书:

  • 创建自签名CA证书并使用它签署所有客户端和服务器证书。
  • 将它们配置为仅接受通过CA签名的证书验证的对方。

或者,如果您对证书感到不安,还有密码套件使用预共享密钥验证(查找PSK和SRP)。