唯一标识符最佳实践

本文档根据您的用例,提供有关为您的应用选择适当标识符的指导。

有关 Android 权限的常规概述,请参阅权限概述。有关使用 Android 权限的具体最佳实践,请参阅应用权限最佳实践

使用 Android 标识符的最佳实践

为了保护用户的隐私,请使用满足应用用例的最严格的标识符。特别是,请遵循以下最佳实践

  1. 尽可能选择用户可重置的标识符。即使应用使用非不可重置的硬件 ID 以外的标识符,也能实现大多数用例。
  2. 避免使用硬件标识符。在大多数用例中,您可以避免使用硬件标识符(例如国际移动设备识别码 (IMEI) 和序列号),而不会限制所需的功能。

    Android 10(API 级别 29)为不可重置的标识符添加了限制,其中包括 IMEI 和序列号。您的应用必须是设备或配置文件所有者应用,拥有特殊的运营商权限,或拥有READ_PRIVILEGED_PHONE_STATE 特权权限才能访问这些标识符。

  3. 仅将广告 ID 用于用户画像或广告用例。使用广告 ID时,始终尊重用户关于广告跟踪的选择。如果您必须将广告标识符与个人可识别信息关联,则只能在获得用户明确同意的情况下这样做。

  4. 不要桥接广告 ID 重置。

  5. 对于所有其他用例(除了支付欺诈预防和电话功能),尽可能使用 Firebase 安装 ID (FID) 或私有存储的 GUID。对于绝大多数非广告用例,FID 或 GUID 应该足够了。

  6. 使用适合您用例的 API 以最大程度地降低隐私风险。对于高价值内容保护,请使用DRM API;对于滥用防护,请使用Play Integrity API。Play Integrity API 是确定设备是否为正品的最简单方法,不会造成隐私风险。

本指南的其余部分将在开发 Android 应用的背景下详细阐述这些规则。

使用广告 ID

广告 ID 是用户可重置的标识符,适用于广告用例。但是,使用此 ID 时,请牢记一些关键要点

始终尊重用户重置广告 ID 的意图。如果没有用户的同意,请不要通过使用其他标识符或指纹来桥接用户重置,将后续的广告 ID 链接在一起。Google Play 开发者内容政策规定:

"...如果重置,则不得将新的广告标识符与之前的广告标识符或从之前的广告标识符派生的数据关联,除非获得用户的明确同意。"

始终尊重关联的个性化广告标记。广告 ID 是可配置的,用户可以限制与 ID 关联的跟踪量。始终使用AdvertisingIdClient.Info.isLimitAdTrackingEnabled()方法,以确保您不会违背用户的意愿。Google Play 开发者内容政策规定:

“...您必须遵守用户的“拒绝基于兴趣的广告”或“拒绝广告个性化”设置。如果用户启用了此设置,则您不得将广告标识符用于创建用于广告目的的用户档案或用于向用户投放个性化广告。允许的活动包括情境广告、频率上限、转化跟踪、报告以及安全和欺诈检测。”

请注意与您使用的 SDK 相关的任何与广告 ID 使用相关的隐私或安全策略。例如,如果您将true传递到来自 Google Analytics SDK 的enableAdvertisingIdCollection()方法,请确保查看并遵守所有适用的Analytics SDK 策略

此外,请注意Google Play 开发者内容政策要求广告 ID“不得与个人身份信息关联或与任何持久设备标识符(例如:SSAID、MAC 地址、IMEI 等)关联”。

例如,假设您想要收集信息以使用以下列填充数据库表

TABLE-01
时间戳 广告 ID 帐户 ID 点击 ID
TABLE-02
帐户 ID 姓名 出生日期 国家/地区

在此示例中,ad_id列可以通过两个表中的account_id列与 PII 连接,如果未获得用户的明确许可,这将违反Google Play 开发者内容政策

请记住,广告商 ID 和 PII 之间的链接并不总是如此明确。有可能存在同时出现在 PII 和 Ad ID 键表中的“准标识符”,这也会导致问题。例如,假设我们更改 TABLE-01 和 TABLE-02 如下

TABLE-01
时间戳 广告 ID 点击 ID 设备型号
TABLE-02
时间戳 演示 帐户 ID 设备型号 姓名

在这种情况下,如果点击事件足够罕见,仍然可以通过事件的时间戳和设备型号在广告商 ID TABLE-01 和 TABLE-02 中包含的 PII 之间进行连接。

尽管通常很难保证数据集中不存在此类准标识符,但您可以通过尽可能概括唯一数据来防止最明显的连接风险。在前面的示例中,这意味着降低时间戳的精度,以便每个时间戳都显示具有相同型号的多个设备。

