android - 尽管我将 api 密钥限制为 android 特定应用程序,但仍收到暴露的 GCP API 密钥警告
问题描述
如果我将我的 api 密钥限制为提供包名称和 SHA-1 签名证书指纹的 android 应用程序,我收到了关于 Exposed GCP API 密钥的警告。
你知道如何摆脱这个警告吗?
我阅读了 GCP 最佳实践,他们说可以限制 android 应用程序提供包名称和 SHA-1 签名证书指纹,但警告仍然存在。
我正在使用这样的地图静态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 密钥,通过利用JNI 接口使用引擎盖下的NDK 。
将 cpp 文件夹添加到您的应用程序
将此文件夹复制到您的应用程序的主文件夹中,您应该在app/src/main/cpp
.
现在将文件api_key.h.example复制到api_key.h
. 之后编辑该文件并在其中添加 GPC 的 API 密钥"place-the-api-key-here"
。
注意:一旦在app/src/main/cpp/.gitignore
api_key.h
中列出被 git 忽略的文件,您的存储库将不会跟踪该文件。
配置 Gradle
打开您的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 密钥并非不可能,但是一旦需要进行猜测工作以关联从解析二进制文件返回的字符串,则非常困难。
我相信在您应用此技术后,针对 Exposed GCP API 密钥的警告将会消失。请让我知道进展如何。
警告
虽然这种技术可以为您提供一定程度的逆向工程保护并解决您的警告问题,但它不会阻止攻击者通过执行 MitM 攻击来获取隐藏在您的应用程序中的 API 密钥,正如我在另一篇题为“窃取”的博文中解释的那样该 API 密钥与中间人攻击:
因此,在本文中,您将学习如何设置和运行中间人攻击,以拦截您控制的移动设备中的 https 流量,从而窃取 API 密钥。最后,您将了解如何缓解中间人攻击。
推荐阅读
- android - 每次迭代内的Android延迟循环
- ionic-framework - Ionic 4 - 如何创建 SCSS 自定义 mixin
- java - 使用 JavaFx,如何仅在填充内更改面板背景颜色?
- haskell - 打印浮点数时从“Just 0.631”中删除“Just”
- sql - 在 PostgreSQL 中,选择会计年度月份格式作为日期列
- sql-server - 将 SQLite 整数导出为 DateTime
- ansible - 当我执行剧本时,出现以下错误
- cucumber - 使用 Selenide/Cucumber 重新运行失败的场景 - 没有 rerun.txt 文件
- apache-spark - 在 Spark 上部署 Keras 模型
- c++ - cef 和 SDL2 的触摸事件的一些问题