如何在 Flutter 中存储 API 密钥(2020 年 7 月)

Posted

技术标签:

【中文标题】如何在 Flutter 中存储 API 密钥(2020 年 7 月)【英文标题】:How to store API keys in Flutter (July 2020) 【发布时间】:2020-11-21 10:03:12 【问题描述】:

现在是 2020 年 7 月。

悬而未决的问题是:如果我的 Flutter 应用程序需要秘密字符串才能运行,比如 API 密钥,那么什么策略可以防止恶意方从已发布的应用程序中提取此 API 密钥?

我发现了一些关于这个主题的讨论线索,但似乎没有一个答案。

使用flutter_secure_storage

我认为这行不通。我可以使用它来将 用户输入 传递给 Keychain/Keystore,它将永远保持安全。但是除非我亲自在我的应用程序的每个安装中键入 API 密钥,否则它不能用于存储 API 密钥......如果 API 密钥不在代码/资产中

将 API 密钥存储在后端服务器上,仅将结果传递给应用

嗯,这只是通过额外的步骤产生了同样的问题。 我的供应商 API 密钥现在在我的后端服务器上是安全的。但是我用来监管来自后端服务器的数据请求的“关键”是什么……嗯,这需要在颤振代码/资产中

使用 Firebase 远程配置

firebase 说不要那样做:

不要将机密数据存储在远程配置参数键或 参数值。可以解码任何参数键或 存储在项目的远程配置设置中的值。

好的,这是我认为行不通的几种方法。 真的有有效的策略吗?

【问题讨论】:

【参考方案1】:

我有一些解决方案。

    让它更难理解 -

将您的 API 密钥拆分为多个字符串。将它们存储在随机位置并在调用时以非常复杂的方式将它们组合起来。简而言之,让您的代码变得难以理解。

    将您的 API 密钥存储在 Firestore 中 -

将您的 API 密钥存储在文档中,并在进行 API 调用时检索它。

(..我认为这是一个更好的方法)

让我知道你的想法。 :)

【讨论】:

:) 有用吗??【参考方案2】:

回复以上内容。

我个人不知道反编译 .apk 的效果如何。但是那里有数百万人,有些人可能非常擅长这一点。就我个人而言,我假设“最坏的情况”有人可以获得我的颤振代码并在 android Studio 中运行它。

如果他们能做到这一点,不仅仅是“查看”反编译的代码,而是实际运行它,那么他们就可以在任何地方使用 print() 来学习像 api 密钥这样的秘密字符串。

我目前的解决方案: 我的项目涉及用户帐户。所以我结合了我原来帖子中的两个想法。

    api 密钥位于后端服务器上 从后端服务器获取数据的关键是用户输入的凭据。这样,运行我的颤振代码的“坏人”是有限的,他们能做的最好的事情就是创建一个帐户并使用该应用程序。我总是可以限制任何一个用户可以拨打的电话数量,以限制滥用,就像我在网站上所做的那样。

【讨论】:

这可行,但它增加了很多复杂性,用户可以进行身份​​验证,然后尝试在不同的上下文中使用或共享 api 密钥,除非您使此类密钥过期,这意味着您需要 API 密钥每个用户,以及每个请求的附加查询,因此在某种程度上,您只是在 JWT 或其他身份验证机制之上添加基于令牌的身份验证。它仍然不会阻止某人创建自己的 API 客户端。【参考方案3】:

切勿在客户端存储 API 密钥!

为什么?让我们看看如何“安全”地在客户端存储它们。

使用secure_storage 加密存储的 api 密钥(之后需要解密)

获取客户端中存储的api密钥的方法数:

RootJailbreak 您的设备以访问安全存储 对您的应用进行逆向工程以了解如何解密加密密钥

该怎么做:

将您的 api 密钥存储在安全环境中,例如云功能或您自己的服务器。您可以创建自己的 rest api,将请求发送到目标 api。另一个优点是它允许您对用户每天可以发出的请求数量进行速率限制,从而降低 api 成本。

【讨论】:

【参考方案4】:

正如其他人所提到的,您可以将 API 密钥存储在 Cloud Functions 中,然后从这些部署的函数发出所有 HTTP 请求。

您还可以通过将这些函数创建为Callable Functions 来限制这些函数的使用,然后检查函数的调用者是否已通过您的 Firebase 项目的身份验证。

每当调用函数时,通过引用context 参数来检查调用者的身份验证状态。

 if(!context.auth)
      throw new functions.https.HttpsError('unauthenticated','This function must be called while authenticated');
    

总之:

    创建使用您的 API 密钥的可调用云函数 部署函数 当应用用户调用该函数时,检查他们的身份验证状态 如果用户已通过身份验证,请使用您的 API 密钥发出 HTTP 请求

【讨论】:

我喜欢使用Callable Functions 的想法,但检查context.auth 有必要吗?根据他们的文档The functions.https.onCall trigger automatically deserializes the request body and validates auth tokens.

以上是关于如何在 Flutter 中存储 API 密钥(2020 年 7 月)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 应用程序中获取 Google API 密钥

在 Flutter 中限制 Google Directions API 密钥

如何使用firebase更改flutter项目中的API KEY?

Flutter - 使用 API 密钥

Firestore,Flutter,Async:方法不等待异步方法完成

在 Flutter 应用程序的源代码管理中隐藏 Google Maps API 密钥