3

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

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 服务获取响应。我认为您不能蛮力使用可变长度的字符串。听起来不切实际。

有人看到这种方法有问题吗?

4

3 回答 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 可访问。

于 2010-04-23T03:26:43.090 回答
1

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

于 2010-04-23T03:14:06.213 回答
0

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

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

祝你好运!

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

于 2010-04-27T21:16:59.807 回答