使用设备回想(Beta 版)检测重复滥用行为

本页面介绍了如何使用设备回想功能来存储和检索与特定设备关联的自定义数据。即使在设备重置后,当您的应用安装在同一设备上时,您也可以在稍后可靠地找回自定义数据。这样,您就可以根据您指定的操作或行为来检测和阻止设备被重复使用,同时保护用户隐私。

设备回想机制如何运作?

设备回想功能让应用能够以保障用户隐私的方式存储和找回与特定设备关联的自定义数据。这些数据会存储在 Google 的服务器上,因此即使在重新安装应用或重置设备后,您的应用也能可靠地找回自定义数据。例如,您可以使用此功能来找回您发现存在严重滥用行为的设备、已兑换高价值商品(例如免费试用)的设备,或者被反复用于滥用目的创建新账号的设备。设备回想可保护用户隐私,因为请求应用只能找回与设备相关联的有限数据,而无需访问任何设备或用户标识符。开启设备回想功能后,您可以执行以下操作:

  • 读取每台设备的数据:每次获得完整性判定结果时,您都可以读取每台设备的三个自定义值或。您可以为这些值定义自己的含义;例如,您可以将这些值视为三个单独的标志,也可以将它们组合起来表示八个自定义标签。
  • 修改每台设备的数据:获得完整性令牌后,您可以使用 该令牌向 Google Play 的服务器发出服务器端调用,以修改一个 或多个值。您最多可在 14 天内使用该令牌。例如,如果滥用行为仅在您首次执行完整性检查后的两周内才变得明显,您就可以修改相应值。当您修改某个值时,系统也会存储修改该值的月份和年份。

设备回想的前提条件和注意事项

设备回想只能用于存储和找回信息,以保护应用安全,并减少滥用、欺诈和未经授权的访问。您不得使用设备回想功能来指纹化或跟踪个别用户或设备,也不得使用设备回想功能来跟踪敏感的用户或设备特征,例如性别、年龄或位置数据。

设备回想有以下前提条件:

  • 设备回想功能可用于手机、平板电脑、可折叠设备、电视、汽车和 Wear OS 设备。在 Wear 上,设备回想功能仅适用于搭载 Wear OS 5 或更高版本的设备。模拟器不支持设备回想功能。
  • 设备回想要求设备上已安装并启用了最新版 Google Play 商店和 Google Play 服务。
  • 设备回想需要用户账号获得 Play 许可,否则判定结果将不予评估。

设备回想有以下时间方面的注意事项:

  • 验证完整性令牌后,您最多可在 14 天内使用该令牌来存储自定义设备回想数据。
  • 设备回想包含时间戳,因此您可以将最近修改的数据的优先级设为高于很久之前修改的数据。 考虑在足够长的时间段后忽略或重置数据,以考虑设备可能会易主或翻新并转售。
  • 在上次读取或写入访问后,设备的“回想位”将存储 3 年。
  • 如果您需要删除与设备关联的所有数据,您的应用可以将该设备上的所有三个值重置为 false。这会自动重置时间戳。

对于拥有多个应用的开发者和转移应用的开发者,设备回想功能的工作方式如下:

  • 您 Google Play 开发者账号中的所有应用都可以在每台设备上访问这三个值。换言之,如果您的某个应用修改了其中一个值,那么当您的所有应用安装在同一设备上时,它们都会读取修改后的值。
  • 如果应用从一个开发者账号转移到另一个开发者账号,设备回想功能将反映新开发者账号的每台设备的数据,而不是旧开发者账号的每台设备的数据。

开启设备回想功能

准备就绪后,即可在 Play 管理中心开启设备回想功能:

  1. 登录 Play 管理中心。
  2. 选择要使用设备回想功能的应用。
  3. 在左侧菜单的发布部分,进入应用完整性
  4. 点击 Play Integrity API 旁边的设置
  5. 在该页面的响应部分,点击更改响应
  6. 开启“设备回想”功能。
  7. 点击 保存更改 。

当您开启或关闭设备回想功能时,系统会删除您在 Play 管理中心设置的任何 Play Integrity API 测试 响应,您必须重新创建这些响应 。

读取设备回想值

设备回想功能适用于 Play Integrity API 的传统请求和标准请求。在标准请求中,设备回想会在预热调用中刷新。换言之,修改每台设备的数据后,您需要再次执行预热才能看到更新后的值。启用设备回想功能后,您就可以在完整性判定结果中 读取设备回想值

修改设备回想值

您可以通过进行类似于解码完整性判定的服务器到服务器 API 调用来修改设备回想值。将位设置为 true 还会更新其写入日期(即使它已是 true)。将位设置为 false 会将其写入日期重置为空。请求中未指定的任何位都将保持不变。在写入位与能够在判定中读回位之间存在很小的传播延迟。此延迟可能长达 30 秒,但通常要短得多。设备回想写入请求的频率应低于完整性令牌请求的频率。它们不计入完整性令牌请求配额,但受非公开防御速率限制的约束。

playintegrity.googleapis.com/v1/PACKAGE_NAME/deviceRecall:write -d \
'{
  "integrityToken": "INTEGRITY_TOKEN",
  "newValues": {
    "bitFirst": true,
    "bitThird": false
  }
}'
newValues.BitFirst = true // ForceSendFields optional for value true
newValues.BitSecond = false // ForceSendFields required for value false
newValues.BitThird = nil // do not set ForceSendFields for unspecified bits
newValues.ForceSendFields = []string{"BitSecond"}