如何在将分发给客户端的应用程序中保护 API 密钥

How to secure API keys in applications that will be distributed to clients

我正在构建一个使用双向身份验证的应用程序。我得到了 API 密钥和 API 秘密,但现在我很困惑。

我目前将我的 api 密钥和秘密存储在 .yml 文件中。但是我想分发 .app 代码,它最终会有 .yml 文件。

但是 .app 文件将包含 .yml 文件,这很糟糕,因为每个人都可以看到 API 密钥和 Secret。

如何存储 API 密钥和机密,以便我的应用程序可以在用户不看到的情况下访问密钥和机密?

答案取决于几个变量:

  1. 是否包含您的来源?
  2. 是否可以使用服务器为您调用API?如果是这样,您是否也可以对服务器发出的调用进行限制?
  3. 是否可以选择在存储密钥的位置使用编译代码?如果是这样,是否可以混淆它?

以下是我根据经验针对不同场景提出的建议:

源代码不包括在内,使用服务器是一个选项,可以应用限制,但是使用编译代码不是一个参数

然后使用服务器发出请求。假设您需要调用 example.com/api/v1,并且您想要使用一组特定的参数调用特定的函数,那么您只能允许对特定的 API 的请求,以及特定的参数集参数,以及那个特定的函数。这样一来,它对潜在的攻击者没有任何意义,因为它只调用一个函数,没有别的。

不包括源代码,使用服务器不是一个选项,编译后的代码也不是一个选项

好吧,您无能为力,混淆视听是您的最佳选择。做这样的事情最好的方法是把它隐藏在你的代码深处,让它变得模糊,等等,等等,

包含源代码,使用服务器不是一种选择,但您可以使用编译后的代码

使用真正混淆的程序集,如果可以,请不要共享其源代码。例如,你可以有红鲱鱼指令,就像以前一样,你应该把它隐藏在你的代码深处。

不包括源代码,使用服务器不是一种选择,但您可以使用编译后的代码

这点与上面相同,因为不会包含程序集的源代码

如果我没有在这里列出您的情况,请随时发表评论,我会编辑我的答案

虽然我认为现有答案在技术上是正确的,但指出在分布式软件中硬编码 api 密钥存在一些安全问题可能令人愤怒。

API 密钥的性质是易变的,并非旨在永久保存。

如果 API 密钥失效会怎样?那会不会使所有分布式软件都变得无用? 如果 API 密钥具有写入权限并遭到破坏,会发生什么情况?您如何区分合法和恶意写入?

尽管我理解开销,但如果最终用户可以设置专用密钥(由最终用户自己获取)以及替换初始密钥的方法,将有助于解决上述两个问题。

其中一个API关键功能是被代表用户的机器使用,但如果所有用户都是一样的,这个功能就变得毫无意义。