我需要加密将要发送/接收的数据,客户端<>服务器,反之亦然。
由于我现在不能使用SSLStream,我正在寻找其他替代方案。
在考虑我所拥有的替代方案时,我不得不停留在如何以无法读取/拦截的方式将数据发送到客户端。
以下是我的想法:
客户端/服务器将在应用程序内部具有RSA私钥,该私钥将从字符串加载以加密/解密从服务器接收的数据。
在初始连接请求之后,服务器将发送会话ID以及内部AES密钥/ iv。
从此处开始,客户端将使用RSA和AES进行通信。
我想听听有经验的人一些新想法或更好的方法来做我需要的事情,这是:
将加密数据从客户端发送到服务器,反之亦然,而不使用SSLStream,但具有良好的安全性。
我知道在客户端上拥有私钥是有风险的,但我还没有找到更好的解决方案。
答案 0 :(得分:1)
如果你真的不能使用SSL,你可以自己建立穷人的SSL:
客户端知道RSA公钥,服务器知道相应的私钥。
要与客户端通信,请创建可与AES一起使用的随机会话密钥。它使用RSA公钥对其进行加密,并将其发送到服务器。它使用AES会话密钥加密剩余的通信。
服务器使用RSA私钥解密第一条消息,从而获取会话密钥。它使用此密钥进行其余的通信。
这样客户端不包含任何秘密,但通信本身是私有的。这个方案缺少的主要是客户端身份验证。
您还应该为server->客户端和客户端>服务器流使用不同的nonces / IV。您可能还想添加完整性检查(MAC)。
答案 1 :(得分:0)
唯一可以做到这一点的方法是使用共享密钥:客户端和服务器都知道,但没有其他人知道。
公钥SSL的前提是证书(以及密钥对)被锁定到特定的服务器/域,可以通过第三方(签名机构)独立确认。
一旦你摆脱了这个前提,你就会对使用公钥加密的中间人攻击持开放态度,因为你无法保证与谁交谈(或者至少你无法保证某人不会被拦截/转发你的消息)。
如果您使用共享密钥,则不需要公钥,证书或其他任何东西 - 但如果任何未经授权的一方发现您的秘密,您就会被搞砸。
答案 2 :(得分:0)
可能的方法:
-Server有一个众所周知的公钥和一个没有人知道的私钥(甚至不是客户端)
-Client生成“握手”数据包,并使用服务器的公钥对其进行加密。握手数据包包含您需要的任何初始化/身份验证,以及随机生成的密码短语+ IV,用于AES加密。
-Server使用其私钥解密握手数据包,现在可以访问AES密码短语+ IV。它以“ACK”数据包响应,表明它已准备就绪。
- 客户端可以使用AES密码发送数据以对称加密,服务器可以解密,反之亦然。
客户端不需要捆绑任何私钥。 RSA专为数据交换而设计,无需共享密钥。