我们最近宣布,我们强化了 Play Integrity API 判定,使其速度更快、更不易受到攻击,并且更注重用户隐私,同时还进行了其他安全改进。
变更摘要
您可以在本文档后面找到变更的详细摘要和常见问题解答。2025 年 5 月的判定结果变更如下:
| 是什么 | 具体变化 | 预计影响* | 哪些设备 |
|---|---|---|---|
| 影响所有发出 Play Integrity API 请求的开发者的变更 | |||
| 设备判定响应:meets-device-integrity | 必须具有由硬件支持的、肯定的启动时验证判定 | 影响极小,因为 Play Integrity API 已在搭载 Android 13 或更高版本的设备上使用由硬件支持的安全信号(约 0.4%) | Android 13 及更高版本 |
| 应用完整性响应:应用识别判定 | 没有变化 | 影响极小,这将反映设备判定结果的变化(约 0.4%) | Android 13 及更高版本 |
| 账号详情响应:Play 许可判定 | 发出请求的应用必须由 Google Play 安装或更新 | 许可回答略有减少(约 2.5%) | Android 6 及更高版本 |
| 仅影响 Play 管理中心开发者和使用可选功能的 Play SDK 管理中心开发者的变更 | |||
| 设备判定响应:meets-basic-integrity | 必须具有 Android 平台密钥认证,但启动状态可以是已验证或未验证 | 基本回答略有减少(约 0.4%) | Android 13 及更高版本 |
| 设备判定响应:meets-strong-integrity | 必须在过去一年内进行过安全更新 | 强烈响应减少(约 14.5%) | Android 13 及更高版本 |
| 所有可选信号(设备属性除外)** | 发出请求的应用必须由 Google Play 安装或更新 | 包含可选信号的响应所占百分比下降(约 7%) | Android 13 及更高版本 |
*前面提到的所有预计影响百分比都是基于平均值,实际变化可能会有所增加或减少,具体取决于应用的安装量。
**可选信号(设备属性除外)包括:meets-basic-integrity、meets-strong-integrity、近期设备活动记录、设备回想(Beta 版)、Play 保护机制状态和应用访问风险。
常见问题解答
概览
什么是 Play Integrity API?
Play Integrity API 可通过获取设备、应用和用户相关信息,帮助您评估用户应用环境的可信度,以便您检测和应对潜在的滥用行为和攻击。
Play Integrity API 提供哪些信号?
Play Integrity API 包含请求应用的身份、请求应用是否由 Google Play 安装,以及设备是否为正版且经过认证的 Android 设备。这些信号默认提供。您可以在应用的后端服务器上读取这些信号,并决定应用是否应做出响应以及如何响应。Google Play 开发者可以选择在 Play 安装中接收更多信号,以查看更多信息。
什么是 Android 平台密钥认证?
Android 平台密钥认证允许应用验证设备的状态,并获取由硬件提供支持的启动完整性的强信号。它依赖于 Google 在设备的由硬件支持密钥库中预配的密钥。Play Integrity API 已经使用密钥认证在某些设备上获取由硬件支持的安全信号,现在将在所有搭载 Android 13 或更高版本的设备上更深入地集成这些信号。
判定变更
在搭载 Android 13 或更高版本的设备上,Play Integrity API 判定结果发生了哪些变化?
Play Integrity API 现在要求所有完整性判定都必须使用由硬件支持的安全信号:
meets-device-integrity设备识别判定结果表明,运行应用的设备是经过认证的正品 Android 设备。此判定结果要求设备引导加载程序处于锁定状态,并且加载的 Android OS 是经过认证的设备制造商映像。meets-strong-integrity设备识别判决表示设备是正品且经过认证的 Android 设备,并已安装最新的安全更新。此判定结果要求meets-device-integrity和过去一年内针对设备的所有分区(包括 Android OS 分区补丁和供应商分区补丁)的安全更新。此条件将来可能会发生变化。meets-basic-integrity设备识别判定结果表明检查是在实体 Android 设备上进行的。设备引导加载程序可以处于锁定或解锁状态,启动状态可以是已验证或未验证。该设备可能未经认证,在这种情况下,Google 无法提供任何安全性、隐私性或应用兼容性保证,也无法保证该设备不会充当代理(例如 Android 虚拟实例的代理)。这也意味着,只要存在密钥认证,已取得 root 权限的设备也可以返回meets-basic-integrity。
这些变更不会影响 Play 游戏电脑版上的 Play Integrity API,该 API 将继续返回 meets-virtual-integrity。
为什么在搭载 Android 13 或更高版本的设备上,Play Integrity API 判定结果发生了变化?
在 Android 12 及更低版本上,Play Integrity API 部分使用由硬件支持的安全信号。通过在 Android 13 及更高版本上要求由硬件支持的安全机制,Play Integrity API 判定机制能够更有效地抵御攻击者,为应用提供更出色的性能,并为用户提供更强大的隐私保护。在搭载 Android 13 或更高版本的设备上,开发者可以期待以下改进:
- 在 Google 服务器上生成默认判定结果时,需要收集和评估的设备信号减少了约 90%。可选信号仍需要收集其他信号。
- 对于最坏情况下的标准请求,判定延迟时间最多缩短 80%;对于所有经典请求,获取默认判定的延迟时间最多缩短 80%。 可选信号可能会增加延迟时间。
- 为所有支持密钥认证的 Android 设备类型(包括手机、平板电脑、可折叠设备、电视、车载设备、Wear OS 和 ChromeOS)提供一致的可靠性和支持。
- 设备识别判定中的每个设备标签之间有更大的差异:
meets-strong-integrity、meets-device-integrity和meets-basic-integrity。
Play 游戏电脑版上的 Play Integrity API 判定机制不会发生变化,在 Android 12 及更低版本上与在 Android 13 及更高版本上保持一致。
如何更新应用的后端逻辑,以便在完整性判定中考虑 Android SDK 版本?
如果您想在应用的后端服务器上根据 Android SDK 版本使用不同的逻辑,可以使用判定中的新设备属性字段。以下示例展示了如何执行此操作:
Kotlin
val deviceIntegrity =
JSONObject(payload).getJSONObject("deviceIntegrity")
val sdkVersion =
if (deviceIntegrity.has("deviceAttributes")) {
deviceIntegrity.getJSONObject("deviceAttributes").getInt("sdkVersion")
} else {
0
}
if (sdkVersion >= 30) {
// Provide Android R+ specific experience to the user.
}
Java
JSONObject deviceIntegrity =
new JSONObject(payload).getJSONObject("deviceIntegrity");
int sdkVersion =
deviceIntegrity.has("deviceAttributes")
? deviceIntegrity.getJSONArray("deviceAttributes").getInt("sdkVersion")
: 0;
if (sdkVersion >= 30) {
// Provide Android R+ specific experience to the user.
}
如何在所有 Android SDK 版本中使用旧版 meets-strong-integrity 标签定义?
为此,您可以更新应用的后端逻辑,以便在判定中包含 Android SDK 版本的新设备属性字段,从而在设备搭载 Android 13 之前版本时使用 meets-strong-integrity,在设备搭载 Android 13 或更高版本时使用 meets-device-integrity。以下是执行此操作的示例:
Kotlin
val deviceRecognitionVerdict =
if (deviceIntegrity.has("deviceRecognitionVerdict")) {
deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString()
} else {
""
}
val deviceIntegrityToCheckFor =
sdkVersion < 33 ? "MEETS_STRONG_INTEGRITY" : "MEETS_DEVICE_INTEGRITY";
if (deviceRecognitionVerdict.contains(deviceIntegrityToCheckFor)) {
// Looks good!
}
Java
JSONObject deviceIntegrity =
new JSONObject(payload).getJSONObject("deviceIntegrity");
String deviceRecognitionVerdict =
deviceIntegrity.has("deviceRecognitionVerdict")
? deviceIntegrity.getJSONArray("deviceRecognitionVerdict").toString()
: "";
String deviceIntegrityToCheckFor =
sdkVersion < 33 ? "MEETS_STRONG_INTEGRITY" : "MEETS_DEVICE_INTEGRITY";
if (deviceRecognitionVerdict.contains(deviceIntegrityToCheckFor)) {
// Looks good!
}
由于设备属性字段也是由硬件支持的信号,因此在搭载 Android 13 及更高版本的设备上最为可靠。
还做出了哪些其他判定更改?
我们不断投入资源,提高 Play Integrity API 中现有信号的可靠性,并定期推出新功能,帮助开发者应对新出现的威胁和新的应用场景。我们还做出了其他一些判定改进,包括:
- Play 许可响应:为了返回 Play 许可响应,Play Integrity API 现在始终要求提出请求的应用必须通过 Google Play 进行安装或更新。这修复了一些极端情况,并使开发者更容易解读响应。
- 可选信号可用性:对于使用 Google Play 管理中心或 Play SDK 管理中心的开发者,所有可用的可选信号(设备属性除外)现在都要求请求应用由 Google Play 在 Android 13 或更高版本上安装或更新。这包括
meets-strong-integrity、meets-basic-integrity、近期设备活动记录、设备回想(Beta 版)、应用访问风险判定和 Play 保护机制判定。我们对所有其他 Play Integrity API 请求进行了标准化,以便接收设备检查(仅带有meets-device-integrity标签)、安装程序检查、应用完整性检查和设备属性(如果已启用)。 - 针对特定设备的判定变更:Play Integrity API 会在更多场景中自动更改设备判定,以便在所有 Android SDK 版本中更早地保护应用,例如当有证据表明存在过度活动或密钥泄露时。这包括当硬件支持的信号不可用时,Play 能够回退到其他信号,为用户生成临时设备判定结果。建议开发者使用应用内 Play 修复对话框或引导用户前往 Play 商店应用来解决完整性判定问题。随着时间的推移,这些对话框将处理更多场景,并包含针对用户的具体指导,根据其特定设备或账号告知他们需要修复的问题。
如何报告完整性判定方面的问题?
如需报告 Play Integrity API 响应的问题(无论是历史判定还是新判定),请按照支持页面上的说明操作。
可用性
Play Integrity API 需要满足哪些条件才能正常运行?
Play Integrity API 要求在设备上安装 Google Play 商店和 Google Play 服务,包括搭载 Android 的设备和 Google Play 游戏电脑版。传统请求需要 Android 4.4(API 级别 19)或更高版本,标准请求需要 Android 5.0(API 级别 21)或更高版本。在搭载 Android 13(API 级别 33)及更高版本的设备上,Play Integrity API 现在将在所有支持密钥认证的 Android 设备规格(包括手机、平板电脑、可折叠设备、电视、汽车、Wear OS 和 ChromeOS)上提供相同水平的可靠性和支持。
为什么 Play Integrity API 会针对不同设备给出不同的判定结果?
Play Integrity API 提供多种设备判定,以适应具有不同用例和风险承受能力的开发者,并使分层强制执行策略成为可能。例如,当应用和设备更可信时,开发者可能会简化用户验证步骤;而当设备未知时,开发者可能会要求在执行受保护的操作或敏感操作之前进行额外的用户验证。这可能是减少滥用和攻击的有效方法。
什么是经过认证的 Android 设备?
经过认证的 Android 设备(也称为已获得 Play 保护机制认证的 Android 设备)是指运行可预测软件的设备,这些软件已通过数百项 Google 兼容性测试,遵循 Android 安全和权限模型,并且随附 Google Play 保护机制反恶意软件功能套件。当 Play Integrity API 能够验证设备是正版且经过认证的 Android 设备时,它会在设备识别判定中返回 meets-device-integrity 响应。
什么是 meets-basic-integrity 设备?
Play Integrity API 还会返回设备判定中的可选响应 meets-basic-integrity。如果设备仅返回 meets-basic-integrity 判定结果,而未返回 meets-device-integrity 或 meets-strong-integrity,则表示 Android 操作系统无法验证,但存在密钥认证。这表示检查是在实体 Android 设备上进行的,但 Google 无法保证该设备的安全性、隐私性或应用兼容性,也无法保证该设备未充当代理(例如 Android 虚拟实例的代理)。开发者可以根据自己的应用场景和风险承受能力,决定其应用在这些设备上的运行方式。
任何开发者都可以使用 Play Integrity API 吗?
可以,任何 Android 开发者都可以发出 Play Integrity API 请求,以接收默认的完整性判定结果。无论采用何种分发渠道,用量上限均为每天 1 万次请求。除了任何其他发布渠道之外,在 Google Play 上发布其应用的开发者也可以申请增加其每日配额。
任何开发者都可以使用 Android 平台密钥认证吗?
可以,任何 Android 开发者都可以使用 Android 平台密钥认证来获取密钥认证记录,并使用 Google 认证根密钥的公共证书进行验证。Play Integrity API 为开发者带来了密钥认证和额外功能的好处,而无需开发者自行集成密钥认证,从而避免了所有复杂性。
强制执行
开发者如何使用 Play Integrity API 判定结果?
开发者可以自行决定是否使用 Play Integrity API 判定结果以及如何使用。有些开发者会收集这些信号,用于内部反滥用分析,而其他开发者则会根据判定结果来决定应用的行为。例如,开发者可以决定要求不太可信的设备在创建账号时执行额外的用户验证步骤;或者他们可以决定让不太可信的设备在同一个多人游戏服务器上一起玩游戏。
Play Integrity API 会屏蔽用户或设备吗?
不会,Play Integrity API 本身不会阻止对任何功能的访问。 这是一项可选的开发者服务,可提供信号,开发者可选择如何根据这些信号采取行动。
如果用户的设备未通过 Play Integrity API 设备检查,用户该怎么办?
用户可以前往其设备上的 Play 商店应用,打开设置菜单,选择关于,然后查看 Play 保护机制认证。如果设备的 Play 保护机制认证存在问题,系统会显示一个按钮,用户可以按下该按钮来尝试解决问题。这将刷新设备的认证状态,并提供有关需要修复的问题的具体指导。