银光中的Diffie-Hellman

3
我试图设计一种安全方案,用于加密Silverlight客户端和我创建的PHP Web服务之间的应用程序级数据。由于我正在处理一个公共网站,因此我从服务中提取的信息是公共的,但我向Web服务提交的信息不是公共的。还有一个网站后端用于管理,因此所有从Web服务推送到Silverlight管理后端的应用程序数据也必须加密。
Silverlight不支持非对称加密,这对于公共网站有效。对称加密仅适用于后端,因为用户不会登录公共网站,因此不能派生基于密码的密钥。尽管对称加密很好,但我无法安全地保存私有密钥在Silverlight客户端中。因为它要么必须硬编码,要么从某种配置文件中读取。这都不被认为是安全的。那么...计划B。
我的最终替代方案将是实现Diffie-Hellman算法,该算法通过密钥协定支持对称加密。但是Diffie-Hellman容易受到中间人攻击。换句话说,没有保证任何一方确定对方的身份,这可能导致通信被拦截并更改而接收方不知道。因此,建议使用私有共享密钥加密密钥协商握手,以确认任一方的身份。
这使我回到了最初的问题,这让我需要使用Diffie-Hellman,如何在Silverlight客户端中使用私钥而不在代码或XML文件中硬编码它。
对于这个问题我没有答案...有吗?
编辑:
请记住,这是关于我自己推出的自定义PHP Web服务。
我找到了一个RSA实现,我可以在Silverlight中使用。似乎相当安全使用它来加密Silverlight客户端和PHP Web服务之间DiffieHellman密钥协议的握手,并随后使用它来加密已经商定的对称密钥(该密钥本身是通过哈希结果生成的密钥交换)。
此后,我几乎可以保证所有发送给Web服务的通信都没有被拦截、修改并重新传输(MITM)。但我认为仍然可能,从技术上讲,攻击者可以冒充Silverlight客户端并向Web服务发送消息(假设他们发现了URL)。
未经授权访问的安全性得到了保障,因为攻击者不知道我的自定义Web服务的“secret api”,因此无法与其通信。
唯一破解这个问题的方法是通过用攻击者可能怀疑有效的任何字符串来暴力破解Web服务以尝试从Web服务获得响应。我不认为你可以暴力破解可变长度的字符串。这听起来不切实际。
有人看到这种方法有问题吗?

如果你要走这条路,请小心。编写加密代码很难。有时候似乎很容易把一些东西拼凑在一起,但可靠的安全性依赖于不做出会破坏边缘情况的假设。 - Stobor
3个回答

3
SSL/TLS存在与任何基于Diffie-Hellman的实现相同的问题,即仍然可以被中间人攻击破解。TLS之所以安全可信,是因为客户端在接收服务器证书时通过检查其是否使用来自已知受信任身份(例如VeriSign)的另一个证书进行认证。到目前为止,这使得在没有VeriSign的私钥的情况下无法进行中间人攻击。当干扰者发送一个假证书来宣称自己是服务器时,客户端将轻松检测到该证书未使用受信任身份的证书进行签名,并退出连接并向用户显示警告。
对于您的目的,最简单的方法可能是使用TLS。为了使其安全,您需要为服务器生成一个证书,然后在客户端中嵌入该证书的公钥。客户端可以验证正在与您的服务器交互,而无需暴露私钥,您也不必分发它。
编辑:响应您对Jerry答案的评论,如果您的托管提供商根本不允许SSL / TLS连接,则防止中间人攻击将很棘手。如果这是避免使用TLS的唯一原因,我建议让您的提供商打开它,或找到一个允许使用它的提供商。
编辑:响应您的编辑问题:即使您现在在Silverlight客户端中使用RSA向Web服务发送数据,也不能保证客户端本身没有被修改。攻击者可以深入了解您的客户端,确定您用于执行加密/握手的算法,然后编写代码来模仿您的客户端(或修改客户端以包含其代码)。一旦他们这样做了,他们就可以开始分析您的API并使用它来调用您的Web服务。
SSL / TLS也是如此-客户端可以使用主机的证书验证主机的身份,并且只要主机的服务器得到保护,客户端就可以信任主机的输出。但是,主机没有100%的机制可以验证客户端是谁,因为客户端将在没有受控执行环境的计算机上运行。
但是-尽管上述内容是真实的,并且可能会有攻击者以这种方式破坏您的系统,但这很可能不太可能-除非您正在开发一个公共面向系统,该系统吸引了大量的关注/使用,或直接涉及某些形式的货币,否则攻击者需要付出一些努力才能向您的Web服务发送自己的输入。
您最好的选择是彻底验证Web服务接收到的输入,并不要留下可访问常规客户端永远不会使用的悬空API。

这在Silverlight中是可能的吗? - cmaduro
您应该能够使用WebClient类并将https: URI传递给它来与PHP通信。然后,Web服务器只需要配置证书即可。在Google上进行简要搜索显示,您可能还需要使用应用程序设置XML设置以允许TLS连接;由于不熟悉Silverlight,我找不到更具体的信息。 - Blair Holloway
如果您的托管提供商根本不允许SSL/TLS连接,那么是时候找一个新的托管提供商了... - BlueRaja - Danny Pflughoeft

1

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


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

0

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

然后你可以将JavaScript重写为Silverlight。我建议使用Wireshark来转储数据包,然后使用Meld或其他工具来比较数据包,以查看你的实现与原始实现的差异。

祝你好运!

(免责声明:我完全同意Enano开发团队的观点,这不是SSL的完全替代品,应尽可能使用SSL。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接