我在设计一个安全方案,用于加密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服务的响应。我不认为你可以强制变长字符串。这听起来不切实际。
有没有人看到这种方法的问题?
如果你走这条路,请注意。编写加密代码很难。有时候把某些东西拼凑在一起看起来很容易,但可靠的安全性依赖于不做出弄糟角落案例的假设。 – Stobor 2010-05-03 23:45:59