尽管我将api密钥限制为特定于android的应用,但仍收到暴露的GCP API密钥警告

时间:2019-09-10 11:40:37

标签: android security mobile api-key android-security

如果我将api密钥限制为提供包名称和SHA-1签名证书指纹的android应用程序,则会收到有关“暴露的GCP API密钥”的警告。

您知道如何消除此警告吗?

我阅读了GCP最佳做法,他们说可以限制android应用程序的使用,以提供程序包名称和SHA-1签名证书指纹,但是警告仍然存在。

我正在像这样使用maps静态api:

https://maps.googleapis.com/maps/api/staticmap?center=" + coordinates +"&zoom=13&markers=" + coordinates + "&size=" + width + "x" + height + "&sensor=false" + "&scale=" + scale+"&key="+apiKey;

谢谢!

1 个答案:

答案 0 :(得分:0)

  

您知道如何消除此警告吗?

可能是因为您的代码中已硬编码了GCP API密钥。

如何隐藏API密钥

  

您知道如何消除此警告吗?

前一段时间,我写了一篇名为How to Extract an API Key from a Mobile App by Static Binary Analysis的博客文章,向我展示了开发人员用于在其移动应用中存储API密钥的几种方法,以及如何通过对APK进行反向工程来提取它们:

  

我们将看到如何使用开源工具以有效,快速的方式对二进制文件进行反向工程,从而从移动应用程序中获取该API密钥。一旦我们知道它可以完成的容易程度,我们就会意识到它甚至可以由非开发人员实现。

在本文中,我创建了存储库android-hide-secrets,并将使用它来向您展示如何隐藏API密钥,在这里我们将利用本地C ++代码通过利用{ {3}}在引擎盖下使用JNI interface

将cpp文件夹添加到您的应用程序

NDK复制到应用程序的主文件夹中,然后将其保存在app/src/main/cpp

现在将文件this folder复制到api_key.h。然后编辑文件,并在显示"place-the-api-key-here"的位置添加GPC的API密钥。

  

注意:一旦api_key.h.example中的git忽略了文件api_key.h,它就不会被您的存储库跟踪。

配置Gradle

打开您的app/build.gradle并添加app/src/main/cpp/.gitignore

externalNativeBuild {
    cmake {
        cppFlags ""
    }
}

在运行时获取API密钥

为了能够在运行时获取GPC API,只需将this code添加到您的课程中即可:

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

,还有this code

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

然后,当您需要API密钥时,只需像完成this code一样检索它即可:

renderApiKeyForView(R.id.jni_value, stringFromJNI());

在此演示应用程序中,我只是在视图中呈现API密钥,而在生产应用程序中,您将使用stringFromJNI()将API密钥添加到请求标头中。

结论

正如我在博客文章中提到的那样,当使用这种技术隐藏API密钥时,并非不可能通过逆向工程来检索API密钥,但是一旦猜测工作必须将解析二进制文件所返回的字符串相关联,这将非常困难。

我相信,在您应用此技术后,“公开GCP API密钥”警告将消失。请让我知道进展如何。

警告

虽然此技术可为您提供某种程度的保护以防逆向工程,并且可以解决警告问题,但它不会阻止攻击者通过执行MitM攻击来捕获隐藏在应用程序中的API密钥,正如我在另一篇博客文章中所解释的那样,标题为here

  

因此,在本文中,您将学习如何设置和运行MitM攻击以在您控制的移动设备中拦截https流量,以便您可以窃取API密钥。最后,您将在较高层次上看到如何缓解MitM攻击。