在我的应用程序中,我使用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商店下载我的应用并进行反编译,他将获得我的API令牌。这是真的?如果是,在我的代码中隐藏api键的方法是什么?
答案 0 :(得分:2)
根据Google Map Documentation混淆或加密您的Google map API密钥:
在使用Maps Web服务API的移动应用程序上,请考虑以下一种或多种技术,以进一步保护您的应用程序和API
按键:
在API密钥上应用API限制。此操作将API密钥的范围缩小到您与该密钥关联的API。
混淆或加密API密钥。此操作会使密钥变得复杂
直接从应用程序中抓取尝试。使用CA固定或证书固定来验证服务器资源是否有效。 CA固定检查服务器的证书 由受信任的证书颁发机构颁发,可以防止 中间人攻击可能会导致第三方 发现您的API密钥。证书固定进一步 提取并检查服务器中包含的公钥 证书。固定对于移动客户端进行通信很有用 直接与Google服务器以及移动客户端一起使用 与开发者自己的代理服务器进行通信。
- 使用代理服务器。
您可以使用许多加密或混淆方法,通过快速搜索即可轻松找到它们。一种常见的方法是将C ++中的密钥作为库进行base64编码,并仅在Java类中调用函数来使用它,因为C ++编译后的代码比Java类更难反编译。
您不能在客户端做任何事情来证明您的代码不被反编译,并特别使一个硬编码的字符串免于提取。
那你应该怎么做?
这是一个折衷,首先,您应该看到您的密钥对您来说很重要,谁会尝试访问它以及他花多少时间来破解您的应用程序。借助加密或模糊处理,我们只会变得更加困难,因此,我们需要更多的专业人士和更多的时间来对其进行破解(基本上,我们在其中添加的每一层安全性都在这样做。)
如果它太机密,如果泄漏会给您造成很多问题,并且至关重要的是,您应该将其存储在服务器中,然后您应该请求该服务器,并且该服务器将使用您的密钥或类似的东西进行API调用JWT令牌。
但是如果使用Google Map API,只要您对其进行监控和正确配置,则泄漏密钥不会给您带来很多问题。