如何唯一地识别一台移动设备?

0 概述

做数据的过程中,逃不开的一定是“唯一设备”这一概念。计算独立用户数量的时候,要么按照“唯一设备”来计算,要么按照唯一通行证账号来计算,前者一台设备算作一个独立用户,后者一个账号算作一个独立用户。在实际应用过程中,“唯一设备”不仅仅用在产品或公司内部计算独立用户数,在广告引流方面,“唯一设备”也被广泛用于效果追踪和结算。

“唯一设备”是由“设备号”所定义的,“设备号”这东西,不同厂商、不同操作系统 、不同公司拥有不同的定义,也有可能取用不同的标准。我们在实际提交埋点数据的过程中,也遇到了各种各样的问题,比如:

  • 使用某个标准时,由于取用的元数据不同,造成同一台设备安装的两个不同的应用,获取到了不同的设备号。
  • 在和外部平台对接时,发现双方使用的“设备号”规范不一致。
  • 严重依赖某个标准时,可能存在无法渠道“设备号”的情况。

作为常年与数据投递和数据指标打交道的大兄弟,最近也一直在研究这些唯一设备识别符,整理了这些知识和材料,结合近期的实践经验,做个备忘,与大家分享。

1 iOS设备

1.1 IDFA(Identifier For Advertising)广告标识符

目前可用  |  可变  | 单设备唯一 | 适用于iOS6+

iOS操作系统上的“广告标识符”,自苹果iOS 6版本开始,就诞生了这个识别符。

从字面意思上来看,这个标识符是苹果专门用来“做广告”的,意图是向网站、应用程序及广告商提供这个标识符,来表示某一个设备,并用于广告追踪。

苹果允许同一个设备下不同的应用程序共享这个标识符。也就意味着,不同公司的应用程序,在同一台设备上能获取到相同的IDFA,搜狗输入法、百度App、爱奇艺、今日头条都能获得相同的IDFA标志,这让同一台设备上的广告效果追踪成为了可能。

iOS广告隐私
iOS广告隐私

某个输入法检测到某个IDFA的设备在搜索“西瓜”,它将这个IDFA和“西瓜”这个关键词传递给广告平台,当这个用户打开手机上的某资讯软件时,就匹配到了这个IDFA,检查到他可能想吃“西瓜”,于是在信息流广告中推广了一个生鲜电商平台,并标明这个电商平台在买便宜又好吃的西瓜。假如用户点击了这个广告,并成功下载了这个生鲜电商平台App,注册并购买了任何一件商品,那么广告平台仍然可以通过IDFA追踪到他的行为,并认定产生了有效转化(消费),进而要求生鲜电商平台为此次引流付费、为信息流App的成功导流支付广告费,并有可能与输入法公司分成。

IDFA虽然能够表示唯一,但它并不是与设备绝对强绑定的。如果用户在iOS的设置中还原了“广告标识符”,或还原了整个系统,那么这个设备就会产生一个全新的唯一标识符。

标识符示例:1E2DFA89-496A-47FD-9941-DF1FC4E6484A

1.2 IDFV (Identifier For Vendor)应用开发商标识符

目前可用  |  可变  | 同厂商设备唯一 | 适用于iOS6+

与“IDFA”相似,苹果在iOS 6开始,提供“IDFV”这一标识符,面向同一应用开发商。

例如,同一个应用开发商“Tencent Technology (Shenzhen) Company”名下的应用程序QQ、微信阅读、腾讯WiFi管家、腾讯翻译君、QQ浏览器等,他们会获得相同的IDFV设备号。但是如果是“Taobao (China) Software CO.,LTD”名下的应用程序,比如淘宝、盒马、淘票票,他们会是单独的一套IDFV编号,不会与前面的应用开发商有相同IDFV。

