0

我需要加密将发送/接收的数据,客户端<>服务器,反之亦然。

由于我现在不能使用 SSLStream,我正在寻找其他替代方案。

在考虑我拥有的替代方案时,我陷入了如何以无法读取/拦截的方式将数据发送到客户端的问题。

以下是我的想法:

  • 客户端/服务器将在应用程序中拥有一个 RSA 私钥,该私钥将从字符串加载以加密/解密从服务器接收到的数据。

  • 在初始连接请求之后,服务器将发送一个会话 ID 以及一个内部 AES 密钥/iv。

  • 从这里开始,客户端将使用 RSA 和 AES 进行通信。

我想从有经验的人那里听到一些新的想法或更好的方法来做我需要的事情,那就是:

在不使用 SSLStream 的情况下将加密数据从客户端发送到服务器,反之亦然,但具有良好的安全性。

我知道在客户端拥有私钥是有风险的,但我还没有找到更好的解决方案。

4

3 回答 3

1

如果你真的不能使用 SSL,你可以自己构建穷人的 SSL:

客户端知道一个 RSA 公钥,服务器知道相应的私钥。

为了进行通信,客户端创建了一个可以与 AES 一起使用的随机会话密钥。它使用 RSA 公钥对其进行加密,并将其发送到服务器。它使用 AES 会话密钥加密其余的通信。

服务器使用 RSA 私钥解密第一条消息,从而获得会话密钥。它使用此密钥进行其余的通信。

这样,客户端不包含任何秘密,但通信本身是私密的。该方案缺少的主要内容是客户端身份验证。

您还应该为 server->client 和 client->server 流使用不同的 nonces/IV。您可能还想添加完整性检查 (MAC)。

于 2012-03-20T17:04:59.410 回答
0

一种可能的方法:

-服务器有一个众所周知的公钥和一个没人知道的私钥(甚至客户端也不知道)

- 客户端生成一个“握手”数据包并使用服务器的公钥对其进行加密。握手数据包包含您需要的任何初始化/身份验证内容,以及用于 AES 加密的随机生成的密码 + IV。

- 服务器使用其私钥解密握手包,现在可以访问 AES 密码 + IV。它以一个“ACK”数据包作为响应,表明它已准备好。

- 现在客户端可以使用AES密码对称加密发送数据,服务器可以解密,反之亦然。

客户端不需要捆绑任何私钥。RSA 专为无需共享密钥的数据交换而设计。

于 2012-03-20T17:00:25.627 回答
0

您可以做到这一点的唯一方法是使用共享密钥:客户端和服务器都知道,但没有其他人知道。

公钥 SSL 在证书(以及密钥对)锁定到特定服务器/域的前提下工作,该服务器/域可以通过第三方(签名机构)独立确认。

一旦你摆脱了这个前提,你就会对使用公钥加密的中间人攻击持开放态度,因为你不能保证你在和谁说话(或者至少你不能保证有人没有拦截/转发你的消息)。

如果您使用共享机密,则不需要公钥、证书或其他任何东西——但如果任何未经授权的一方发现了您的机密,那您就完蛋了。

于 2012-03-20T16:56:01.307 回答