唯一标识符最佳做法

本文档将指导您为自己的客户选择适当的标识符, 确定应用场景。

要大致了解 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 传递到 enableAdvertisingIdCollection() 方法,请务必查看并遵守所有 适用的分析 SDK 政策

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

例如,假设您想要收集信息来填充数据库 包含以下列的表:

TABLE-01
timestamp ad_id account_id clickid
TABLE-02
account_id name dob country

在此示例中,ad_id 列可以通过 account_id 与个人身份信息相关联 列,就会违反 Google Play Developer 内容政策 未得到用户的明确许可。

请注意,广告客户 ID 和 PII 之间的关联并非始终是这样 明确。可能存在“准标识符”个人身份信息和 广告 ID 键控表,此类表也会引发问题。例如,假设我们将 TABLE-01 和 TABLE-02 如下所示:

TABLE-01
timestamp ad_id clickid dev_model
TABLE-02
timestamp demo account_id dev_model name

在这种情况下,如果点击事件足够罕见,仍可将 使用 事件的时间戳和设备型号。

尽管通常很难保证不存在此类准标识符 因此可以通过泛化来避免最明显的联接风险 唯一数据。在前面的示例中,这意味着降低 时间戳的准确性,以便在多台设备上使用同一型号 。

其他解决方案包括:

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

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

    1. 断开广告客户 ID 键控数据 ACL 与 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 配置文件中使用的凭据: <ph type="x-smartling-placeholder">
      </ph>
    • 用户凭据:用户名
    • 证书凭据:证书和证书类型
    • SIM 卡凭据:EAP 类型和 IMSI

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

下面列出了此变更会以哪些方式影响应用:

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

