如何在 Android 应用程序中隐藏 API 密钥? [复制]
Posted
技术标签:
【中文标题】如何在 Android 应用程序中隐藏 API 密钥? [复制]【英文标题】:How to hide API keys in Android application? [duplicate] 【发布时间】:2019-12-11 17:04:12 【问题描述】:在我的应用程序中,我使用 google maps api 密钥与 google 进行通信。我在 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"'
但如果有人从 google play store 下载我的应用程序并对其进行反编译,他将获得我的 API 令牌。这是真的?如果是,在我的代码中隐藏 api 密钥的方法是什么?
【问题讨论】:
查看此链接:rammic.github.io/2015/07/28/hiding-secrets-in-android-apps 谢谢!我读。所以除了只在后端使用之外,我们没有任何好的做法来隐藏密钥? 我建议使用 NDK 层来存储秘密。从 C++ 库中检索秘密要比从 Java/Kotlin 类中检索秘密要困难得多。您可以为此使用 github.com/nomtek/android-client-secrets 库。 我建议使用 NDK 层来存储秘密。从 C++ 库中检索秘密要比从 Java/Kotlin 类中检索秘密要困难得多。您可以为此使用 github.com/nomtek/android-client-secrets 库。 这能回答你的问题吗? Best practice for storing and protecting private API keys in applications 【参考方案1】:简答:
根据Google Map Documentation 混淆或加密您的谷歌地图 API 密钥:
在使用地图网络服务 API 的移动应用上,考虑采用以下一种或多种技术来进一步保护您的应用和 API 键:
对 API 密钥应用 API 限制。此操作将 API 密钥的范围缩小到与密钥关联的 API。 混淆或加密 API 密钥。此操作使密钥复杂化 直接从应用程序中抓取尝试。
使用 CA 固定或证书固定来验证服务器资源是否有效。 CA pinning 检查服务器的证书 由受信任的证书颁发机构颁发,并防止 可能导致第三方的中间人攻击 发现您的 API 密钥。证书固定更进一步 提取并检查服务器中包含的公钥 证书。固定对于移动客户端通信很有用 直接与谷歌服务器以及移动客户端 与开发者自己的代理服务器通信。
使用代理服务器。
您可以使用许多加密或混淆方法,只需快速搜索即可轻松找到,一种常见方法是将 C++ 中的密钥作为库进行 base64 编码,并使用它只需调用 Java 类中的函数,因为 C++编译后的代码比你的Java类更难反编译。
Tutorial of doing it with NDK
长答案:视情况而定
你不能在客户端做任何事情来证明你的代码不会被反编译,并且特别是让一个硬编码的字符串不会被提取。
那么你应该怎么做?
这是一个权衡,首先你应该看看你的密钥对你有多重要,谁会尝试访问它,以及他花费多少时间来破解你的应用程序。通过加密或混淆,我们只会让它变得更难,所以我们需要更多的专业人士有更多的时间来破解它(基本上,我们添加的每一层安全性我们都在这样做。)
如果它太秘密并且如果它的泄漏会给您带来很多问题,并且您应该将它存储在服务器中,那么您应该向该服务器请求并且该服务器将使用您的密钥或类似的东西进行 API 调用一个 JWT 令牌。
但是如果是Google Map API,只要你监控它并正确配置它,泄露你的密钥不会给你带来很多问题。
【讨论】:
如果是 Google Map 密钥,我们不必担心,因为在 Google Map 控制台中,我们指定了可以使用此令牌发送请求的应用程序包 ID。对吗? @Nastro 这也可以被欺骗,但还不够,这是另一个安全级别,但它并不能使其完全安全。但至少它不允许其他 google play 合法应用程序使用您的 API 密钥。以上是关于如何在 Android 应用程序中隐藏 API 密钥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Youtube Player android API 中隐藏控件、全屏按钮?
Android Management API - Kiosk 模式下的单个应用程序 - 如何隐藏状态和导航栏?