其他解决方案包括以下内容

  • 不要设计明确将 PII 与广告 ID 关联的表。在上面的第一个示例中,这意味着不要在 TABLE-01 中包含account_id列。

  • 隔离和监控对同时访问广告 ID 键数据和 PII 的用户或角色的访问控制列表。通过严格控制和审核同时访问这两个来源的能力(例如,通过在表之间执行连接),您可以降低广告 ID 和 PII 之间关联的风险。一般来说,控制访问意味着执行以下操作

    1. 使广告 ID 键数据和 PII 的访问控制列表 (ACL) 不重叠,以最大程度地减少同时位于两个 ACL 中的个人或角色的数量。
    2. 实施访问日志记录和审计,以检测和管理此规则的任何例外情况。

有关负责任地使用广告 ID 的更多信息,请参阅AdvertisingIdClient API 参考。

使用 FID 和 GUID

识别设备上运行的应用实例最直接的解决方案是使用 Firebase 安装 ID (FID),这是大多数非广告用例中推荐的解决方案。只有为其配置的应用实例才能访问此标识符,并且它(相对)易于重置,因为它仅在应用安装期间持续存在。

因此,与不可重置的、设备范围的硬件 ID 相比,FID 提供了更好的隐私属性。有关更多信息,请参阅firebase.installations API 参考。

在 FID 不切实际的情况下,您还可以使用自定义全局唯一 ID (GUID) 来唯一标识应用实例。最简单的方法是使用以下代码生成您自己的 GUID

Kotlin

var uniqueID = UUID.randomUUID().toString()

Java

String uniqueID = UUID.randomUUID().toString();

由于标识符是全局唯一的,因此可用于识别特定的应用实例。为了避免跨应用链接标识符的相关问题,请将 GUID 存储在内部存储中而不是外部(共享)存储中。有关更多信息,请参阅数据和文件存储概述页面。

不要使用 MAC 地址

MAC 地址是全局唯一的,不可由用户重置,并且在恢复出厂设置后仍然存在。出于保护用户隐私的原因,在 Android 6 及更高版本上,对 MAC 地址的访问权限仅限于系统应用。第三方应用无法访问它们。

Android 11 中 MAC 地址可用性更改

在面向 Android 11 及更高版本的应用中,Passpoint 网络的 MAC 随机化按 Passpoint 配置文件进行,根据以下字段生成唯一的 MAC 地址

  • 完全限定域名 (FQDN)
  • 领域
  • 凭据,基于 Passpoint 配置文件中使用的凭据
    • 用户凭据:用户名
    • 证书凭据:证书和证书类型
    • SIM 凭据:EAP 类型和 IMSI

此外,非特权应用无法访问设备的 MAC 地址;只有具有 IP 地址的网络接口可见。这会影响getifaddrs()NetworkInterface.getHardwareAddress()方法,以及发送RTM_GETLINK Netlink 消息。

以下是应用受此更改影响的方式列表

  • NetworkInterface.getHardwareAddress()对于每个接口都返回 null。
  • 应用无法在NETLINK_ROUTE套接字上使用bind()函数。
  • ip命令不返回有关接口的信息。
  • 应用无法发送RTM_GETLINK消息。

请注意,大多数开发人员应该使用ConnectivityManager的高级 API,而不是NetworkInterfacegetifaddrs()或 Netlink 套接字等低级 API。例如,需要当前路由最新信息的应用可以通过使用ConnectivityManager.registerNetworkCallback()侦听网络更改并调用网络关联的LinkProperties.getRoutes()来获取此信息。

标识符特征

Android 操作系统提供了一些具有不同行为特征的 ID。您应该使用哪个 ID 取决于以下特征如何与您的用例配合使用。但是,这些特征也具有隐私影响,因此了解这些特征如何相互影响非常重要。

范围

标识符范围说明哪些系统可以访问标识符。Android 标识符范围通常有三种类型

  • 单个应用:ID 位于应用内部,其他应用无法访问。
  • 应用组:预定义的相关应用组可以访问 ID。
  • 设备:设备上安装的所有应用都可以访问 ID。

授予标识符的范围越广,将其用于跟踪目的的风险就越大。相反,如果标识符只能由单个应用实例访问,则它不能用于跨不同应用中的交易跟踪设备。

可重置性和持久性

可重置性和持久性定义标识符的生命周期并说明如何重置它。常见的重置触发器包括:应用内重置、通过系统设置重置、启动时重置和安装时重置。Android 标识符可以具有不同的生命周期,但生命周期通常与 ID 如何重置有关

  • 仅限会话:每次用户重新启动应用时都会使用新的 ID。
  • 安装重置:每次用户卸载并重新安装应用时都会使用新的 ID。
  • FDR 重置:每次用户恢复设备出厂设置时都会使用新的 ID。
  • FDR 持久:ID 在恢复出厂设置后仍然存在。