我所接触的数据投递很少用到IDFV。这个标识符应该一般用于具有多款App的大型公司,多个应用程序匹配到同一个IDFV值,可以间接地推断这个用户的应用程序喜好,用于用户行为分析;并在IDFV失效或变化时,起到补充映射的作用。因为据了解,如果用户将同意应用开发商的的所有App卸载,则IDFV会重置,在未完全卸载前,即便是重置了IDFA,也依然可以使用IDFV映射IDFA后,标记为同一台设备。(这在标记“老设备”的时候非常有用)。

标识符示例:583D2BB0-B19C-4A9A-A600-2A1EB2FB7E39

1.3 UDID (Unique Device Identifier)唯一设备标识符

目前不可用 | 不变 | 绝对唯一 | iOS 6 –

UDID是苹果设备的“绝对”唯一标识符,UDID由40位16进制数的字母组成,伴随设备始终,不会因用程序卸载、系统重装而发生变化,也就是说,通过一个UDID,一定能够定位到某台设备。

这个绝对的标识符已经在iOS 6开始,不允许应用程序获取到;自2013年5月1日开始,含有获取UDID行为的应用程序也不会被AppStore审核通过。基于安全的角度,这样做是合理的,因为这个设备号作为设备识别的主键,可以关联机主各式各样的信息(姓名、住址、性别,甚至银行卡号等等)。

标识符示例:39efc77b8fade90424462a660aa1f01e

1.4 OpenUDID

目前可能不可用 | 可变 | 相对唯一 | iOS 6 +

在搜索UDID相关信息的时候,我发现了OpenUDID,这是UDID被苹果禁止应用程序获取后的一种替代方案,介绍相关方案的文章大多是2014 ~ 2016年。

OpenUDID设计的目的是不依赖硬件来生成一个唯一编号,并且尽可能保持这个编号不变。

有介绍说:

每台iOS设备的OpenUDID是通过第一个带有OpenUDID SDK包的App生成,如果你完全删除全部带有OpenUDID SDK包的App(比如恢复系统等),那么OpenUDID会重新生成,而且和之前的值会不同,相当于新设备。

也就意味着,使用SDK生成的Open UDID,也有较大的可能会被重置,从而变成一台“新设备”。

同样的还有一个叫做“SecureUDID”的,功能类似。

1.5 UUID(Universally Unique Identifier) 通用唯一识别码

目前可能不可用 | 可变 | 相对唯一 | iOS 6 +

在搜索OpenUDID这一类可替代UDID的方案时,我还搜索到了另一个唯一标识符——UUID。从名称上来看,它的作用也是希望通过一定的手段,生成一个唯一且尽可能不变的设备编号,来标记这台设备。

根据搜索到的相关文献发现,UUID在每次获取时都会产生一个新值,所有有很多方法都在试图获取到UUID后,存储到本地,尽可能长时间地不会发生变化。但如果用户删除应用程序,那么存在本地的UUID值也会随之清空,下次安装时则会产生新值。

1.6 MAC地址(MAC Adress)MAC地址

目前不可用 | 不变 | 绝对唯一 | iOS 7 –

MAC的全称是Media Access Control,它是物理网络层级方面分配给网络适配器的,又被称作“物理地址”、“链路地址”、“硬件地址”。也就意味着,一台带有连接网络功能的设备,其网络设备(Wi-Fi模块、以太网卡等)都会有一个唯一的MAC地址。

在之前,通过MAC地址,一般都能唯一地识别一台设备。但苹果现在已经禁用应用程序获取MAC地址了,因此这一条路也行不通了。苹果的这个操作和禁用应用程序获取UDID的理由是一样的。(不得不说设备隐私保护这方面苹果做的的确到位。)

2 安卓设备

2.1 IMEI (International Mobile Equipment Identity)国际移动设备识别码

目前可用 | 不变 | 绝对唯一 | 安卓M- 自由获取,安卓M+ 授权获取

IMEI是区别移动设备的标志,储存在移动设备中,可用于监控被窃或无效的移动设备。

