我需要一些有关如何保护应用程序(尤其是ac#.NET应用程序)中的私有API密钥的想法。
首先,我了解到从理论上讲不可能在源代码中隐藏任何内容,因此我想出了另一个想法,但是我不确定它的合理性。无论如何,是否有可能以某种方式与Web服务器通信以验证私钥,然后再与应用程序对话以确认它是合法的握手?
我有两个密钥可以使用:一个公共密钥(顾名思义,不必像对待私有密钥一样小心对待),以及一个私有密钥,它需要与他人保持安全。
我将如何做到这一点的任何想法将不胜感激。
我需要一些有关如何保护应用程序(尤其是ac#.NET应用程序)中的私有API密钥的想法。
首先,我了解到从理论上讲不可能在源代码中隐藏任何内容,因此我想出了另一个想法,但是我不确定它的合理性。无论如何,是否有可能以某种方式与Web服务器通信以验证私钥,然后再与应用程序对话以确认它是合法的握手?
我有两个密钥可以使用:一个公共密钥(顾名思义,不必像对待私有密钥一样小心对待),以及一个私有密钥,它需要与他人保持安全。
我将如何做到这一点的任何想法将不胜感激。
Answers:
总结一下:
防止损害此密钥的最佳方法是对其进行控制。这意味着永远不要将其部署在服务器上,在该服务器上,除了您之外的任何人都可以读取二进制文件,也不要通过您无法控制的通信链接。
最终,如果二进制文件不受您的控制,则二进制文件中的所有内容都将不受您的控制。同样,如果有人可以拦截流量,则他们可以捕获API密钥(即使您正在使用SSL,也有可能)。
我可以看到两种主要方法来完成此操作,这两种方法都不会在已部署的应用程序中包括您的私有API密钥:
这将需要与供应商建立一些额外的关系,您可以在其中获得密钥或让客户获得密钥。
实际上,例如对于使用Google Maps API的产品,这是相当普遍的。该软件的创建者在开发/运行其副本时会使用自己的密钥,但他们并未将其包含在软件中,而是要求您(作为安装该软件的用户)进入Google并获取您自己的API键。该软件仅具有配置选项以设置要使用的Google Maps API密钥。
实际上,许多签发API密钥的供应商都要求您以这种方式进行操作,因此无论如何您都可能走错了路,这可能是您根据供应商的服务条款和/或您可能与他们签订的任何法律合同。
设置代理API,您的应用程序在服务器上调用您的API,然后,您的API使用密钥调用供应商的API。
您可能需要对API进行其他保护,例如,确保仅您的应用程序正在使用它。这可以通过以下方式完成:
这里要记住的是,您可能不被允许这样做。您的供应商可能具有服务条款或法律合同,阻止您构建“聚合服务”或代理,因此您需要进行检查。
即使您的密钥没有受到破坏,如果您的一位客户正在做的事情导致供应商封锁您的密钥,您的所有客户也会突然被禁用,而您唯一的解决方法就是更新其他所有用户。
同样,如果您想阻止一个客户(例如,他们停止付款,盗版软件等),那么您必须在不向其他人发布更新然后禁用密钥的情况下才能这样做。
除了少数客户之外,任何其他人的后勤工作将很快变得站不住脚。
无论您是代理还是每个安装都有唯一的密钥,您都可以相对轻松地处理任何一种情况(对其他任何人几乎没有影响)。
尝试在将密钥嵌入到您的软件中时保护密钥最终是徒劳的。无论您做什么,任何有权访问二进制文件,源文件和/或通信通道并确定有足够能力掌握其关键点的攻击者都将能够这样做。
所以不要嵌入它。“唯一的制胜法宝是不参加比赛。”