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