我收到了暴露的 GCP API 密钥的警告,如果我将我的 api 密钥限制为 android 应用程序,则提供包名称和 SHA-1 签名证书指纹。
你知道如何摆脱这个警告吗?
我阅读了 GCP 最佳实践,他们说可以对提供包名称和 SHA-1 签名证书指纹的 android 应用程序进行限制,但警告仍然存在。
我正在使用地图静态 api,如下所示:
https://maps.googleapis.com/maps/api/staticmap?center=" + coordinates +"&zoom=13&markers=" + coordinates + "&size=" + width + "x" + height + "&sensor=false" + "&scale=" + scale+"&key="+apiKey;
谢谢!
你知道如何摆脱这个警告吗?
可能是因为您在代码中硬编码了 GCP API 密钥。
如何隐藏 API 密钥
你知道如何摆脱这个警告吗?
前段时间,我写了一篇题为"如何通过静态二进制分析从移动应用程序中提取 API 密钥"的博客文章,其中我展示了开发人员用于将 API 密钥存储在移动应用程序中的几种方法,以及如何通过对 APK 进行逆向工程来提取它们:
我们将了解如何通过使用开源工具以有效和快速的方式对二进制文件进行逆向工程,从您的移动应用程序中获取该 API 密钥。一旦我们看到它是多么容易完成,我们就会意识到它甚至可以由非开发人员实现。
在本文中,我创建了存储库 android-hide-secrets,我将使用它向您展示如何隐藏 API 密钥,我们将利用本机C++代码来存储 API 密钥,方法是利用在后台使用 NDK 的 JNI 接口。
将 cpp 文件夹添加到应用
将此文件夹复制到应用程序的主文件夹,您应该在app/src/main/cpp
.
现在将文件api_key.h.example复制到api_key.h
。然后编辑文件并添加 GPC 的 API 密钥,其中显示"place-the-api-key-here"
.
注意:一旦文件
api_key.h
在 app/src/main/cpp/.gitignore 中被 git 列出以忽略,您的仓库就不会跟踪该文件。
配置格拉德尔
打开app/build.gradle
并添加以下代码:
externalNativeBuild {
cmake {
cppFlags ""
}
}
在运行时检索 API 密钥
为了能够在运行时获取 GPC API,只需将此代码添加到您的类中:
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
还有这段代码:
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
然后,当您需要API密钥时,只需像此处一样检索它:
renderApiKeyForView(R.id.jni_value, stringFromJNI());
在此演示应用中,我只是在视图中呈现 API 密钥,而在生产应用中,您将使用stringFromJNI()
将 API 密钥添加到请求标头。
结论
正如我在博客文章中提到的,当使用这种技术隐藏 API 密钥时,通过逆向工程检索 API 密钥并非不可能,但是一旦需要猜测工作来关联解析二进制文件返回的字符串,就很难了。
我相信在您应用此技术后,公开的 GCP API 密钥的警告将消失。请让我知道它是怎么回事。
警告
虽然此技术为您提供了一定程度的逆向工程保护,并可以解决您的警告问题,但它不会阻止攻击者通过执行 MitM 攻击来获取隐藏在您的应用程序中的 API 密钥,正如我在另一篇题为"窃取中间人攻击的 API 密钥"的博客文章中解释的那样:
因此,在本文中,您将学习如何设置和运行 MitM 攻击以拦截您控制下的移动设备中的 https 流量,以便您可以窃取 API 密钥。最后,您将在高层次上了解如何缓解 MitM 攻击。