如何保护用户反编译项目的OAuth密钥?

我正在编写第一个使用OAuth的应用程序。 这适用于桌面应用程序,而不是访问二进制文件的网站或移动设备,因此我担心如何保护我的应用程序密钥和密钥。 我觉得查看编译文件并找到存储密钥的字符串是微不足道的。

我是否过度反应或这是桌面应用程序的真正问题(使用已知解决方案)?

这个项目是用Java编写的,但我也是一个C#开发人员,所以任何.NET解决方案都会受到赞赏。

编辑:我知道没有完美的解决方案,我只是在寻找缓解解决方案。

编辑2:我知道只有解决方案是使用某种forms的混淆。 是否有任何免费的.NET和Java提供程序可以进行字符串混淆?

没有好的甚至是半好的方法来保护嵌入在不受信任的用户可以访问的二进制文件中的密钥。

有理由至少投入最少的努力来保护自己。

最小的努力量将无效。 只需几个小时的业余时间,即使最大限度的努力也不会对熟练的逆向工程师/黑客有效。

如果您不希望黑客攻击OAuth密钥,请不要将它们放在分发给不受信任的用户的代码中。 期。

我是否过度反应或这是桌面应用程序的真正问题(使用已知解决方案)?

这是一个没有已知(有效)解决方案的真正问题。 不是在Java中,不是在C#中,不是在Perl中,不是在C中,不是在C中。 把它想象成是物理定律。


您的替代方案是:

  • 强制您的用户使用仅执行加密签名代码的可信平台。 (提示:这很可能对您的应用程序不实用,因为当前的PC不能以这种方式工作。甚至TPS也可以在适当的设备下被黑客攻击。)

  • 将您的应用程序转换为服务,并在您控制访问权限的计算机/计算机上运行它。 (提示:听起来OAuth 2.0可能会删除此要求。)

  • 使用一些不需要永久密钥分发的身份validation机制。

  • 让您的用户签署具有法律约束力的合同,以便不对您的代码进行反向工程,并在违反合同时起诉他们。 弄清楚你的哪些用户已经破解了你的密钥……这是留给你的想象……(提示:这不会阻止黑客入侵,但如果黑客拥有资产,可能会让你收回损失。)


顺便说一句,类比论证是一个聪明的修辞手法,但它在逻辑上并不合理。 观察到前门上的物理锁阻止了人们窃取你的东西(在某种程度上)对于在可执行文件中安全地嵌入私人信息的技术可行性没有任何说明。

并且忽略了类比论证不合理的事实,这个特殊的类比因以下原因而被打破。 物理锁不是不可穿透的。 前门上的锁“工作”是因为有人必须站在你家门前,可以看到摆弄你的锁一分钟左右的道路……或者用一把大锤敲打它。 这样做的人冒着被观察他/她的风险,警察将被召唤。 银行金库“工作”,因为穿透它们所需的时间是几个小时,还有其他警报,保安等等。等等。 相比之下,黑客可能会花费几分钟,几小时甚至几天试图破坏您的技术保护措施,实际上没有被观察/检测到的风险。

OAuth不适用于您所描述的情况,即其目的不是将客户端设备validation到服务器或其他设备。 它旨在允许一台服务器将对其资源的访问权委托给已由第一台服务器信任的另一台服务器进行身份validation的用户。 涉及的秘密旨在保持两台服务器的安全。

我想你正试图解决另一个问题。 如果您正在尝试为服务器找到一种方法来validation它是否只是您的客户端代码正在访问您的服务器,那么您将面临一项非常重要的任务。

编辑:让我说清楚; 这不是将密钥安全地存储在二进制文件中的解决方案,正如许多其他人所提到的那样,没有办法做到这一点。 我所描述的是一种减轻这种危险的方法。

/编辑

这只是一个部分解决方案,但它可以根据您的设置工作; 它在我们的大学内部网络中对我们很有用。

我们的想法是,您提供的服务很可能只能由计算机访问。

例如,经过身份validation的WCF服务,不仅要求您登录(使用存储在可执行文件中的凭据),还要求您传递与时间相关的值(例如您为在线银行获得的小工具之一)或者特定数据库行的值或许多选项。

这个想法很简单,你不能完全保护凭证,但你可以只把它们作为问题的一部分。

我们为使用学生数据存储的Windows应用程序做了这个,你可以想象,它必须非常安全。

我们的想法是,我们有一个连接提供程序在某个地方作为服务运行,我们有一个心跳系统,每隔30秒左右生成一个新密钥。

获取正确连接信息的唯一方法是使用连接提供程序进行身份validation,并提供当前与时间相关的心跳。 它足够复杂,以至于人类不能坐在那里手动打开连接并提供正确的结果,但其性能足以在我们的内部网络中工作。

当然,有人仍然可以反汇编你的代码,找到你的凭据,破译你的心跳等等; 但如果有人有能力并准备好去那么长,那么只有保护机器的方法才能将其从网络中拔出!

希望这能激发您的某种解决方案!

Eazfuscator.NET和其他.NET混淆器进行字符串加密,这使得某些人在像Reflector这样的去混淆程序中看到你的字符串文字时显得微不足道。 我说稍微不那么简单,因为用于加密字符串的密钥仍然存储在你的二进制文件中,因此攻击者仍然可以很容易地解密字符串(只需找到密钥,然后确定哪个加密算法用于加密字符串,他们有你的字符串文字解密)。

平台无关紧要,你所要求的永远是不可能的。 无论你做了什么需要这个function,你的应用程序有什么问题。 你永远不能相信这样的客户。 也许你正在寻找(通过Obscurity安全) 。