【发布时间】:2017-10-06 23:39:33
【问题描述】:
我对 ProGuard 有点失望。
我正在使用 Gradle 隐藏我的 Google MAP API KEYS。我也在这里阅读了这个问题Manage Google Maps API Key with Gradle in Android Studio
并做了同样的事情。如果您遵循此问题中接受的答案,您的 api 密钥将不会被 ProGuard 混淆。问题是为什么?
有两个很好的答案。一个使用 ManifestPlaceHolder,一个使用 @string
不过,如果我反编译我的应用程序,仍然可以看到我的天气 api 密钥。
我正在使用private String myweatherapikey = BuildConfig.MY_API_WEATHER_KEY;,令人惊讶的是(以一种糟糕的方式)ProGuard 不会混淆这一点,即使在使用 Gradle 时也是如此。
当您进行逆向工程时,它看起来像private String myweatherapikey ="MY KEY IN PLAIN TEXT";
我一直在尝试混淆我的密钥,但没有任何效果,即使使用 Gradle。 你如何隐藏你的钥匙?当你反编译我的应用程序时,我所有的密钥都是公开的,这让我很恼火。
第二个问题:我认为隐藏你的 google maps api 密钥是不可能的。有 2 个键,一个用于发布版本,一个用于调试版本。它们都存储在 src/debug 和 src/release 中。你不能隐藏这个,对吧?
【问题讨论】:
-
“ProGuard 不会混淆这一点真是太神奇了(以一种糟糕的方式)”——请指出,在 Android 文档或 ProGuard 文档中,它说资源或字符串加密是 ProGuard 功能.
-
@CommonsWare 我知道。但它不起作用。我通过使用 Gradle 来使用最高的“安全性”。没有什么可以做的了(有吗?!)我不明白
private String myweatherapikey = BuildConfig.MY_API_WEATHER_KEY;是如何不被混淆的。 -
“但它不起作用”——那是因为它不是 ProGuard 的功能。 “没有什么可以做的了(有吗?!)”——就 Maps V2 API 密钥而言,任何人都无法使用它,所以我不确定你为什么担心。就个人而言,我认为第三方 Web 服务是一个实现细节,因此尝试仅从服务器而不是客户端使用它们。也欢迎您关注 DexGuard(ProGuard 的增强商业版)及其竞争对手。
-
@CommonsWare 感谢您的建议。也许你可以通过告诉我一些事情来消除我的担忧。当我在 Google Developer Console 中生成我的 Google Maps Api Key 时,我添加了我的包名和 SHA-1 指纹。这个 api 密钥只属于这个唯一的 SHa-1 指纹和我的包名,对吗?就像,如果有人在他们的应用程序中使用我的谷歌地图 api 密钥,它将无法工作,因为他没有相同的 sha-1 指纹。我的逻辑对吗?
-
"这个 api 密钥只属于这个唯一的 SHa-1 指纹和我的包名,对吗?" - 正确的。 “比如,如果有人在他们的应用程序中使用我的 google map api 密钥,它将无法正常工作,因为他没有相同的 sha-1 指纹。” - 正确的。我不知道任何人都可以使用该 API 密钥做任何事情。