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

13

我的应用程序使用 Google 地图 API 密钥与 Google 进行通信。我在 gradle 的 debug/release 配置中定义了这个 MAP_KEY,如下所示:

在我的应用程序中,我使用谷歌地图的API密钥与谷歌进行通信。我将这个MAP_KEY在gradle的debug/release配置中定义如下:

debug {
            buildConfigField 'String', 'BASE_URL', '"https://myweb.com"'
            buildConfigField 'String', 'SOCKET_URL', '"https://socket.myweb.com"'
            buildConfigField 'String', 'MAP_KEY', '"azaS****Ds"'
        }

如果有人从Google Play商店下载我的应用并对其进行反编译,那么他将获取到我的API令牌。这是真的吗?如果是,我该如何隐藏代码中的API密钥?

但如果有人从Google Play商店下载我的应用并对其进行反编译,那么他将获取到我的API令牌。这是真的吗?如果是,那么如何在代码中隐藏API密钥呢?


2
请查看此链接:https://rammic.github.io/2015/07/28/hiding-secrets-in-android-apps/ - user11212840
谢谢!我已经阅读了。所以除了仅在后端使用之外,我们没有任何好的隐藏密钥的做法吗? - Nastro
我建议使用NDK层来存储机密信息。从C++库中检索机密信息比从Java/Kotlin类中检索要困难得多。您可以使用https://github.com/nomtek/android-client-secrets库来实现。 - kkrol
我建议使用 NDK 层来存储密钥。从 C++ 库中检索密钥比从 Java/Kotlin 类中检索要难得多。您可以使用 https://github.com/nomtek/android-client-secrets 库来实现。 - kkrol
3
这回答解决了您的问题吗?存储和保护应用程序中私有API密钥的最佳实践 - mike47
1个回答

8

简短回答:

根据Google Map文档,对你的Google Map API密钥进行混淆或加密:

在使用地图Web服务API的移动应用程序中,考虑使用以下一项或多项技术进一步保护您的应用程序和API密钥:

  • 在API密钥上应用API限制。此操作将API密钥的范围缩小到与密钥相关联的API。
    混淆或加密API密钥。此操作直接从应用程序复杂化密钥获取尝试。

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

  • 使用代理服务器。

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

使用NDK教程

长回答:取决于情况

你无法在客户端防止代码被反编译,尤其是让硬编码字符串免受提取。

那么应该怎么做?

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

如果它太机密,泄漏将会对您造成许多问题,并且它很关键,您应该将其存储在服务器上,然后您应该向该服务器发出请求,该服务器将使用您的密钥或类似于JWT令牌的东西进行API调用。

就Google Map API而言,只要你正确地监视和配置它,泄露你的密钥将不会对你造成太多问题。


2
如果涉及到Google地图密钥,我们不必担心,因为在Google地图控制台中,我们指定了应用程序包ID,可以使用此令牌发送请求。对吗? - Nastro
1
@Nastro,这也可以被欺骗,但不够安全。这是另一种安全级别,但并不能完全保证安全。但至少它不允许其他Google Play合法应用程序使用您的API密钥。 - M4HdYaR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接