【问题标题】:How to hide API Keys in AndroidManifest.xml如何在 AndroidManifest.xml 中隐藏 API 密钥
【发布时间】:2020-04-15 19:36:36
【问题描述】:

我刚刚为 Flutter 启动了 Google Maps plugin,它要求我将生成的 API 密钥插入到 android/app/src/main/AndroidManifest.xmlAndroidManifest.xml 文件中。片刻之后,我将它提交到我的仓库并立即收到来自 Google 和 Git 的警告,要求更改生成新密钥等(不知道你不应该这样做,所以我现在很清楚)。

之后,我开始寻找隐藏 API 密钥的方法。一种解决方案是使用Flutter Secure Storage plugin,但这只有助于(我认为)在.dart 文件中。另一种是创建一个单独的文件并将其添加到 .gitignore 但是当我构建 APK 时,该文件不会被捆绑吗?

理想情况下,我想发布它,但我不希望密钥易于访问,那么如何在不使用纯文本的情况下将 API 密钥加载到 AndroidManifest.xml 文件中?我想避免使用后端,所以我想我可以手动散列它,然后在运行时取消散列,但我仍然不知道如何动态更改 AndroidManifest.xml 文件。

【问题讨论】:

  • 不是直接在应用程序中为 3rd 方 api 定位这些服务包装器,而是考虑一个不同的拓扑,其中位于服务器上的服务与应用程序分开。它的工作量更大,但由于您控制服务器,因此没有任何关于密钥的安全问题。
  • @RobertRowntree 我确实说过我想避免使用后端,即服务器。我知道可以通过 firebase 实现,但我仍在寻找替代方案

标签: android security flutter api-key


【解决方案1】:

您无法混淆存储在 Manifest 中的密钥,因为存储的(静态)值将由 Google Maps API 本身直接使用。为了保护您的密钥,请考虑在您的 GCP 控制台中添加限制,以便只有授权的客户端才能使用您的密钥。

查看此链接了解更多详情:https://developers.google.com/maps/documentation/android-sdk/get-api-key#restrict_key

以下是有关保护 API 密钥的最佳做法的更多信息: https://developers.google.com/maps/api-key-best-practices#api_key_table

【讨论】:

  • 如果我在 GCP 中限制密钥,这是否意味着我可以在生产环境中将它与我的 APK 捆绑在一起?
  • @S.Ramjit 是的,没错。只要您正确配置了限制,您就不必担心未经授权的使用。在 GCP 控制台中监控您的使用情况也是一种很好的做法。