我的 Windows 8 (Metro) 应用程序使用不同的 Web 服务来访问和混合数据。这些服务中的每一个都需要一个密钥(一些多个密钥)来访问它们。结果,这些密钥很有价值,并且花了我钱(或者可以,根据使用情况)。我可以轻松地将这些键包含在我的应用程序中。但是我怎样才能保护我的密钥不被窥探和滥用呢?
3 回答
考虑重构您的应用程序以从您的服务器调用受保护的 Web 服务并将结果传递回客户端,从而消除将凭据放置在客户端的需要。
如果担心变成带宽,您可以让密钥本身不与二进制文件一起打包,而是下载并加密。请参阅http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx。
不管你怎么做,如果服务被客户端调用,用户仍然可以访问它。
编辑:问题:我如何保护暴露的服务答案:你不能,但你可以让它变得更难。
首先,安装一个客户端证书,以保护从客户端到您的服务的通信通道。
接下来,包括一个服务器生成的 nonce,它要求客户端从您部署的代码中的已知 dll 或 exe 中读取一串字节,该随机偏移量是服务器请求的随机偏移量。如果部署的对象受到法律措施的保护而不会再分发,如果有人写第三方客户端,您可以起诉月球,因为他们必须将您用于保护的图像与他们的应用程序一起重新分发。
确保您的 Web 服务对每个用户进行限制。将每个用户限制为每小时 100 次点击 - 或者任何介于虚假和真实之间的界限。
报告和审计。记录对昂贵 Web 服务的点击,并定期验证它们是否以与您的应用程序使用一致的方式生成。
随机化。如果您想让任何试图对您的软件进行逆向工程的人感到困难,请确保您至少每天随机化用于访问您的服务的 URI。创建一个将日期用作种子并返回该日期的唯一 URI 的函数。
混淆 - 在这一点上,你需要一个真正准备攻击你的应用程序的人。为了进一步毁掉他的一天,通过一个好的混淆器运行你编译的二进制文件,以确保
再一次,这些都不能确保该服务不能在您的服务之外使用,但是它们使它变得非常困难。如果您确实需要确保只有您的软件可以访问您的服务,请使用加密令牌来分发您的应用程序的私钥。这样,他们可以使用该服务的唯一方法是,如果有人将该设备物理连接到他们的计算机上。
你不能完全保护它。您需要将其视为完全妥协,因为您可以采取的所有措施都有解决方法。
WinForms 应用程序也是如此。
与我要求类似内容时相关:WinForms 应用程序的常见漏洞
短版 - 即使您将这些密钥存储在其他地方,如果最终用户可以反编译您的代码并查看您的代码如何访问这些密钥,他们也可以获取它们。
你能做的最好的事情就是增加尽可能多的层(合理的)你的防御,使其尽可能地困难。我们的方法列在这个答案中。你也许可以改进它。如果是这样,请分享,因为我们想改进我们的。
一种独立于平台的方式可能是存储加密密钥。或者,如果密钥在应用程序的生命周期内很少或永远不会更改,则对其进行硬编码。