我正在编写第一个使用OAuth的应用程序。这适用于桌面应用程序,而不是访问二进制文件的网站或移动设备,因此我担心如何保护我的应用程序密钥和密钥。我觉得查看编译文件并找到存储密钥的字符串是微不足道的。
我是否过度反应或者这是桌面应用程序的真正问题(使用已知解决方案)?
这个项目是用Java编写的,但我也是一个C#开发人员,所以任何.NET解决方案都会受到赞赏。
编辑: 我知道没有完美的解决方案,我只是在寻找缓解解决方案。
EDIT2:我知道只有解决方案是使用某种形式的混淆。是否有任何免费的.NET和Java提供程序可以进行字符串混淆?
答案 0 :(得分:13)
保护不受信任的用户可以访问的二进制文件中的密钥没有好的甚至是半好的方法。
至少有理由保护自己。
最小工作量将无效。只需几个小时的业余时间,即使是最大的努力也不会对熟练的逆向工程师/黑客有效。
如果您不希望攻击OAuth密钥,请不要将它们放在分发给不受信任的用户的代码中。周期。
我是否过度反应或者这是桌面应用程序的真正问题(使用已知解决方案)?
没有已知(有效)解决方案是一个真正的问题。不是在Java中,不是在C#中,不是在Perl中,不是在C中,不是在C中。把它想象成是物理定律。
您的替代方案是:
强制您的用户使用仅执行加密签名代码的可信平台。 (提示:这很可能对您的应用程序不实用,因为当前的PC不能以这种方式工作。即使TPS也可以在适当的设备下被黑客攻击。)
将您的应用程序转换为服务,并在您控制访问权限的计算机/计算机上运行它。 (提示:听起来OAuth 2.0可能会删除此要求。)
使用一些不需要分发永久密钥的身份验证机制。
让您的用户签署具有法律约束力的合同,不对您的代码进行反向工程,如果他们违反合同,则起诉他们。弄清楚你的哪些用户已经破解了你的密钥......这是留给你的想象......(提示:这不会阻止黑客攻击,但如果黑客拥有资产,可能会让你收回损害赔偿金。)
顺便说一句,类比论证是一个聪明的修辞手法,但它在逻辑上并不合理。观察到前门上的物理锁定会阻止人们窃取您的东西(在某种程度上)对于在可执行文件中安全嵌入私人信息的技术可行性没有任何内容。
并且忽略了类比论证不合理的事实,这个特殊的类比因以下原因而崩溃。物理锁不是不可穿透的。前门锁定“工作”,因为有人必须站在你的房子前面,可以看到从你的锁上摆弄一分钟左右的道路......或者用一把大锤敲打它。这样做的人冒着他/她将被观察的风险,警察将被召唤。银行金库“工作”,因为穿透它们所需的时间是几个小时,还有其他警报,保安等等。等等。相比之下,黑客可以花费几分钟,几小时甚至几天试图破坏您的技术保护措施,实际上没有被观察/检测到的风险。
答案 1 :(得分:3)
OAuth不适用于您所描述的情况,即其目的不是将客户端设备验证到服务器或其他设备。它旨在允许一台服务器委派访问其资源给已经由另一台服务器验证的用户,第一台服务器信任该用户。涉及的秘密旨在保持两台服务器的安全。
我认为你正试图解决另一个问题。如果您正在尝试为服务器找到一种方法来验证只有您的客户端代码正在访问您的服务器,那么您将面临一项非常重要的任务。
答案 2 :(得分:2)
平台无关紧要,你所要求的永远是不可能的。无论你做了什么需要这个功能,你的应用程序有什么问题。你永远不能相信这样的客户。也许你正在寻找(in)Security Through Obscurity。
答案 3 :(得分:2)
编辑:让我说清楚;这是不解决方案,用于将密钥安全地存储在二进制文件中,正如许多其他人所提到的,没有办法做到这一点。 我所描述的是一种减轻这种危险的方法。
/编辑
这只是一个部分解决方案,但它可以根据您的设置工作;它在我们的大学内部网络中对我们很有用。
我们的想法是,您制作的服务很可能只能由计算机访问。
例如,经过身份验证的WCF服务,不仅要求您登录(使用存储在可执行文件中的凭据),还要求您传递与时间相关的值(就像您获得的一个小工具一样)网上银行)或特定数据库行的值,或多个选项。
这个想法很简单,你不能完全保护凭证,但你只能将它们作为问题的一部分。
我们为使用学生数据存储的Windows应用做了这个,你可以想象,它必须非常安全。
我们的想法是,我们有一个连接提供程序在某个地方作为服务运行,我们有一个心跳系统,每隔30秒左右生成一个新密钥。
获取正确连接信息的唯一方法是通过连接提供程序进行身份验证,并提供当前与时间相关的心跳。它足够复杂,以至于人类无法坐在那里手动打开连接并提供正确的结果,但其性能足以在我们的内部网络中工作。
当然,有人仍然可以反汇编您的代码,找到您的凭据,破译您的心跳等等;但如果某人有能力并准备好去那么长,那么只有保护机器的方法才能将其从网络上拔下来!
希望这能激发你的某种解决方案!
答案 4 :(得分:2)
Eazfuscator.NET和其他.NET混淆器进行字符串加密,这使得某些人在像Reflector这样的去混淆程序中看到你的字符串文字时显得微不足道。我说稍微不那么简单,因为用于加密字符串的密钥仍然存储在你的二进制文件中,因此攻击者仍然可以很容易地解密字符串(只需找到密钥,然后确定哪个加密算法用于加密字符串,它们的字符串文字已解密)。