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

时间:2020-07-31 14:32:11

标签: api flutter dart

现在是2020年7月。

悬而未决的问题是:如果我的flutter应用程序要求操作秘密字符串(例如API密钥),那么哪种策略可以阻止恶意方从已发布的应用程序中提取此API密钥?

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

使用flutter_secure_storage

我认为那没有用。我可以使用它来将用户输入传递到Keychain / Keystore,在那里它将永远保持安全。但是除非我亲自在每次安装的应用程序中键入API密钥,否则不能将其用于存储API密钥...在代码/资产中没有API密钥的情况下

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

好吧,这只会产生额外的步骤而产生相同的问题。 现在,我的供应商API密钥在我的后端服务器上是安全的。但是我用来监视后端服务器的数据请求的“关键”是什么……好吧,这需要在不稳定的代码/资产中

使用Firebase远程配置

firebase说不要这样做:

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

好,所以这是我认为不起作用的几种方法。 真的有行之有效的策略吗?

4 个答案:

答案 0 :(得分:0)

我有一些解决方案。

  1. 使其难以理解-

将您的API密钥拆分为多个字符串。.以非常复杂的方式将它们存储在随机位置,并在进行调用时将它们组合在一起。.简而言之,使您的代码复杂易懂。

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

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

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

莱姆知道你的想法。 :)

答案 1 :(得分:0)

回复以上。

我个人不知道反编译.apk有多有效。但是那里有数百万人,其中有些人可能非常擅长。就我个人而言,我假设“最坏的情况”是有人可以抓住我的颤动代码并在Android Studio中运行它。

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

我当前的解决方案: 我的项目涉及用户帐户。所以我要结合我原始帖子中的2个想法。

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

答案 2 :(得分:0)

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

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

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

获取客户端存储的api key的方法数:

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

该怎么做:

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

答案 3 :(得分:0)

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

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

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

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

总结:

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