IMEI由15位数字组成,其组成为:
1、前6位数(TAC)是”型号核准号码”,一般代表机型。
2、接着的2位数(FAC)是”最后装配号”,一般代表产地。
3、之后的6位数(SNR)是”串号”,一般代表生产顺序号。
4、最后1位数(SP)通常是”0”,为检验码,目前暂备用。

每一台能够连接移动电话网络(也就是平常使用的2G / 3G / 4G / 5G网络)设备都会有至少一个IMEI编码。像双卡双待手机,一次性可以接入两个移动电话网络,所以会有两个IMEI编码。但如果是无法连接移动电话网络,只能使用Wi-Fi或蓝牙的设备,比如一些中低端安卓平板电脑,就没有IMEI编码。

其实,iPhone和安卓手机都具有IMEI编码,只不过iOS已经无法获取IMEI了。

安卓在Android M开始,增加了“获取手机信息”的权限管理,应用程序在获取手机号、IMEI及IMSI时,系统会征得用户的同意,当然,授权给一个应用程序一次权限后,以后这个应用程序就可以随便获取IMEI之类的手机信息了。我遇到过很多应用程序,不授权IMEI之类的“手机信息”,就不能正常使用。

目前来看,IMEI可以作为单台设备的唯一识别符,如果能获取到,当然是最佳选择(排除IMEI被人为篡改的情况)。但是用户不授权,以及一些今后对权限获取更加严格的管理(比如小米在MIUI12推出了“空白通行证”,在获得一些敏感数据时返回空值或伪造数据),也将会很难拿到这个唯一标识符,或者拿到不正确的值。

MIUI12空白通行证
MIUI12空白通行证

2.2 OAID 匿名设备标识符

目前可用 | 不变 | 绝对唯一 | 适用与国内安卓厂商的指定版本

知道OAID这个标识符,还是从公司的数据投递规范中见到的。在网上搜了一下,发现这个OAID是国内安卓厂商联盟发起的,旨在“规范移动智能终端补充设备标识体系的体系架构、功能要求、接口要求以及安全要求,使设备生产企业统一开发接口,为移动应用开发者提供统一调用方式,方便移动应用接入、减小维护成本”。从另一方面看,也意味着国内安卓厂商试图绕过Android Q。

从规范上来看,OAID适用于国内安卓应用厂商的广告数据标识,即适用于个性化体检和广告服务,这一点和苹果的IDFA取值类似。

国内安卓厂商诸如华为、小米、vivo、oppo都在这个联盟内,也就意味着这些国内厂商生产的、面向中国大陆的移动设备,都可以获得相对位移的OAID,用于标记某一台独立的设备。

适用OAID的厂商及时间计划表
适用OAID的厂商及时间计划表
移动智能设备标识
移动智能设备标识

根据这样的原理,与苹果IDFA类似,都会存在用户重置OAID的情况(且重置起来比较容易),所面临的问题也是相同的——同一个物理硬件,可能在历史上产生多个OAID。

2.3 MAC地址(MAC Adress)MAC地址

目前可能不可用 | 不变 | 绝对唯一 | Android M –

Android M开始,MAC Address也因“用户隐私保护”的原因,拒绝应用程序获得。应用程序试图获得MAC Adress时,会获得“02:00:00:00:00:00”这样的固定值。

值得注意的是,与网络有关的设备,一般都会有一个独特的MAC Address(比如移动网络收发器、Wi-Fi收发器、以太网接口等等),我在网上搜索到了一些获取Android M及更高系统MAC Address的办法,但有一些是规避了某些设备的(比如只获取到了以太网卡的地址)。

2.4 Android ID

在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。

Android ID对于我来说,是一个比较陌生的词汇,目前在网上能找到的信息有限。问过一个开发同学,他说这个东西一般是由一些SDK生成,并想办法保持统一。对于Android ID,目前我假设它能表示唯一的设备。

3 实战