可重置性使用户能够创建与任何现有个人资料信息分离的新 ID。标识符持续存在的时间越长,并且越可靠,例如跨恢复出厂设置持续存在的标识符,用户可能受到长期跟踪的风险就越大。如果在应用重新安装时重置标识符,则会减少持久性并提供一种重置 ID 的方法,即使在应用或系统设置中没有明确的用户控制来重置它。

唯一性

唯一性确定冲突的可能性;也就是说,在关联范围内存在相同的标识符。在最高级别,全局唯一标识符即使在其他设备或应用上也永远不会发生冲突。否则,唯一性级别取决于标识符的熵和用于创建它的随机性源。例如,使用安装的日历日期(例如2019-03-01)作为种子来生成随机标识符的冲突几率远高于使用安装的 Unix 时间戳(例如1551414181)作为种子来生成随机标识符的冲突几率。

通常,用户帐户标识符可以被认为是唯一的。也就是说,每个设备/帐户组合都有一个唯一的 ID。另一方面,标识符在人群中越不唯一,隐私保护就越好,因为它对跟踪单个用户不太有用。

完整性保护和不可否认性

您可以使用难以伪造或重放的标识符来证明关联的设备或帐户具有一定的属性。例如,您可以证明该设备不是垃圾邮件发送者使用的虚拟设备。难以伪造的标识符还提供不可否认性。如果设备使用密钥签署消息,则很难声称其他人的设备发送了该消息。不可否认性可能是用户想要的东西,例如在验证付款时,也可能是用户不希望拥有的属性,例如在发送他们后悔的消息时。

常见用例和要使用的相应标识符

本节提供硬件 ID(例如 IMEI)的替代方案。不建议使用硬件 ID,因为用户无法重置它们,并且它们的作用域限定在设备上。在许多情况下,应用作用域标识符就足够了。

账户

运营商状态

在这种情况下,您的应用使用运营商账户与设备的电话和短信功能进行交互。

建议使用的标识符:IMEI、IMSI 和 Line1

为什么推荐此标识符?

如果运营商相关功能需要硬件标识符,则可以使用它们。例如,您可以使用这些标识符在蜂窝网络运营商或 SIM 卡插槽之间切换,或通过 IP 传输短信(对于 Line1) - 基于 SIM 卡的用户帐户。但是,对于非特权应用,我们建议使用帐户登录在服务器端检索用户设备信息。这样做的一个原因是,在 Android 6.0(API 级别 23)及更高版本中,这些标识符只能通过运行时权限使用。用户可能会关闭此权限,因此您的应用应优雅地处理这些异常。

移动订阅状态

在这种情况下,您需要将应用功能与设备上的某些移动服务订阅关联起来。例如,您可能需要根据设备通过 SIM 卡的移动订阅来验证对某些高级应用功能的访问权限。

建议使用的标识符:使用Subscription ID API来识别设备上使用的 SIM 卡。

Subscription ID 为唯一标识设备上安装的 SIM 卡(包括物理和电子 SIM 卡)提供了一个索引值(从 1 开始)。通过此 ID,您的应用可以将其功能与给定 SIM 卡的各种订阅信息相关联。对于给定的 SIM 卡,此值是稳定的,除非设备恢复出厂设置。但是,在某些情况下,同一张 SIM 卡在不同的设备上可能具有不同的 Subscription ID,或者不同的 SIM 卡在不同的设备上可能具有相同的 ID。

为什么推荐此标识符?

某些应用目前可能正在使用ICC ID来实现此目的。由于 ICC ID 是全局唯一的且不可重置,因此从 Android 10 开始,已将对具有READ_PRIVILEGED_PHONE_STATE权限的应用的访问权限进行了限制。从 Android 11 开始,Android 进一步限制了通过getIccId() API 访问 ICCID,无论应用的目标 API 级别如何。受影响的应用应迁移到使用 Subscription ID。

单点登录

在这种情况下,您的应用提供单点登录体验,允许用户将其现有帐户与您的组织关联起来。

建议使用的标识符:帐户管理器兼容的帐户,例如Google 帐户关联

为什么推荐此标识符?

Google 帐户关联允许用户将其现有的 Google 帐户与您的应用关联,从而提供无缝且更安全的访问您组织的产品和服务的方法。此外,您可以定义自定义 OAuth 范围,以仅共享必要数据,通过明确定义其数据的使用方式来提高用户信任度。

广告

定位

在这种情况下,您的应用会构建用户兴趣概况,以便向他们展示更相关的广告。

建议使用的标识符:如果您的应用使用 ID 用于广告并在 Google Play 上上传或发布,则该 ID 必须是广告 ID。

为什么推荐此标识符?

这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。

无论您是否在应用中共享用户数据,如果您出于广告目的收集和使用它,都需要在 Play Console 的应用内容页面上的数据安全部分中声明广告目的。

衡量

在这种情况下,您的应用会根据用户在同一设备上您组织的应用中的行为创建用户概况。

