2012-03-20 27 views
0

我需要加密将要发送/接收的数据,客户端服务器,反之亦然。没有SSLStream的加密连接?

由于我现在无法使用SSLStream,因此我正在寻找其他方法。

在思考我所拥有的替代方案时,我被困在如何将数据以无法读取/拦截的方式发送到客户端。

这里是我鑫卡特这样做的:

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

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

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

我想从有经验的人听到一些新的想法或更好的方法做什么,我需要在这里它是:从客户

发送加密数据到服务器,反之亦然,而无需使用SSLStream,但具有良好的安全性。

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

+0

你需要认证客户端吗?或者为什么你需要一个私钥? – CodesInChaos 2012-03-20 16:34:29

+0

CodeInChaos我需要私钥,因为这是我能想到的唯一方法,即发送加密的初始连接以获取内部通信AES密钥。否则,任何使用wireshark的人都可以抓住纯文本的AES。我明白,他们可以窃取我的应用程序来获取带有证书的字符串,但随后我可以通过混淆和其他方法使它们变得更加困难。 – Prix 2012-03-20 16:38:18

+0

为什么您需要向客户端分发私钥?这违背了RSA的目的。为什么客户端不能生成随机密钥对并连接到服务器,使用服务器的公钥来加密连接? – 2012-03-20 16:38:30

回答

1

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

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

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

服务器用RSA私钥解密第一条消息,从而得到会话密钥。它将此密钥用于其他通信。

这样的客户端不包含任何秘密,但通信本身是私人的。这个方案缺乏的主要是客户端认证。

您还应该为服务器 - >客户端和客户端 - >服务器流使用不同的随机数/ IV。您可能还想要添加完整性检查(MAC)。

+0

现在,在密钥等的初始事务之后,客户端被给予X分钟以用用户和密码进行响应以与系统进行认证,否则其被断开。 – Prix 2012-03-20 17:16:16

0

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

公钥SSL的工作原理是证书(以及密钥对)被锁定到可以通过第三方(签名机构)独立确认的特定服务器/域。

只要你摆脱这个前提,你就可以接受公开密钥加密的中间人攻击,因为你不能保证你在和谁通话(或者至少你不能保证有人不会拦截/中继您的消息)。

如果您使用共享密钥,则不需要公钥,证书或其他任何东西 - 但是如果任何未授权方发现了您的秘密,那么您就被搞砸了。

+2

您不需要CA来保护SSL。您可以简单地将公共密钥硬编码到客户端。基本上,您使用单个证书作为受信任的根。这样你就不需要共享的秘密,但你并没有锁定到某个域。 – CodesInChaos 2012-03-20 16:58:55

+0

但是,如果攻击者抓住了他/她的手(在交换过程中),他/她可以在程序中更改密钥并播放“中间人” - 这就是为什么您需要CA--如果不是程序是你必须首先在安全通道上进行通信 - 而蛇则吃它自己的尾巴...... – Carsten 2012-03-20 17:07:33

+0

你需要安全源程序,是的。但CA不能解决这个问题。在某种程度上,您需要获取可信证书列表到客户端。即使在服务器上使用CA签名证书,攻击者也可以简单地将程序代码更改为不安全的程序。 – CodesInChaos 2012-03-20 17:11:36

0

一种可能的方法:

- 服务器有一个著名的公钥,没有人知道的私有密钥(甚至没有客户端)

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

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

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

客户端没有必要将任何私钥与它捆绑在一起。 RSA专为数据交换而设计,无需共享密钥。

+0

你需要客户公共/私人的地方键? – Carsten 2012-03-20 17:05:24

+0

@CarstenKönig是的,这不是必须的(我最初想着用客户端的公钥加密ACK数据包,但这是多余的)。我只是编辑我的答案来反映这一点。 – 2012-03-20 17:08:26

+0

axel_c谢谢你的回应,我明白了,这就是为什么我在主要问题的评论中说“只有AES足够了,我不需要过时这个想法”,我的意思是说,会发生一个使用RSA初始化加密数据,之后只有AES才会采取行动,而不是具有共享私钥,以保持加密作为虚拟RSA保护的“输入/输出”。 – Prix 2012-03-20 17:23:50