改进了 Android 13 及更高版本设备中的判定结果

我们最近宣布,将加强 Play Integrity API 判定,使其更快、更能抵御攻击,并为用户提供更高的隐私保护,同时还会进行其他安全改进。

变更摘要

本文档稍后部分会详细总结这些更改和预期影响。新判定结果如下:

  • 新集成:所有新集成都将自动收到新的判定结果。

  • 2025 年 5 月之前的现有集成:已完成集成的开发者可以在 Play 管理中心的 Play Integrity API 设置页面中选择启用,以便同时接收新判定和旧判定,从而有时间进行审核并考虑更改应用行为。在选择启用之前,您可以查看返回每种判定的设备百分比的预期变化,以及新判定的 JSON 示例。选择启用后,您会在响应中收到两个额外的字段,其中包含 Android SDK 版本和旧版判定。

  • 2025 年 5 月之后的现有集成:所有集成都将采用这些改进,无需开发者执行任何工作。在 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 11 及更高版本(此更改将逐步生效)
仅影响使用可选功能的 Play 管理中心开发者和 Play SDK 管理中心开发者的变更
设备判定响应:meets-basic-integrity 必须具有 Android 平台密钥认证,但启动状态可以是已验证或未验证 基本回答次数略有减少(约 0.4%) Android 13 及更高版本
设备判定响应:meets-strong-integrity 必须在过去一年内获得安全更新 强烈回应减少(约 14.5%) Android 13 及更高版本
所有可选信号 请求的应用必须由 Google Play 安装或更新 包含可选信号的响应百分比有所下降(约 7%) Android 13 及更高版本

*上述所有预估影响百分比均基于平均值,不同应用的实际变化幅度可能会有所不同,具体取决于其安装量。

常见问题解答

概览

什么是 Play Integrity API?

Play Integrity API 可帮助您获取与设备、应用和用户相关的信息,以便评估用户应用环境的可信度,从而检测和响应潜在的滥用行为和攻击。

Play Integrity API 会提供哪些信号?

Play Integrity API 包含请求方应用的身份、请求方应用是否由 Google Play 安装,以及设备是否为正版 Play 保护机制认证 Android 设备。默认情况下,系统会提供这些信号。您可以在应用的后端服务器上读取这些信号,并决定应用是否应做出响应以及如何响应。Google Play 开发者可以选择在 Play 安装中接收其他信号,以便查看更多信息。

什么是 Android 平台密钥认证?

借助 Android 平台密钥认证,应用可以验证设备的状态,并获得硬件支持的启动完整性的强烈信号。它依赖于 Google 在设备的硬件支持的密钥库中预配的密钥。Play Integrity API 已在某些设备上使用密钥认证来获取由硬件支持的安全信号,现在将在所有搭载 Android 13 或更高版本的设备上更深入地集成这些信号。

判定结果变更

在 Android 13 或更高版本的设备上,Play Integrity API 判定结果会发生哪些变化?

Play Integrity API 现在要求所有完整性判定都必须包含由硬件支持的安全信号:

  • meets-device-integrity 设备识别判定结果表示应用所运行的设备是已获得 Play 保护机制认证的正版 Android 设备。此判定需要设备引导加载程序处于锁定状态,并且加载的 Android OS 是经过认证的设备制造商映像。
  • meets-strong-integrity 设备识别判定表示设备是已获得 Play 保护机制认证的正版 Android 设备,且已安装近期的安全更新。此判定需要 meets-device-integrity,并且设备在过去一年内已进行过安全更新。此条件将来可能会发生变化。
  • meets-basic-integrity 设备识别判定结果表示检查是在 Android 实体设备上进行的。设备引导加载程序可以是锁定的,也可以是解锁的,启动状态可以是已验证或未验证。它可能未获得 Play 保护机制认证,在这种情况下,Google 无法提供任何安全性、隐私性或应用兼容性保证,也无法保证该设备不会充当代理(例如 Android 虚拟实例的代理)。这也意味着,只要具有密钥认证,已取得 root 权限的设备就可以返回 meets-basic-integrity

这些更改不会影响 Play 游戏电脑版上的 Play Integrity API,该 API 将继续返回 meets-virtual-integrity

为什么在 Android 13 或更高版本的设备上更改了 Play Integrity API 判定?

在各个 Android SDK 版本中,Play Integrity API 仅部分使用由硬件支持的安全信号。通过加强集成,Play Integrity API 判定结果将能够更好地抵御攻击者,为应用提供更出色的性能,并为用户提供更高的隐私保护。转换完成后,搭载 Android 13 或更高版本的设备预计将有以下改进:

  • 减少了需要收集和评估的设备信号,从而在 Google 服务器上生成默认判定结果所需的设备信号数量减少了约 90%。可选信号仍需要收集其他信号。
  • 最差情况下,标准请求的判定延迟时间最多可缩短 80%;所有传统请求获取默认判定的延迟时间最多可缩短 80%。可选信号可能会增加延迟时间。
  • 针对具有密钥认证的所有 Android 设备规格(包括手机、平板电脑、可折叠设备、TV、Auto、Wear OS 和 ChromeOS)提供一致的可靠性和支持级别。
  • 在设备识别判定结果中,meets-strong-integritymeets-device-integritymeets-basic-integrity 这三个设备标签之间的区分度更大。

