当前位置: 首页 > 面试题库 >

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

司徒兴思
2023-03-14
问题内容

我正在编写我的第一个使用OAuth的应用程序。这是针对桌面应用程序的,而不是网站或移动设备,在这些应用程序上访问二进制文件会更加困难,因此我关注如何保护应用程序的密钥和机密。我觉得查看编译后的文件并找到存储密钥的字符串很简单。

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

该项目正在用Java进行编码,但是我也是C#开发人员,因此任何用于.NET的解决方案也将不胜感激。

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

EDIT2:我知道几乎唯一的解决方案是使用某种形式的混淆。是否有用于字符串混淆的.NET和Java免费提供程序?


问题答案:

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

有理由至少要付出最小的努力来保护自己。

最小 的努力量将不会生效。仅仅花了几个小时的时间,即使是 最大 的努力对熟练的反向工程师/黑客也不会有效。

如果您不希望自己的OAuth密钥被黑客入侵,请不要将其放入分发给不受信任用户的代码中。期。

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

这是一个真正的问题, 没有已知的(有效的)解决方案 。不是用Java,不是C#,不是Perl,不是C,不是任何东西。认为它就像是物理定律。

您的替代方法是:

  • 强制用户使用仅执行加密签名代码的受信任平台。(提示:这对于您的应用程序很可能不切实际,因为当前的PC不能以这种方式工作。如果使用正确的设备,甚至TPS都可以被入侵。)

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

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

  • 让您的用户签署具有法律约束力的合同,以免对您的代码进行反向工程,并在他们违反合同时提起诉讼。找出哪个用户对您的密钥进行了窃听……(提示:这不会停止黑客行为,但是如果黑客拥有资产,这可能会允许您追回损失。)

顺便说一句,类比论证是一个聪明的修辞手法,但从逻辑上讲并不合理。关于前门上的物理锁阻止人们偷窃您的东西(某种程度上)的观察结果, 没有
说明将私有信息安全地嵌入可执行文件中的技术可行性。

并且忽略了类比论证不合理的事实,该特殊类比由于以下原因而失效。物理锁不可穿透。您前门上的锁“起作用”是因为有人必须站在您的房子前面,从马路上看到您摆弄您的锁约一分钟左右……或用大铁锤敲打它。这样做的人冒着被监视的风险,并会报警。银行金库“工作”是因为穿透它们所需的时间是几个小时,并且还有其他警报器,安全警卫等等。相比之下,黑客可能会花费数分钟,数小时甚至数天的时间来尝试破坏您的技术保护措施,而实际上被发现/发现的风险为零。



 类似资料:
  • 问题内容: 我是Java初学者。我正在开发可解密某些数据的应用程序。解密密钥被硬编码到软件中,因此可以通过分析字节码看到。 我知道不能完全防止逆向工程,所以我想做的就是使过程尽可能地艰巨。 我的想法不是直接将密钥放入代码中,而是将其进行某种转换。例如,我可以写- 这样,查看字节码的人无法立即读取它。但是将必须遵循逻辑并对其进行转换,这在字节级别上不会那么容易。 那么你们怎么看?这有用吗?除了十六进

  • 问题内容: 我正在使用Java开发应用程序,但是我不会发布代码。问题是,我测试了其中的一个jar反编译器,它几乎可以完美地从我的jar文件中获取代码!我的问题是如何在不提取代码的情况下分发jar文件? 问题答案: 由于Java在编译过程中保留了大多数“元数据”(允许动态加载和反射),因此直接编译(不仅反汇编)已编译的类文件是一种直接的方法。这就是为什么恢复的代码与原始代码非常相似的原因。 虽然不是

  • 问题内容: 众所周知,有很多Java反编译器工具可以将.cl​​ass转换为.java文件。 因此,我们需要保护.java文件免于反编译。我知道这是一个大话题,也许没有止境。 通常,有两种方法:混淆器和定制的类加载器。 是否有将这两种方式结合在一起的成熟解决方案或开源框架? 另一个方面与exe4j有关,它将jars打包到exe文件中,似乎可以保护java代码,因为我们看到的是exe文件而不是jar

  • 问题内容: Java 文件可以很容易地反编译。如果必须在代码中使用登录数据,如何保护数据库? 问题答案: 将机密帐户和密码硬编码到软件中非常方便-对于熟练的反向工程师。如果所有软件上的密码都相同,那么当不可避免地知道该密码时,每个客户都会受到攻击。而且由于它是硬编码的,因此修复起来非常痛苦。 你应将配置信息(包括密码)存储在应用程序启动时读取的单独文件中。这是防止密码因反编译而泄漏的唯一真实方法(

  • 我正在使用AES加密实现一个加密字符串的程序,并希望将我的“密钥”保存在一个文件中,而不是在源代码中硬编码。 但是,这给我带来了一个问题,我如何保护这个秘密密钥不被他人看到? 如果我要再次加密这个“密钥文件”,我将不得不再次处理同样的问题。 我该如何处理这些问题? 参考:https://wiki.sei.cmu.edu/confluence/display/java/MSC61-J.不要使用不安全