客户端已知的客户端-服务器应用程序的加密和身份验证
Encryption and authentication for client-server application where clients are known
我想编写一个安全的客户端-服务器应用程序,其中只有少数(比如五个)客户端通过 TCP 套接字与服务器交换数据。提前知道所有客户端,并且可以离线共享密钥等。
我想要三样东西:
- 客户端需要确保他们与正确的服务器对话
- 服务器需要确保它只与这五个客户端通信
- 通信需要加密
这样的设置应该如何实现?
我第一个想到的是SSL/TLS enabled sockets,但是考虑了一段时间后,我觉得握手过程中的密钥交换并不是我真正需要的。此外,需要为自签名证书解决的整个证书颁发机构业务似乎不合适。
另一个选项似乎是进行常规套接字通信,并在两端执行 encryption/decryption 和签名。类似于基于 gpg 的电子邮件设置,我可以为服务器和每个客户端创建密钥对,并确保服务器具有所有客户端的所有 public 密钥,并且每个客户端都具有服务器的 public钥匙。因为我可以将文件本地复制到每台机器上,所以可以认为这种密钥交换是安全的。
或者我是否应该只使用对称加密,所有客户端和服务器都知道一个密钥?
几乎我在网上能找到的所有内容都是关于 "classical" 设置的,服务器通过证书颁发机构向许多任意客户端验证自己,即类似 HTTPS 的设置。
我打算写在Java,但实际上我认为我的问题与语言无关。
我建议您使用 TLS。它包含许多所谓的 cipher suites,它们是包含的密码算法的预定义组合,它们确保对等身份验证、非对称密钥交换、对称加密和消息身份验证。他们在现实世界中经过了实战考验。
使用证书:
- 创建一个自签名 CA 证书并用它签署所有客户端和服务器证书。
- 将它们配置为仅接受使用您的 CA 签名的证书进行身份验证的对方。
或者,如果您对证书不放心,也有使用预共享密钥身份验证的密码套件(寻找 PSK 和 SRP)。
我想编写一个安全的客户端-服务器应用程序,其中只有少数(比如五个)客户端通过 TCP 套接字与服务器交换数据。提前知道所有客户端,并且可以离线共享密钥等。
我想要三样东西:
- 客户端需要确保他们与正确的服务器对话
- 服务器需要确保它只与这五个客户端通信
- 通信需要加密
这样的设置应该如何实现?
我第一个想到的是SSL/TLS enabled sockets,但是考虑了一段时间后,我觉得握手过程中的密钥交换并不是我真正需要的。此外,需要为自签名证书解决的整个证书颁发机构业务似乎不合适。
另一个选项似乎是进行常规套接字通信,并在两端执行 encryption/decryption 和签名。类似于基于 gpg 的电子邮件设置,我可以为服务器和每个客户端创建密钥对,并确保服务器具有所有客户端的所有 public 密钥,并且每个客户端都具有服务器的 public钥匙。因为我可以将文件本地复制到每台机器上,所以可以认为这种密钥交换是安全的。
或者我是否应该只使用对称加密,所有客户端和服务器都知道一个密钥?
几乎我在网上能找到的所有内容都是关于 "classical" 设置的,服务器通过证书颁发机构向许多任意客户端验证自己,即类似 HTTPS 的设置。
我打算写在Java,但实际上我认为我的问题与语言无关。
我建议您使用 TLS。它包含许多所谓的 cipher suites,它们是包含的密码算法的预定义组合,它们确保对等身份验证、非对称密钥交换、对称加密和消息身份验证。他们在现实世界中经过了实战考验。
使用证书:
- 创建一个自签名 CA 证书并用它签署所有客户端和服务器证书。
- 将它们配置为仅接受使用您的 CA 签名的证书进行身份验证的对方。
或者,如果您对证书不放心,也有使用预共享密钥身份验证的密码套件(寻找 PSK 和 SRP)。