你知道如何摆脱这个警告吗?
可能是因为您的代码中硬编码了 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++ 代码来存储 API 密钥,利用 JNI interface它在引擎盖下使用NDK。
将 cpp 文件夹添加到您的应用中
将this folder 复制到您的应用程序的主文件夹,您应该在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 忽略。
配置 Gradle
打开您的app/build.gradle 并添加this code:
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 密钥时,只需像完成 here 一样检索它:
renderApiKeyForView(R.id.jni_value, stringFromJNI());
虽然在此演示应用程序中我只是在视图中呈现 API 密钥,但在生产应用程序中,您将使用 stringFromJNI() 将 API 密钥添加到请求标头。
结论
正如我在博文中提到的,当使用这种技术隐藏 API 密钥时,通过逆向工程检索 API 密钥并非不可能,但是一旦需要猜测工作以关联从解析二进制文件返回的字符串,则非常困难.
我相信在您应用此技术后,针对 Exposed GCP API 密钥的警告将会消失。请告诉我进展如何。
警告
虽然这种技术可以为您提供一定程度的逆向工程保护并解决您的警告问题,但它不会阻止攻击者通过执行中间人攻击来获取隐藏在您应用中的 API 密钥,正如我在另一篇博文中所解释的那样, 标题为Steal that API Key with a Man in the Middle Attack:
因此,在本文中,您将学习如何设置和运行中间人攻击,以拦截您控制的移动设备中的 https 流量,从而窃取 API 密钥。最后,您将了解如何缓解中间人攻击。