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

时间:2019-08-03 09:42:32

标签: android environment-variables api-key

在我的应用程序中,我使用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键的方法是什么?

1 个答案:

答案 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类更难反编译。

Tutorial of doing it with NDK

长答案:这取决于

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

那你应该怎么做?

这是一个折衷,首先,您应该看到您的密钥对您来说很重要,谁会尝试访问它以及他花多少时间来破解您的应用程序。借助加密或模糊处理,我们只会变得更加困难,因此,我们需要更多的专业人士和更多的时间来对其进行破解(基本上,我们在其中添加的每一层安全性都在这样做。)

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

但是如果使用Google Map API,只要您对其进行监控和正确配置,则泄漏密钥不会给您带来很多问题。