关于安卓唯一标识的汇总及最佳做法

前言

识别用户唯一性,是每个做应用所遇到的问题之一。通常我们会希望有一个唯一的字符,去识别关联我们的用户。

标识符特性

Android 操作系统提供了多种具有不同行为特性的 ID。我们应该使用何种 ID 取决于以下特性适合我们用例的程度。然而,这些特性还涉及到隐私权,因此我们必须要了解这些特性彼此之间是如何互动的。

作用域

标识符作用域说明了哪些系统可以访问标识符。Android 标识符的作用域一般分为三种:

  • 单一应用 - ID 仅限应用内部使用,其他应用无法访问。
  • 一组应用 - ID 可供一组预先定义的相关应用访问。
  • 设备 - ID 可供安装在设备上的所有应用访问。
    向标识符授予的作用域越大,其作跟踪用途的风险就越大。相反,如果标识符只能由单一应用实例访问,就无法用于跨不同应用的事务跟踪设备。

重置性与持久性

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

  • 仅限会话期间 - 每次用户重新启动应用时都使用新的 ID。
  • 安装重置 - 每次用户卸载并重新安装应用时都使用新的 ID。
  • FDR 重置 - 每次用户恢复设备出厂设置时都使用新的 ID。
  • FDR 持久性 - ID 在恢复出厂设置后保持不变。
    重置性让用户能够创建与任何现有个人资料信息无关的新 ID。标识符持久存在得越久、越可靠(例如在恢复出厂设置后继续存在的标识符),用户被长期跟踪的风险就越高。如果应用重新安装时标识符被重置,即使没有显式用户控件可以在应用或系统设置内将其重置,这样做也能缩短其持续时间并提供一种重置 ID 的手段。

唯一性

唯一性可以确定发生冲突的可能性;而发生冲突是指在关联作用域内存在完全相同的标识符。在最高级别,全局唯一标识符永远不会有冲突项,即使在其他设备/应用上也是如此。唯一性级别取决于标识符的熵和用来创建标识符的随机性来源。例如,带有安装日期(例如 2019-03-01)的随机标识符的冲突几率要比带有 Unix 安装时间戳(例如 1551414181)的标识符高得多。
一般而言,我们可以将用户帐号标识符视为具有唯一性。也就是说,每个设备/帐号组合都有一个唯一 ID。另一方面,标识符在某一群体内的唯一性越低,隐私保护效果就越好,因为它用于跟踪单个用户的有用性会降低。

完整性保护和不可否认性

我们可以使用难以仿冒或重播的标识符证明关联的设备或帐号具有某些属性。例如,我们可以证明设备并非被垃圾内容发布者利用的虚拟设备。难以仿冒的标识符还能提供不可否认性。如果设备用密钥对一条消息进行了签名,就难以辩称这条消息是由他人的设备发出的。不可否认性可能是用户需要的(例如,进行付款身份验证),也可能成为令人讨厌的属性(例如,用户会后悔发送某条消息)。

常见用例和适用的标识符

那么目前android的唯一标识id 大致有 IMEI,SSAID,MAC,OAID,GUID,GAID。
首先说明一下,每一个id及其含义。

  • IMEI:
    IMEI 码,即手机的串号,俗称手机序列号。

它是 International Mobile Equipment Identity( 国际移动设备身份) 的简称,就像是手机的身份证,是用来帮助辨别手机身份真伪的。每个手机都只有唯一一个串号,不会重复。

  • SSAID:
    也称之为andoridId或者设备id。
    SSAID目前是Android系统提供给应用容易访问的设备ID,这个ID主要与应用/设备相关。

Android ID最大的变化是从Android8.0开始,在andorid 8.0之前安装的应用,在系统ota升级至8.0后,当卸载安装或升级安装后,SSAID将重新生成一次(因升级算法)

至此,android将根据签名不同,创建生成一个SSAID,也就是说,同样的手机相同的签名的APP获取到的SSAID将完全一样。(可跨app识别用户)

  • MAC:
    手机MAC地址就是手机的网卡地址,换句话说,就是手机网卡的身份证号。
    MAC地址又称为物理地址、硬件地址,用来定义网络设备的位置,它由一串英文加数字的字符串组成,并具有全球唯一性。

MAC 地址具有全局唯一性,无法由用户重置,在恢复出厂设置后也不会变化。因此,Google一般不建议使用 MAC 地址进行任何形式的用户标识。搭载 Android 10(API 级别 29)及更高版本的设备会报告不是设备所有者应用的所有应用的随机化 MAC 地址。

在 Android 6.0(API 级别 23)到 Android 9(API 级别 28)中,本地设备 MAC 地址(如 WLAN 和蓝牙)无法通过第三方 API 使用。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getDefaultAdapter().getAddress() 方法都会返回 02:00:00:00:00:00。

  • OAID:
    国内目前由工信部牵头实现了一套移动智能终端补充标识体系,大多数国内手机厂商已经支持
  • GAID:
    是google推荐的用户识别ID之一
    广告 ID 是一种可由用户重置的标识符,适用于广告用例。但是,在使用此 ID 时,请注意以下要点:

在重置广告 ID 时始终尊重用户的意愿。在未经用户同意的情况下,请勿使用其他标识符或指纹将后续广告 ID 关联起来,对用户重置进行桥接。
也就是说,用户重置ID后,Google默认认为两个ID就是两个用户,且在用户不同意创建用户画像的情况下,不允许按照兴趣推荐广告。

  • GUID:
    Google的一个建议,建议开发者自行实现,去创建用户唯一ID,并存储到沙盒中。
    当用户卸载重新安装app时,从实现原理上讲,GUID应该会被重新创建,也就是变为新的用户。
    获取方式参考如下:
String uniqueID = UUID.randomUUID().toString();

总结

在10.0以前设备ID的这些值还能获取到,Mac地址6.0之后通过api是获取不到的,通过扫描硬件端口还能获取。
Android 10(API 级别 29)对不可重置的标识符(包括 IMEI 和序列号)添加了限制。我们的应用必须是设备或个人资料所有者应用,具有特殊运营商权限或具有 READ_PRIVILEGED_PHONE_STATE 特许权限,才能访问这些标识符。
所以目前来讲,唯一标识的最佳做法为利用GUID以及GAID去做相关内容。

相关链接:https://developer.android.com/training/articles/user-data-ids#scope

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值