【问题标题】:How to secure API keys in applications that will be distributed to clients如何保护将分发给客户端的应用程序中的 API 密钥
【发布时间】:2021-03-16 17:19:52
【问题描述】:

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

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

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

如何存储 API 密钥和 Secret,以便我的应用程序可以访问密钥和密钥,而用户不会看到?

【问题讨论】:

  • 这里的答案似乎集中在已编译的应用程序上。是的,有些可以应用于 Ruby 或 Python 脚本。例如,我可以设置一个单独的服务器来保存密钥并通过它路由请求;但是,对于没有任何外部基础设施的 200 行脚本来说,这似乎有点过头了。

标签: python api api-key


【解决方案1】:

答案取决于几个变量:

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

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

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

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

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

好吧,您无能为力,混淆是您的最佳选择。执行此类操作的最佳方法是将其隐藏在代码的深处,并使其变得晦涩,等等,等等,等等,

源已包含,不能使用服务器,但可以使用编译后的代码

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

不包括源代码,不能使用服务器,但可以使用编译后的代码

为此它与上面相同,因为不会包含程序集的源

如果我没有在此处列出您的方案,请随时发表评论,我将编辑我的答案

【讨论】:

  • 我正在考虑一个 200 行的 ruby​​ 脚本(可能作为 gem 发布)。因此 (1) 包含源代码,(2) 使用服务器不是一个实用的选项(程序不够大/不够复杂,(3) 使用编译的代码也不实用(它会比脚本本身更复杂) )。
  • 嗯,真的帮不了你。
【解决方案2】:

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

API 密钥的性质是易变的,它并非旨在永远持续下去。

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

尽管我了解开销,但最终用户可以设置由最终用户自己获得的专用密钥以及替换该初始密钥的方法的场景将有助于解决上述两个问题。

其中一个 API Key 功能将由代表用户操作的机器使用,但如果所有用户都相同,则此功能变得毫无意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2011-06-11
    相关资源
    最近更新 更多