Sme*_*eet 20 android google-cloud-platform
我的密钥受程序包名称和SHA1限制,但Google Play商店仍显示此警告。
知道为什么它会这样显示。我在build.gradle文件中定义了我的API密钥,并从那里开始使用它。
根据谷歌的建议,设置限制,例如指定包名称和 SHA-1 密钥是可行的方法。
这里已经解释了:https : //cloud.google.com/docs/authentication/api-keys#securing_an_api_key
现在,这里的问题是,无论您做什么,您的 API 密钥最终都会出现在代码库中,即,如果您在代码库之外(通过某些属性文件)指定它,但在构建阶段通过 BuildConfig 字段将其传入(整个密钥是对反编译您的代码的人可见,因为它现在是 BuildConfig 类文件的一部分),或者您将其拆分并在代码库中连接(拆分键仍然可见,任何人都可以通过查看用法来连接它们以从反编译的文件中获取最终键apk)。
拆分密钥版本将消除 Play Console 中的警告,但密钥仍然暴露。
因此,我建议的解决方案是对您的 API 密钥进行编码并将其传递到您的代码库中。就在使用它之前,您将其解码回来。
一个非常简单的例子可以是:
请使用更好的编码算法而不是这个,这仅用于演示目的。这里我们使用 Base64 编码。
import android.util.Base64
fun main() {
// API Key = "123456ABC"
val myEncodedApiKey = "MTIzNDU2QUJD" // Should be passed via BuildConfig
val decodedApiKey = Base64.decode(myEncodedApiKey, Base64.DEFAULT)
// Now use `decodedApiKey` in your codebase.
val decodedApiKeyString = String(decodedApiKey)
}
Run Code Online (Sandbox Code Playgroud)
为什么这样更好?
更新(使用 google-services.json 文件作为 API 密钥的说明):
使用 google-services.json 中的 API 密钥的解决方案不太有效。如果您连接您的 firebase 帐户,通常会生成 google-services.json 文件。此处定义的 API 密钥具有不同的限制模型。您在 GCP 项目中定义的那个是不同的,它允许您传入包名称和 SHA-1 密钥,并限制为特定类型的 API 访问,例如仅限 Youtube 访问。因此,如果您要使用 google-services.json 中的 API 密钥,那么您实际上并未使用您在 GCP 帐户中设置的限制。GCP 帐户不会生成 google-services.json 文件。
这里有一个来自谷歌的官方文档,用于设置使用 GCP 项目定义的 API 密钥的 Youtube API,在文档中,它提到直接将密钥放入代码中。(无论如何这是错误的,因为它被暴露了,但那是你的谷歌)。
https://developers.google.com/youtube/android/player/setup
在任何文档中都没有提到使用 google-services.json 文件来检索 API 密钥。
有 Google Play 广告吗?看来,至少从 2019 年 8 月 1 日起,触发此操作的 api 密钥已嵌入到完整的 google play 服务广告库中。那是 -
implementation 'com.google.android.gms:play-services-ads:18.1.1'
Run Code Online (Sandbox Code Playgroud)
触发警报,但是
implementation 'com.google.android.gms:play-services-ads-lite:18.1.1'
Run Code Online (Sandbox Code Playgroud)
它会删除游戏商店中已存在的一些代码,但不会。该错误本身引用了一个混淆的方法,我在 apk 中找到了该方法:
com/google/android/gms/internal/ads/[obfuscatedstring]/<clinit>()
Run Code Online (Sandbox Code Playgroud)
这似乎设置了一堆常量。其中之一称为gads:safe_browsing:api_key
以防万一我错了,而且这并不存在于每个人的代码中,我不会在这里重现它,但在我看来,它确实像可能触发问题的 GCP 密钥。它有 40 个字符,并且可以在 Internet 上的其他地方找到相同的密钥。
我的猜测是,如果您使用 play-services-ads 库(而不是 Firebase 库),它可能会看到此字符串并发出警报。
您可以通过将密钥分成 4 部分来消除此警告,如下所示
public static final String API_KEY_PART_1 = "Asdsdfdd-";
public static final String API_KEY_PART_2 = "dfsFdsdsFdd";
public static final String API_KEY_PART_3 = "Pgdhs_SfSfs";
public static final String API_KEY_PART_4 = "fdfDDSD";
Run Code Online (Sandbox Code Playgroud)
并通过连接字符串来使用它
.attest(nonce.getBytes(), Constants.API_KEY_PART_1+Constants.API_KEY_PART_2+Constants.API_KEY_PART_3+Constants.API_KEY_PART_4)
Run Code Online (Sandbox Code Playgroud)
注意:确保您的 API 密钥仅限于应用程序访问。否则,如果有人反编译您的 apk 并使用您的 api 密钥,那么可能会增加您的账单。
使用 SHA 和包名称限制您的 API 密钥,请单击此处了解详细信息