Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止应用程序使用我的api密钥?_C#_Api_Ssl_Encryption - Fatal编程技术网

C# 如何防止应用程序使用我的api密钥?

C# 如何防止应用程序使用我的api密钥?,c#,api,ssl,encryption,C#,Api,Ssl,Encryption,我的组织有一个以胖客户端风格编写的Win32应用程序。我正在编写一个C客户机/服务器解决方案,它将取代这个Win32应用程序。我使用ASP.NETMVC作为服务器,客户端是WPF应用程序。我自己做了OAuth 2规范的自定义实现。我计划创建一个Restful API,我不仅希望我的客户机使用它,还希望允许第三方使用它 每个应用程序都将向其发布一个api密钥,包括官方客户端,但官方客户端的api密钥应允许第三方用户使用其他api作用域权限。如何解决这个问题是很明显的,但是如果你认为不是每个人都玩得

我的组织有一个以胖客户端风格编写的Win32应用程序。我正在编写一个C客户机/服务器解决方案,它将取代这个Win32应用程序。我使用ASP.NETMVC作为服务器,客户端是WPF应用程序。我自己做了OAuth 2规范的自定义实现。我计划创建一个Restful API,我不仅希望我的客户机使用它,还希望允许第三方使用它

每个应用程序都将向其发布一个api密钥,包括官方客户端,但官方客户端的api密钥应允许第三方用户使用其他api作用域权限。如何解决这个问题是很明显的,但是如果你认为不是每个人都玩得很好,你必须问什么能阻止某人假装他们是官方客户并使用它的API密钥?通信将被加密,但服务器不在云中或任何我们可以控制它的地方。我们的客户在他们自己的机器上安装服务器,他们很可能有权访问服务器应用程序的SSL证书。一旦您有了SSL证书,您就可以轻松编写一个应用程序,在我们客户的机器上运行,该应用程序可以从官方客户端应用程序收集API密钥和机密,并使用该信息从服务器请求令牌如果你是官方客户

我计划对服务器使用的默认密钥进行自签名,我可以尝试将其隐藏在应用程序中,但这实际上只是混淆。此外,我希望允许用户提供他们自己的SSL证书,这样基于浏览器的第三方应用程序就不会因为浏览器抱怨他们试图通过自签名SSL通道进行通信而出现问题

有什么我能做的吗?在我看来,以下是我的选择:

1我可以将其设置为仅使用我们提供的SSL证书,并将其隐藏在使用应用程序代码中模糊的机密加密的磁盘上。然后,我们只希望没有人愿意花时间挖掘我们的.net程序集,以找到用于加密/解密磁盘上证书的秘密

2我们允许他们提供证书,这样,当他们想要使用签名证书时,我们根本不需要参与该过程。我们不想从事证书业务。现在,我们甚至不能隐藏在混淆之后,因此如果有人想要它,那么官方客户机的API密钥和秘密就很容易获得


对我来说,这两样都不太理想。选项1使我们不得不向他们申请额外资金,并在自签名对他们不起作用时管理SSL证书,最后,如果有人真的想要这些证书,他们仍然可以花时间获得它们。选项2只是让窃取官方客户端的秘密变得非常容易。

限制非官方应用的原因: 1.阻止克隆 告诉人们不要这样做。请律师向流行应用程序的作者和任何帮助分发这些应用程序的人发送停止和终止信。间歇性地下载它们并修改客户端/服务器代码,这样流行的应用程序就会崩溃。为了增加劝阻,暂时禁止任何使用流行应用程序的用户。作者大多会放弃克隆你的应用程序;暂时禁止用户将杀死他们的安装群。这对你的名声不好。 2.防止未经授权的行为。 A.官方应用程序允许的任何行为都应得到自定义应用程序的允许。无论您担心什么情况,都要在服务器端阻止它,这样两个应用程序都无法做到这一点


您可以尝试隐藏凭证代码混淆、隐藏凭证等,但这只会增加成本/难度。这通常足以阻止代码盗窃,无需使代码盗窃成为不可能;这足以使它比手工复制更困难。但是,希望以不受支持的方式使用api的用户可以解决这个问题。

答案很简单。应用程序的每个实例都应该有自己的唯一密钥,以便用户注册。然后禁止违反规则的用户。在这种情况下,请与未经授权的客户登录。通过更频繁地推送更新,应该很容易检测到,而不是进行反向工程。与朋克巴斯特或其他反作弊技术

基本相似,任何敏感凭证(如证书私钥)或随应用程序分发的其他凭证都不受保护。我将特别避免在客户端应用程序中分发任何凭据,而是采用一种身份验证方法,该方法特别不使用任何存储的凭据(如用户名和密码输入),并将任何授权决策留给服务器。从本质上讲,如果客户端应用程序被预先配置好,那么它总是可以被利用的。最终,秘密会被保留下来——我们只需要决定最好的保存位置,并与它们永远保留的事实保持平和
在易受攻击的情况下,客户机必须能够保守并提供一个秘密。我知道没有铁一般的方法可以做到这一点。我不认为OAuth 2规范严格要求在请求访问令牌时使用API密钥发送秘密,但允许这样做有点愚蠢。OAuth2进程确实意味着用户/密码是图片的一部分,但这与api身份验证是分开的。您使用api密钥和密码请求令牌,它会将您重定向到一个页面,以显示给用户以供用户/通过,然后他们会决定是否授予您的应用程序访问请求的资源的权限。OAuth 2没有说明如何颁发密钥或密码。本质上,我们将为开发人员提供一个密钥和秘密,这些密钥和秘密是获得访问令牌所必需的,该令牌将针对每个请求传递给服务器。您可以发布密钥,不需要保密,但这允许第三方轻松欺骗其他应用程序。想象一下没有秘密和流行的第三方插件。获取API密钥,并被授予访问管理员批准的所有优秀插件的权限。问题是我们的客户端也是API的消费者,我们的应用程序不能隐藏在防火墙后面。我认为混淆是唯一的答案:/OAuth2身份验证是否可以卸载到运行在服务器附近的某个中间件上,该中间件负责存储敏感的应用程序机密,以交换来自客户端的有效用户名和密码或其他未保存的凭据。您可以将其视为您的密钥库,就像银行使用HSMs硬件安全模块所做的那样,也可以将其视为代表客户端执行OAuth2身份验证。