在实际数据投递和应用的过程中,我们会将各系统的相关主要标识符数据都投递上去,以便在发生设备标识符变化时,用映射的方法找到原有的“老设备”,不将其计入“新设备”行列。

在取用时,部分数据可能会使用MD5加密,将加密后的数据递交到日志平台中。

具体的数据值包含:

  • iOS
    • IDFA
    • OpenUDID
  • 安卓
    • IMEI
    • OAID
    • MAC Address
    • Android ID
  • 根据已有的标识符,混淆计算后的值。

但在实际使用时,这些标识符能满足80%的业务场景(例如DAU计算),但如果真的较起真来,要求设备全都能一一匹配,目前还没有办法解决这个问题。或许有更好的办法,我还在继续寻找。

4 Web / HTML5 / 浏览器

将这一类放在最后,且独立于实战以外,是因为网页端的“设备唯一”本身就是一个伪命题。

由HTML + CSS + JavaScript + … 组成的网页,一般都需要寄生在容器之内,这个容器一般是浏览器,或者应用程序中的WebView框架中。常规的浏览器,又寄生在操作系统之上。Web页面能够适应多种环境,所以所寄生的操作系统,除了前面说到的iOS、安卓以外,还有Windows 、 Linux系列等等。

单说Windows,其“设备唯一”的方法也有很多,比如以太网卡的MAC Address,或者硬盘的序列号,亦或是浏览器的“User-Agent”标记。但是这些分别面临几个困难:

  1. 设备的硬件信息,相当多的情况下是无法获取的。浏览器本身无法给到诸如MAC Address这样的设备信息。
  2. 相当多的环境信息是容易发生变化的。
    1. User-Agent是浏览器告诉网站的一个特别标记,内容包括操作系统、浏览器信息,比如如下的样子。但这些信息所透露的信息有限。
      Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36
    2. Cookie是服务器传递给浏览器,用于识别用户及会话的标记。Cookie容易被当前网站获取到,但会发生变化(比如用户注销登录,或者清理Cookies缓存等等)

我咨询过我们的前端开发同事,他说这个问题没有很好的解决办法。不过他说,有一种方法(Fraud detection API),可以根据浏览器的运行环境,获取一切信息,产生一个Hash来标记设备。我看了一下这个方法的Demo,是通过获取IP、所在位置、浏览器信息,进行整合后生成一个识别号。我试着使用同一台浏览器的正常模式、隐身模式分别访问Demo,生成的ID是一致的,但是使用同一台Windows电脑的不同浏览器,生成了不同的设备ID。

不过从这方面看来,对于Web网页,一台浏览器可以视作一台设备,这也是合理的。

参考文献

    1. 什么是IDFA , 简书 , nil_C
    2. 什么是IDFA(带你了解什么是IDFA) , 脚本之家
    3. iOS – 广告标识符(IDFA & IDFV) , 简书 , nil_C
    4. OpenUDID 是否足够替代 UDID 使用?有何不同? , 知乎
    5. iOS获取设备的唯一标识的方法总结以及最好的方法  , 简书 , iOS开发小学生
    6. OpenUDID 是否足够替代 UDID 使用?有何不同? , 知乎
    7. iOS设备UUID的获取方法(不变的唯一值) , CSDN , ThomasYB
    8. UDID和UUID的区别 , 简书 , 一个人在路上走下去
    9. iOS平台UDID方案比较 , 博客园 , 成长的路上(Moonlight)
    10. 广告服务(OAID) , 华为官网
    11. 移动智能设备标识公共服务平台 , 移动安全联盟MSA官网
    12. Android MacAddress 适配心得 , CSDN  , 果风
    13. Android M 如何获取 Wifi MAC地址 , 简书 , Viking_Den
    14. 获取Android设备唯一标识码 , 博客园 , ☆绿茶☆
    15. 如何从浏览器识别设备并获取唯一的ID , IT屋

已发布

分类

来自

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论审核已启用。您的评论可能需要一段时间后才能被显示。