2010-04-23 43 views
3

我在设计一个安全方案,用于加密silverlight客户端和我创建的php webservice之间的应用程序级别数据。由于我正在处理公共网站,因此我从服务中获取的信息是公开的,但是我提交给web服务的信息不是公开的。管理网站也有一个后端,所以自然,所有的应用程序数据都被从web服务推送到Silverlight管理后端,也必须加密。Silverlight中的Diffie-Hellman

Silverlight不支持非对称加密,这将适用于公共网站。对称加密只能在后端工作,因为用户不会登录到公共网站,因此不能派生出基于密码的密钥。仍然对称加密会很好,但我无法安全地将私钥保存在Silverlight客户端中。因为它要么必须硬编码,要么从某种配置文件读取。没有一个被认为是安全的。所以......计划B.

然后我的最后一种选择是实现Diffie-Hellman算法,它通过密钥协议支持对称加密。然而,Diffie-Hellman容易受到中间人攻击。换句话说,不能保证任何一方都能确定对方的身份,这样就可以在没有接收方知道的情况下拦截和改变通信。因此建议使用私有共享密钥来加密密钥协议握手,以便确认任一方的身份。

这使我回到最初的问题,导致我需要使用Diffie-Hellman,如何在Silverlight客户端中使用私钥而无需在代码或xml文件中对其进行硬编码。

我完全失去了对这一个的爱...有没有任何答案呢?

编辑:

请记住,这是关于我推出我自己的自定义PHP Web服务。

我发现了一个我可以在Silverlight中使用的RSA实现。使用它来加密Silverlight客户端和PHP Web服务之间的DiffieHellman密钥协议的握手似乎很安全,并且随后也使用它来加密已达成一致的对称密钥(它本身是从密钥的结果生成的通过哈希交换)。

在此之后,我几乎保证所有通信 Web服务尚未被拦截,修改,然后重新传输(MITM)。但我相信这仍然是可能的;从技术上讲,攻击者模仿Silverlight客户端并将消息发送到web服务(假设他们发现url)。

由于攻击者不知道我的自定义web服务的“秘密api”,因此提供了未授权访问的安全性,因此他们无法与之通信。

打破这种情况的唯一方法是暴力破解web服务,攻击者可能认为有效的任何字符串以尝试获取Web服务的响应。我不认为你可以强制变长字符串。这听起来不切实际。

有没有人看到这种方法的问题?

+0

如果你走这条路,请注意。编写加密代码很难。有时候把某些东西拼凑在一起看起来很容易,但可靠的安全性依赖于不做出弄糟角落案例的假设。 – Stobor 2010-05-03 23:45:59

回答

1

显而易见的解决方案是使用WCF建立SSL或TLS连接,而不是尝试将其构建到应用程序中。

+0

这是不可能的,因为这需要一个能够运行WCF服务的托管提供程序。我正在尝试在Silverlight应用程序和php网页之间创建一个安全连接,该连接用于查询数据库并以xml形式发回结果。它也用于更新数据库。主机提供商不提供ssl连接。我试图将安全性构建到应用程序中,以免依赖SSL/TLS。 – cmaduro 2010-04-23 03:50:50

3

SSL/TLS从任何基于的Diffie-Hellman的实现你拿出会有的,因为它仍然可以通过一个中间人攻击被打破了同样的问题困扰。

原因TLS是安全的,值得信赖的是因为客户端,接收服务器的证书时,通过检查,它是利用公知的可信身份的另一个证书签名验证它 - 说,威瑞信。迄今为止,这使得它不可能制定一个中间人攻击,而无需VeriSign的私人关键 - 当入侵者发送伪造证书宣称是服务器,客户端将容易地检测到该证书不签使用可信身份证书并退出连接,向用户显示警告。

你的目的,很可能最容易使用TLS。为了使它的安全,你会为您的服务器证书,然后在客户端嵌入该证书公共关键。然后,客户机可以验证它是说你的服务器,而不必暴露私有密钥,您有分布。

编辑:为了回应您对杰里的回答的评论,如果您的托管服务提供商根本不允许SSL/TLS连接,防止中间人攻击将会非常棘手。如果这是您避免TLS的唯一原因,那么我会建议让您的提供商将其启用,或者找到允许提供该提供商的提供商。

编辑:在回答你的问题编辑:即使你正在使用RSA在您的Silverlight客户端将数据发送到Web服务,如果你不能保证客户本身尚未修改。攻击者很可能挖掘你的客户端,确定你用来执行加密/握手的算法,然后编写代码模拟你的客户端(或者实际上,修改客户端以包含他们的代码)。一旦他们完成了这些工作,他们就可以开始分析您的API并使用它来调用您的Web服务。

这与SSL/TLS一样 - 客户端可以使用主机的证书验证主机的身份,只要主机的服务器是安全的,客户端就可以信任主机的输出;然而,主机无法100%验证客户端是谁的机制,因为客户端将在没有受控执行环境的机器上运行。

但是 - 尽管上述是真实的,而且它的可能,攻击者可以通过这种方式危害您的系统,它很可能不是可能 - 除非你是一个面向公众的系统上工作,吸引很多关注/使用,或者以某种形式直接处理金钱的系统,攻击者需要付出一些努力才能将自己的输入发送到Web服务。

最好的办法是彻底验证您的Web服务收到的输入,并且不要让您的常规客户端永远不会使用的悬挂API访问。

+0

Silverlight有可能吗? – cmaduro 2010-04-23 03:55:00

+0

您应该可以使用WebClient类并将其传递给https:URI以与PHP进行通信。 Web服务器只需要配置一个证书即可。 在Google上粗略搜索可以发现,您可能还必须使用应用程序设置XML设置才能允许TLS连接;我找不到比这更具体的信息,不熟悉Silverlight。 – 2010-04-23 04:05:46

+0

如果您的托管服务提供商完全不允许使用SSL/TLS连接,现在是时候获得一个新的托管服务提供商...... – 2010-05-04 15:25:29

0

我建议先从这个JavaScript + PHP DH密钥交换协议: http://enanocms.org/News:Article/2008/02/20/Diffie_Hellman_key_exchange_implemented

然后,您可以重新编写Silverlight中的JavaScript。我建议使用Wireshark来转储数据包,然后您可以使用Meld或其他任何方法来区分数据包,以查看您的实现与原始实现的不同之处。

祝你好运!

(声明:我完全Enano开发团队同意,这不是一个完全替代SSL和SSL,应尽可能使用。)