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