C# 如何保护OAuth密钥不被用户反编译我的项目?

C# 如何保护OAuth密钥不被用户反编译我的项目?,c#,java,.net,security,oauth,C#,Java,.net,Security,Oauth,我正在编写第一个使用OAuth的应用程序。这是一个桌面应用程序,而不是一个网站或移动设备,它将更难访问二进制文件,所以我关心的是如何保护我的应用程序密钥和秘密。我觉得查看编译后的文件并找到存储密钥的字符串是很简单的 我是否反应过度,或者这是桌面应用程序的真正问题(已知解决方案) 这个项目是用Java编写的,但我也是一名C#开发人员,因此任何针对.NET的解决方案都将不胜感激 编辑: 我知道没有完美的解决方案,我只是在寻找缓解问题的解决方案 我知道唯一的解决办法就是使用某种形式的模糊处理。是否有任

我正在编写第一个使用OAuth的应用程序。这是一个桌面应用程序,而不是一个网站或移动设备,它将更难访问二进制文件,所以我关心的是如何保护我的应用程序密钥和秘密。我觉得查看编译后的文件并找到存储密钥的字符串是很简单的

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

这个项目是用Java编写的,但我也是一名C#开发人员,因此任何针对.NET的解决方案都将不胜感激

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


我知道唯一的解决办法就是使用某种形式的模糊处理。是否有任何免费的.NET和Java提供商可以进行字符串模糊处理?

平台不重要,你的要求永远是不可能的。无论你做了什么需要这个特性,你的应用程序都有什么问题。你永远不能相信这样的客户。也许你正在寻找

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

有理由至少花最少的努力来保护自己

最低限度的努力是无效的。即使付出最大的努力也无法有效地对付只有几个小时空闲时间的熟练逆向工程/黑客

如果您不想让OAuth密钥遭到黑客攻击,请不要将其放入分发给不受信任用户的代码中。句号

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

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


你的选择是:

  • 强制用户使用只执行加密签名代码的受信任平台。(提示:这很可能对您的应用程序不实用,因为当前一代的PC不能以这种方式工作。即使是TPS,只要有合适的设备,也可能遭到黑客攻击。)

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

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

  • 让你的用户签署一份具有法律约束力的合同,不要对你的代码进行反向工程,如果他们违反合同,就起诉他们。弄清楚哪些用户盗用了你的密钥,这是你的想象。。。(提示:这不会阻止黑客攻击,但如果黑客拥有资产,可能会允许您恢复损失。)


顺便说一句,类比论证是一种巧妙的修辞手法,但在逻辑上并不合理。前门上的物理锁可以阻止人们偷你的东西(在某种程度上),这一观察结果丝毫没有说明在可执行文件中安全嵌入私人信息的技术可行性


忽略类比论证是不合理的这一事实,这个特殊的类比因以下原因而失效。物理锁不是不可穿透的。前门上的锁“起作用”,因为从路上可以看到有人站在你家门口摆弄你的锁一分钟左右。。。或者用大锤子敲打它。如果有人这样做,他/她将冒被观察的风险,并会报警。银行金库“起作用”,因为穿透金库所需的时间是几个小时,还有其他警报、保安等。相比之下,黑客可能会花费数分钟、数小时甚至数天的时间试图破坏您的技术保护措施,而这样做的风险实际上为零;这不是一个安全地将密钥存储在二进制文件中的解决方案,正如许多其他人所提到的,没有办法做到这一点。 我所描述的是一种减轻这样做的一些危险的方法

/编辑

这只是部分解决方案,但它可以根据您的设置工作;它在我们大学内部网络中运行良好

这个想法是,你所做的服务很可能只被计算机访问

例如,一个经过身份验证的WCF服务,它不仅要求您登录(使用存储在可执行文件中的凭据),而且还要求您传递一个与时间相关的值(例如您为网上银行获得的一个小工具)或一个特定数据库行的值,或一系列选项

这个想法其实很简单,您无法完全保护凭据,但您只能使它们成为问题的一部分

我们这样做是为了一个使用学生数据存储的windows应用程序,正如你所想象的,它必须非常安全

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

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

当然,有人仍然可以分解你的代码,找到你的凭证,破译你的心跳等等;但是,如果有人有能力并且准备达到这些程度,那么保护您的机器的唯一方法就是将其从网络中拔出

希望这能启发你找到某种解决办法

和其他.NET模糊处理程序进行字符串加密,这使得人们在解模糊程序中看到您的字符串文本时稍微不那么麻烦