如果我将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;
谢谢!
答案 0 :(得分:0)
您知道如何消除此警告吗?
可能是因为您的代码中已硬编码了GCP 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。
将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
,它就不会被您的存储库跟踪。
打开您的app/build.gradle
并添加app/src/main/cpp/.gitignore:
externalNativeBuild {
cmake {
cppFlags ""
}
}
为了能够在运行时获取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攻击。