如何在 Android 应用程序中隐藏 API 密钥?

Nas*_*tro 9 android environment-variables api-key

在我的应用程序中,我使用谷歌地图 api 密钥与谷歌通信。我在 gradle 调试/发布配置中定义了这个 MAP_KEY,如下所示:

debug {
            buildConfigField 'String', 'BASE_URL', '"https://myweb.com"'
            buildConfigField 'String', 'SOCKET_URL', '"https://socket.myweb.com"'
            buildConfigField 'String', 'MAP_KEY', '"azaS****Ds"'
        }
Run Code Online (Sandbox Code Playgroud)

但是如果有人从谷歌游戏商店下载我的应用程序并反编译它,他将获得我的 API 令牌。这是真的?如果是,在我的代码中隐藏 api 密钥的方法是什么?

M4H*_*YaR 5

简短的回答:

根据谷歌地图文档混淆或加密你的谷歌地图 API 密钥:

在使用 Maps Web Service API 的移动应用程序上,请考虑采用以下一种或多种技术来进一步保护您的应用程序和 API
密钥:

  • 对 API 密钥应用 API 限制。此操作将 API 密钥的范围缩小到您与该密钥关联的 API。
    混淆或加密 API 密钥。此操作使
    直接从应用程序进行的密钥抓取尝试变得复杂。

  • 使用 CA 固定或证书固定来验证服务器资源是否有效。CA 锁定检查服务器的证书是否由受信任的证书颁发机构颁发,并防止可能导致第三方发现您的 API 密钥的中间人攻击。通过提取和检查服务器证书中包含的公钥,证书锁定更进一步。固定对于直接与 Google 服务器通信的移动客户端以及与开发人员自己的代理服务器通信的移动客户端非常有用。

  • 使用代理服务器。

您可以使用许多加密或混淆方法,只需快速搜索即可轻松找到,一种常见方法是将 C++ 中的密钥作为库进行 base64 编码,并使用它只需调用 Java 类中的函数,因为 C++ 代码在编译后比 Java 类更难反编译。

使用 NDK 进行操作的教程

长答案:这取决于

您无法在客户端做任何事情来证明您的代码不会被反编译,并特别使一个硬编码的字符串免于被提取。

那么你应该怎么做?

这是一个权衡,首先你应该看看你的密钥对你有多重要,谁会尝试访问它,以及他花多少时间来破解你的应用程序。使用加密或混淆,我们只会让它变得更难,所以我们需要更多专业的人有更多的时间来破解它(基本上我们添加的每一层安全都是我们正在做的。)

如果它太秘密并且如果它泄漏会给您带来很多问题,那么您应该将其存储在服务器中至关重要,然后您应该向该服务器请求,该服务器将使用您的密钥或类似 JWT 令牌的东西进行 API 调用.

但是对于Google Map API,只要您对其进行监控并正确配置它,泄漏您的密钥不会给您带来很多问题。

  • 如果是 Google 地图密钥,我们可以不用担心,因为在 Google 地图控制台中,我们指定了可以使用此令牌发送请求的应用程序包 ID。正确的? (2认同)