请注意,大多数开发者应使用 ConnectivityManager(而非 较低级别的 API NetworkInterface, getifaddrs(), 或 Netlink 套接字例如,某款应用需要 当前路由可以使用 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。另一方面, 如果某个标识符属于某个群体,那么隐私保护措施就会越强, 那么跟踪单个用户就没那么实用了

完整性保护和不可否认性

您可以使用难以仿冒或重放的标识符来证明 关联的设备或账号具有某些属性。例如,你可以 证明设备不是被垃圾内容发布者使用的虚拟设备。 难以仿冒的标识符还能提供不可否认性。如果设备 使用密钥为邮件签名,也很难说别人的 设备发送了这条消息。不可否认性可能是用户需要的(例如,进行付款身份验证),也可能成为令人讨厌的属性(例如,用户会后悔发送某条消息)。

常见用例和适用的标识符

此部分为使用 IMEI 等硬件 ID 提供了替代方案。使用 不建议使用硬件 ID,因为用户无法重置它们, 将范围限定为设备。在许多情况下,作用范围仅限于应用的标识符足以满足您的需求。

账号

运营商状态

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

推荐使用的标识符:IMEI、IMSI 和 Line1

为什么这样建议?

如果需要,可以使用硬件标识符 运营商相关功能。例如,您可以使用这些标识符切换手机运营商/SIM 卡插槽,或者通过 IP(适用于 Line1)发送短信(基于 SIM 卡的用户账号)。不过,对于非特权应用,我们建议您使用账号登录在服务器端检索用户设备信息。这样做的其中一个原因是,在 Android 6.0(API 级别 23)及更高版本中,这些标识符只能通过运行时权限来使用。用户可能 关闭此权限,以便您的应用处理这些异常 优雅地。

移动设备订阅状态

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

建议使用的标识符:订阅 ID API,用于识别设备上使用的 SIM 卡。

订阅 ID 提供了一个索引值(从 1 开始),作为唯一 识别 设备。通过此 ID,您的应用可以将其功能与各种 指定 SIM 卡的订阅信息。此值对于给定 SIM 卡而言是稳定的 除非设备恢复出厂设置不过,在某些情况下,同一 SIM 卡在不同设备上可能具有不同的订阅 ID,或者不同 SIM 卡在不同设备上具有相同的 ID。

为什么这样建议?

某些应用目前可能出于此目的使用 ICC ID。由于 ICC ID 具有全局唯一性且不可重置,因此其访问权限 已仅限于安装有READ_PRIVILEGED_PHONE_STATE的应用 权限。从 Android 11 开始,无论应用的目标 API 级别如何,Android 都进一步限制了通过 getIccId() API 访问 ICCID 的权限。受影响的应用应改为使用订阅 ID。

单点登录

在这种情况下,您的应用会提供单点登录体验,让用户能够 将现有账号与您的组织相关联。

建议使用的标识符:与客户经理账号兼容的账号,例如 Google 账号关联

为什么这样建议?

借助 Google 账号关联功能,用户可以将其现有的 Google 账号与您的应用相关联,从而更安全地顺畅访问贵组织的产品和服务。此外,您还可以 定义自定义 OAuth 范围 仅分享必要的数据,并通过明确定义 使用其数据。

广告

Targeting

在这种情况下,您的应用会根据用户的兴趣构建个人资料,以便向用户展示更相关的广告。

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

为什么这样建议?

这是一个与广告相关的用例,可能需要可用的 ID 组织的不同应用,因此使用广告 ID 最合适的解决方案。按照 Google Play 开发者内容政策,在广告用例中使用广告 ID 是强制性要求,因为用户可以对其进行重置。

无论您是在应用中分享用户数据,如果您收集和使用这些数据 您需要在 “数据安全”部分 (位于 Play 管理中心内的应用内容页面上)。

测量

在此情况下,您的应用会根据用户在同一设备上您组织的应用中的行为创建用户个人资料。

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

为什么这样建议?

这是一种与广告有关的用例,需要使用在贵组织的不同应用中均可用的 ID,因此使用广告 ID 是最合适的解决方案。如果您要将某个 ID 用于广告用例,则该 ID 必须是广告 ID,因为用户可以对其进行重置。如需了解详情,请参阅 Google Play 开发者内容政策

转化次数

在此情况下,您需要通过跟踪转化情况来确认营销策略是否成功。

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

为什么这样建议?

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

再营销

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

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

为什么这样建议?

这是一个与广告相关的用例,可能需要可用的 ID 组织的不同应用,因此使用广告 ID 最合适的解决方案。按照 Google Play 开发者内容政策,在广告用例中使用广告 ID 是强制性要求,因为用户可以对其进行重置。

应用分析工具

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

  • 贵组织的哪些其他产品或应用可能适合 用户。
  • 如何持续吸引用户使用您的应用。
  • 衡量已注销或匿名用户的使用情况统计信息和分析数据。

可能的解决方法包括:

  • 应用组 ID:通过应用组 ID,您可以分析用户在 贵组织拥有的多款应用,前提是您不使用用户数据 。如果您定位到由 Google Play 提供支持的设备 那么我们建议您使用应用组 ID。
  • Firebase ID (FID):FID 的范围限定为创建它的应用, 可防止标识符被用来跨应用跟踪用户。它还 可轻松重置,因为用户可以清除应用数据或重新安装应用。通过 创建 FID 的流程非常简单:查看 Firebase 安装 指南。

应用开发

崩溃报告

在这种情况下,您的应用会收集有关在发生崩溃时崩溃的时间和原因的数据 用户的设备。

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

为什么这样建议?

FID 的作用范围为创建它的应用,这样可以防止他人利用该标识符跟踪用户在不同应用中的行为。它还可以轻松重置 可以清除应用数据或重新安装应用。创建 FID 的流程如下: 简单明了;请参阅 Firebase 安装指南。 借助应用组 ID,您可以分析用户在多个应用上的行为, 只要您不将用户数据用于广告用途 目的。

效果报告

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

建议使用的标识符:Firebase Performance Monitoring

为什么这样建议?

Firebase Performance Monitoring 可帮助您关注最重要的指标 并测试近期一项更改对应用的影响。

应用测试

在这种情况下,您的应用会出于测试或调试目的评估用户对应用的体验。

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

为什么这样建议?

FID 的作用域限定为创建它的应用,这样可以防止标识符 来跨应用跟踪用户此外,此标识符还可以轻松地进行重置,因为用户可以清除应用数据或重新安装应用。创建 FID 的过程简单明了;请参阅 Firebase 安装指南。借助应用组 ID,您可以分析用户在多个应用上的行为, 只要您不将用户数据用于广告用途 目的。

跨设备安装

在此情况下,如果应用安装到同一用户的多台设备上,您的应用需要识别正确的应用实例。

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

为什么这样建议?

FID 明确针对这一用途而设计;其作用域被限定在应用范围,这样就无法被用于跟踪用户在不同应用中的行为,并且在应用重新安装后会重置。如果遇到 FID 无法满足需求的罕见情况,您还可以使用 GUID。

安全

滥用行为检测

在此情况下,您希望发现多台正在攻击后端服务的虚假设备。

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

为什么这样建议?

为了验证请求是否来自真实的 Android 设备,而不是来自 或假冒其他设备的其他代码,请使用 Google Play Integrity API

广告欺诈

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

推荐使用的标识符:广告 ID

为什么这样建议?

按照 Google Play 开发者内容政策,在广告用例中使用广告 ID 是强制性要求,因为用户可以对其进行重置。

数字版权管理 (DRM)

在这种情况下,您的应用想要防止欺诈性地访问知识产权或付费内容。

建议使用的标识符:使用 FID 或 GUID 会强制用户 从而规避内容限制。 足以打击大多数人。如果这样的保护还不够 Android 提供了一个 DRM API,该 API 可以 用于限制对内容的访问,包括每个 APK 的标识符、 Widevine ID。

用户偏好设置

在这种情况下,您的应用会将每台设备的用户状态保存在其 。您可以将此状态转移到其他应用 。

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

为什么这样建议?

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