我正在尝试设计一种安全方案,用于加密 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 服务获取响应。我认为您不能蛮力使用可变长度的字符串。听起来不切实际。
有人看到这种方法有问题吗?