MeteorCat / 设备唯一标识

Created Tue, 26 Dec 2023 14:20:21 +0800 Modified Wed, 29 Oct 2025 23:24:53 +0800
1423 Words

设备唯一标识

设备唯一标识用来表示设备唯一性, 起到作用包括绑定关联广告玩家防止设备多开等, 对于 移动端 来说:

  • IMEI: 安卓的早期设备唯一码, Android10以后该设备码失效
    • Android版本 < 6.0, 只需要READ_PHONE_STATE静态权限(安装App时即可获取到该权限), 即可通过系统API TelephonyManager#getDeviceId API获取准确值.
    • 6.0 <= Android版本 <= 9.0, READ_PHONE_STATE升级为动态权限, 安装App时不会获得该权限, 需要在App运行时用户在弹窗确认授权后才可以获取
    • Android版本 >= 10.0, 设备不可变ID的隐私保护得到进一步升级, 需要READ_PRIVILEGED_PHONE_STATE权限才可以获取IMEI, 而该权限只有系统级别的应用才可以获得, 因此一般App无法获取到IMEI. android10以上获取不到IMEI
  • IDFA: iOS目前主流的获取设备码方式但获取很不稳定, 用户可开启/关闭每次切换会改变为新的取值. iOS10以下的版本关闭时也能取到唯一值, >=10的iOS版本关闭时取到的值为00000000000; 系统大版本升级(如11 到 12) IDFA也会发生变化.
  • AndroidID: Android版本 = 8.0, 应用签名|用户(即系统上的用户账号)和设备的每个组合都具有唯一的 ANDROID_ID值, 即使系统升级也不变
  • OAID: 中国移动安装联盟(简称MSA)制定的匿名设备标识符, 可用于android系统的补充设备标示, 通常android10以上的国内主流设备都可以获取. 具体 OAID 介绍以及最新覆盖厂商范围请详见 MSA官网
  • HASH_OAID: 中国移动安装联盟制定的匿名设备标识符, 国内的需要接入对应的SDK.

获取指令命令:

// IMEI获取方法, android版本>=10.0 无法获取
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
deviceId = tm.getDeviceId(); 


// IDFA获取方法
idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];


// AndroidID获取方法, Android版本 = 8.0 才会获取
Settings.System.getString(context.getApplicationContext().getContentResolver(),Settings.System.ANDROID_ID);

而对于 PC 端来说就比较复杂, 通过系统 systeminfo 获取信息:

  • ProcessorID: Window可以使用CPU-ID作为标识, 但是现代CPU处理器已经不再提供唯一而采用批次计算, 所以不能再作为唯一标识处理
    • 命令行输入指令 wmic cpu get processorid 就能查看到
  • 主板smBIOS|MachineGuid: 主板ID是基本上很多比较推荐的授权方法, 直接锁定主板id更加精确(哪怕重装系统都保持一致); 但是并非所有主板厂商都提供, 这时候返回 FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF 无效的UUID
    • Window输入指令 wmic csproduct get UUID 查看
    • Linux输入指令 dmidecode -s system-uuid 获取

对于 Web 端则需要复杂点, 因为 JS 本身受限于权限没办法获取到精细信息, 所以要获取到用户从浏览到注册的流程是十分复杂的.

浏览器涉及概念叫 finger(指纹), 用于采集浏览器相关信息生成指纹用于确定自身唯一标识绑定.

H5方面能够采集获取到信息参照下 H5文档

这里推荐 fingerprintjs2 来获取浏览器指纹, 官方宣称说精度达到 99.5% 能够完美提取用户指纹信息.

官方样例 提供检测获取到指纹 Visitor identifier 声明, 可以在浏览器获取之后提交事件把指纹相关信息打包提交上来.

另外还有新一代比较熟知的 ja3证书指纹, 本来用于反爬虫后续也被用于流量清空分析, 其利用底层网络包机制来手机内部字节数据.

Ja3证书指纹

然后跟踪方式实际上就是浏览之后获取浏览器指纹, 下载完成获取新的指纹信息, 注册账号的时候提交指纹匹配出完成归因.

怎么跟踪从浏览器访问到玩家注册落地是相当大的学问, 因为外国本身对于跟踪隐私和大数据推送审查比较严, 类似 IMEI 等方法现在越来越受限, 所以需要本身如果能够完整跟踪到对应信息也是目前需要努力的方向(简单说就是可以卖钱 :) ).