在用户选择启用该功能期间,Play Integrity API 会同时生成旧版和新版完整性判定结果,因此性能预计不会发生变化。不过,在 2025 年 5 月面向所有开发者发布新判定结果后,我们预计效果会逐步提升,同时我们会移除或转换所有默认和可选信号的旧版依赖项。

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 Integrity API 中的现有信号更加可靠,并定期推出新功能,帮助开发者应对新出现的威胁和新使用情形。我们正在进行的其他判定改进包括:

  • Play 许可响应:现在,为了返回 Play 许可响应,Play Integrity API 始终要求通过 Google Play 安装或更新请求的应用。这修复了一些极端情况,并使开发者更容易解读响应。此功能适用于 Android 13 或更高版本。
  • 可选信号的提供情况:现在,使用 Google Play 管理中心或 Play SDK 管理中心的开发者可用的所有可选信号都要求请求应用是在 Android 13 或更高版本上通过 Google Play 安装或更新的。其中包括 meets-strong-integritymeets-basic-integrity、近期设备活动、应用访问风险判定结果和 Play 保护机制判定结果。所有其他 Play Integrity API 请求都将标准化,以接收设备检查(仅带有 meets-device-integrity 标签)、安装程序检查和应用完整性检查。
  • 针对特定设备的判定变更:Play Integrity API 还将开始在更多情况下自动更改设备判定,以便在所有 Android SDK 版本中更早地保护应用,例如在有证据表明存在过多活动或密钥遭到破坏时。这包括在硬件支持的信号不可用时,Play 能够回退到其他信号,为用户生成临时设备判定结果。建议开发者使用应用内 Play 补救措施对话框或将用户引导至 Play 商店应用来解决完整性判定问题。这些对话框日后将处理更多场景,并包含针对用户的具体指导,告知他们根据其特定设备或账号需要解决哪些问题。

选择启用和停用

如何在 Android 13 或更高版本的设备上选择启用改进后的判定结果?

使用 Play 管理中心的开发者可以在 Play Integrity API 设置页面上选择启用

选择启用后,我的 Play Integrity API 响应会怎样?

选择接受延长更新后,会发生以下三种情况:

  • 系统将立即开始根据 Android 13 或更高版本设备上的新判定评估要求生成并返回 deviceRecognitionVerdict 字段中的响应。在搭载 Android 12 及更低版本的设备上,系统将使用历史判定评估生成 deviceRecognitionVerdict
  • 您将收到一个新字段 deviceAttributes,其中包含设备上的 Android SDK 版本。
  • 您将收到一个新字段 legacyDeviceRecognitionVerdict,其中包含根据历史判定评估要求生成的设备完整性响应,无论 Android SDK 版本如何。

当 2025 年 5 月针对所有集成推出判定结果变更后,选择启用该功能的所有应用都将停止接收 legacyDeviceRecognitionVerdict 字段。

如何报告完整性判定方面的问题?

如需报告 Play Integrity API 响应的问题(无论是历史判定结果还是新判定结果),请按照支持页面上的说明操作。

选择启用后,我可以选择停用吗?

可以,您可以在 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 设备外形规格(包括手机、平板电脑、可折叠设备、TV、Auto、Wear OS 和 ChromeOS)上都具有相同级别的可靠性和支持。

为什么 Play Integrity API 对不同设备的判定结果不同?

Play Integrity API 提供多种设备判定,以适应具有不同用例和风险容忍度的开发者,并让开发者能够制定分层强制执行策略。例如,当应用和设备更可信时,开发者可能会简化用户验证步骤;而当设备不明时,开发者可能会要求用户在执行受保护或敏感操作之前进行额外验证。这是一种有效减少滥用行为和攻击的方法。

什么是获得 Play 保护机制认证的 Android 设备?

获得 Play 保护机制认证的 Android 设备(也称为 GMS Android 设备)是指搭载可预测软件的设备,该软件已通过数百项 Google 兼容性测试,遵循 Android 安全和权限模型,并附带 Google Play 保护机制套件中的一系列反恶意软件功能。当 Play Integrity API 能够验证某部设备是否为通过 Play 保护机制认证的 Android 设备时,它会在设备识别判定中返回 meets-device-integrity 响应。

什么是 meets-basic-integrity 设备?

Play Integrity API 还会在设备判定 meets-basic-integrity 中返回一个可选响应。如果设备仅返回 meets-basic-integrity 判定结果,而没有 meets-device-integritymeets-strong-integrity,则表示无法验证 Android OS,但存在密钥认证。这表示检查是在搭载 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 保护机制认证有问题,系统会显示一个按钮,供用户尝试解决问题。这将刷新设备的认证状态,并就需要解决的问题提供具体指导。