建议使用的标识符:广告 ID 或 Play 安装推荐来源 API

为什么推荐此标识符?

这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。如果您将 ID 用于广告用例,则该 ID 必须是广告 ID,因为用户可以重置它。在Google Play 开发者内容政策中了解更多信息。

转化

在这种情况下,您正在跟踪转化以检测您的营销策略是否成功。

建议使用的标识符:广告 ID 或 Play 安装推荐来源 API

为什么推荐此标识符?

这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。

再营销

在这种情况下,您的应用会根据用户的先前兴趣展示广告。

建议使用的标识符:广告 ID

为什么推荐此标识符?

这是一个与广告相关的用例,可能需要一个可在您组织的不同应用中使用的 ID,因此使用广告 ID 是最合适的解决方案。根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。

应用分析

在这种情况下,您的应用会评估用户行为,以帮助您确定以下事项

  • 您组织的其他哪些产品或应用可能适合用户。
  • 如何让用户对使用您的应用保持兴趣。
  • 衡量未登录或匿名用户的用量统计信息和分析。

可能的解决方案包括

  • 应用集 ID:应用集 ID 允许您分析用户在您组织拥有的多个应用中的行为,只要您不将用户数据用于广告目的。如果您针对由 Google Play 服务支持的设备,我们建议您使用应用集 ID。
  • Firebase ID (FID):FID 的作用域限定在创建它的应用中,这可以防止标识符用于跨应用跟踪用户。它也很容易重置,因为用户可以清除应用数据或重新安装应用。创建 FID 的过程很简单;请参阅 Firebase 安装指南。

应用开发

崩溃报告

在这种情况下,您的应用会收集有关其在用户设备上何时以及为何崩溃的数据。

建议使用的标识符:FID 或应用集 ID

为什么推荐此标识符?

FID 的作用域限定在创建它的应用中,这可以防止标识符用于跨应用跟踪用户。它也很容易重置,因为用户可以清除应用数据或重新安装应用。创建 FID 的过程很简单;请参阅Firebase 安装指南。应用集 ID 允许您分析用户在您组织拥有的多个应用中的行为,只要您不将用户数据用于广告目的。

性能报告

在这种情况下,您的应用会收集性能指标(例如加载时间和电池用量),以帮助提高应用的质量。

建议使用的标识符:Firebase 性能监控

为什么推荐此标识符?

Firebase 性能监控可帮助您关注对您最重要的指标,并测试应用中最近更改的影响。

应用测试

在这种情况下,您的应用会评估用户对您的应用的体验,以进行测试或调试。

建议使用的标识符:FID 或应用集 ID

为什么推荐此标识符?

FID 的作用域限定在创建它的应用中,这可以防止标识符用于跨应用跟踪用户。它也很容易重置,因为用户可以清除应用数据或重新安装应用。创建 FID 的过程很简单;请参阅Firebase 安装指南。应用集 ID 允许您分析用户在您组织拥有的多个应用中的行为,只要您不将用户数据用于广告目的。

跨设备安装

在这种情况下,您的应用需要在同一用户的多个设备上安装应用时识别正确的应用实例。

建议使用的标识符:FID 或 GUID

为什么推荐此标识符?

FID 就是为此目的而设计的;其作用域仅限于应用,因此无法用于跨不同应用跟踪用户,并且在应用重新安装时会重置。在 FID 不足的罕见情况下,您也可以使用 GUID。

安全

滥用检测

在这种情况下,您尝试检测多个伪造设备攻击您的后端服务。

建议使用的标识符:Google Play 完整性 API 完整性令牌

为什么推荐此标识符?

要验证请求是否来自真实的 Android 设备(而不是模拟器或其他代码模拟其他设备),请使用Google Play 完整性 API

广告欺诈

在这种情况下,您的应用会检查用户在您的应用中的印象和操作是否真实且可验证。

建议使用的标识符:广告 ID

为什么推荐此标识符?

根据Google Play 开发者内容政策,广告用例必须使用广告 ID,因为用户可以重置它。

数字版权管理 (DRM)

在这种情况下,您的应用想要保护对知识产权或付费内容的欺诈访问。

建议使用的标识符:使用 FID 或 GUID 会迫使用户重新安装应用才能规避内容限制,这足以阻止大多数人。如果这不足以提供保护,则 Android 提供了一个DRM API,该 API 可用于限制对内容的访问,其中包括每个 APK 标识符 Widevine ID。

用户偏好设置

在这种情况下,您的应用会保存应用的每个设备的用户状态,尤其是在用户未登录的情况下。您可能会将此状态传输到同一设备上使用相同密钥签名的另一个应用。

建议使用的标识符:FID 或 GUID

为什么推荐此标识符?

不建议在重新安装过程中保留信息,因为用户可能希望通过重新安装应用来重置其偏好设置。