2020-09-07 手机设备唯一标识

2020-09-07 手机设备唯一标识,第1张

IMEI:International Mobile Equipment Identity 国际移动设备身份码的缩写。

是由15位数字组成的“电子串号”,它与每台手机一一对应,每个IMEI在世界上都是唯一的。在主板上的,重装APP不会改变。对于Android 60以后的系统,需要用户授权才能取到IMEI。

IDFA:Identifier For Advertising,iOS独有的广告标识符。

1、在同一个设备上的所有App都会取到相同的值。

2、如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,或者用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符会重新生成。

在今年iOS10推出后,苹果推出了“限制广告追踪”功能,设置的路径和iOS9一致。

不过经过实际的测试,在iOS10之前,即使用户打开这个功能,商家一样可以获取IDFA,只不过与之前的不一样了,每次切换这个开关与点击“还原广告标识符”的效果一样。

而iOS10就不一样了,当用户打开这个功能后,商家只能获取到一连串无意义的0

UDID:

用来标示设备的唯一性 。iOS 6 之后被禁止获取系统原生的UDID,但可以通过uuid,写入到钥匙串中,从而获得自定义的UDID(非系统原生),即使用户重装APP,只要每次都取这个钥匙串返回,就是不变的。

Uuid

UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。比如在当前这一秒,全世界产生的UUID都是不一样的;当然同一台设备产生的UUID也是不一样的。

通常平台会提供生成的API。是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12 。

苹果公司建议使用UUID为应用生成唯一标识字符串。重装APP后会发生改变。

并不能获得。

如果是在app内加载页面,可以让后端在加载页面的时候传递到前端,也可以由app内置js协议获取。

如果是在微信里,可以考虑用微信的唯一标识openId

概述

IMEI(International Mobile Equipment Identity)是国际移动设备识别码的缩写。俗称“手机串号”、“手机串码”、“手机序列号”,用于在GSM移动网络中识别每一部独立的手机,相当于手机的身份z号码。IMEI码适用于GSM和WCDMA制式的移动电话和铱星卫星电话,而CDMA手机采用MEID码,与IMEI码有所区别。全球每部通过正规渠道销售的GSM手机均有唯一的IMEI码。IMEI码由GSMA协会统一规划,并授权各地区组织进行分配,在中国由工业和信息化部电信终端测试技术协会(TAF)负责国内手机的入网认证,其他分配机构包括英国BABT、美国CTIA等。

简介

国际移动设备识别码(IMEI:International Mobile Equipment Identification Number)是区别移动设备的标志,储存在移动设备中,可用于监控被窃或无效的移动设备。IMEI可用移动终端设备通过键入"#06#"查得(不同厂商的手机所需输入的内容不同,同一厂商不同手机所需输入的内容也可能不同)。其总长为15位,每位数字仅使用0~9的数字。

IMEI分配

IMEI码由GSMA协会统一规划,并授权各地区组织进行分配,在中国由工业和信息化部电信终端测试技术协会(TAF)负责国内手机的入网认证,其他分配机构包括英国BABT、美国CTIA等。

最近,因公司产品及客户需要,领导让我研究免存储设备ID,以及给出一个设备ID最佳的方案(可与存储相结合)。在研究过浏览器的fingerprient2js后,颇有心得,并且看网上似乎木有完美的解决方案,于是写了这篇文章,仅供需要的开发者参考。(该算法暂未进行验证,这里先给出一个jar包,后期我会在SDK中加入调查接口,分两个jar包(测试版和正式版),希望开发者能支持测试版,稳定后使用正式版。)

在产品中,首先肯定要尽量避免权限,其次考虑卸载APP后ID不一致的问题,再就是尽量结合存储,降低卸载或重装app时,设备ID改变的概率。最后,设计出合理方案,对造成不利的因素进行列举。

Aandroid_id:

什么是android_id呢?当设备在第一次启动时,系统会随机产生一个64位的数字,然后以16进制的形式保存在设备上,且API提供了获取这一参数的方法:

这就是android_id,当设备重新初始化或者刷机的时候,会被重置。

除此以外,android_id还有其他的bug,比如:

1不同的设备可能会产生相同的android_id。

2有的厂商设备无法获取android_id,会返回null。

3对于CDMA的设备,ANDROID_ID和TelephonyManagergetDeviceId() 的值相同。

4不同的android系统版本稳定性不同。

B硬件序列号(SERIAL)

API给的解释是:

A hardware serial number, if available(一个硬件的序列码,如果有效的话)

so,虽然我没有用几百台手机测试,也能知道这个值有时候是无效的,说的这么隐晦。

C指纹

fingerprint:设备的唯一标识。由设备的多个信息拼接合成。

也是在JavaScript才接触到这个单词”fingerprint“,这个词也很生动,意思是能大概的标识一个设备,像指纹一样,但不排除重复的可能性。

理论上讲用这个属性是可以标识一个设备的,但是其实并不是,两台一摸一样的新手机,这个值相同的可能性是很多的。为了更加进一步的精确,后面还会介绍几个属性,并把几个属性结合在一起,生成一个接近100%的UUID。

Dandroid系统提供了获取android系统版本号,生产厂商,固件版本推出时间的API

Eandroid系统提供了当前android设备是12或24小时制显示时间的API,

Fandroid系统提供了当前android设备的修订版本列表,显示屏,主板等等参数。

G可以允许用户根据需求用自定义字符串去为FP做贡献,比如IP地址等

方案:

在不需要用户权限的前提下,网上最完美的方案是将android_id和硬件序列号,如果其中任意一种失效就使用另外一种。受FingerPrint2js的启发,我看了Android获取系统硬件相关的API,将所有不经常变化且能代表一定用户群体的属性都取出来进行MD5运算,包含但不限于依据中所述的信息。准确性还需进一步验证,但理论上要比FingerPrint2js准确性高,也在网上给出的比较好的方案基础上进一步缩小了FP可能重复的概率。

1第一次进入APP时,获取系统相关配置信息生成FP,存入SP。

2每次访问,先从SP取,没有再通过相关配置信息生成FP,存入SP。

3封装成jar,只给用户暴露出获取ID的接口、传递自定义信息构建FP的接口以及第一次安装时间戳的接口(或设置标签调用的接口)

单纯对于FP而言,有两个主要问题需要解决,一是FP重复的问题,相同配置的新设备重复可能性极大,增多给FP贡献的因素的数量,可以有效降低重复率。二是FP改变的问题,贡献FP的生成因素的其中一个如果改变,FP就会改变。所以如果FP的贡献因素数量过多,导致FP改变的概率也就变大,所以说客户要在两者之间做一个很好的平衡。

对比:

为android FP做贡献的各配置参数:(示例以60的华为荣耀8为例)

1Android_ID:SettingsSystemgetString(contextgetContentResolver(), SettingsSystemANDROID_ID) //低版本稳定,高版本不稳定 示例:295a4fbf716094ee

2BuildSERIAL 设备序列号(有的设备无法获取) 示例:WTK7N16923005607

3BuildFINGERPRINT 设备指纹(同样的新设备该值应该是一样的) 示例:honor/FRD-AL00/HWFRD:60/HUAWEIFRD-AL00/C00B171:user/release-keys

4BuildTIME 固件推出日期 示例:1477442228000

5BuildVERSIONINCREMENTAL 源码控制版本号 示例: C00B171

6BuildgetRadioVersion() 获取无线电固件版本 示例:212100300031,212100300031

7BuildHARDWARE 硬件名称 示例:hi3650

8BuildVERSIONSECURITY_PATCH 用户可见安全补丁level(这里我得到的是日期,可能是补丁修复的时间)示例:2016-10-01

9当前设备是12/24时制:SettingsSystemgetString(contextgetContentResolver(), SettingsSystemTIME_12_24) 示例:null(有的手机可以获取)

10BuildVERSIONSDK_INT SDK版本号 (一般讲是与系统版本号一一对应的) 示例:23

11BuildSUPPORTED_32_BIT_ABIS 支持32位ABIs的列表(数值)示例:[armeabi-v7a,armeabi]

12BuildSUPPORTED_64_BIT_ABIS 支持64位ABIs的列表(数值)示例:[arm64-v8a]

13BuildBOOTLOADER 系统启动程序版本号 示例:unknown

14BuildVERSIONRELEASE 用户可见版本 示例: 60

16BuildBOARD 主板 示例:FRD-AL00

17BuildBRAND 系统定制商 示例:honor

21BuildHOST 示例:huawei-RH2288H-V2-12L

23BuildMANUFACTURER 产品/硬件的制造商 示例:HUAWEI

25BuildPRODUCT 产品的名称 示例:FRD-AL00

26BuildTAGS 描述Build的标签(Comma-separated tags describing the build, like "unsigned,debug") 示例:release-keys

28BuildUSER 描述Build的USER 示例:jslave

31BuildVERSIONBASE_OS 基带版本 The base OS build the product is based on 示例:空值

32自定义字符串或自定义数组

以上就是关于2020-09-07 手机设备唯一标识全部的内容,包括:2020-09-07 手机设备唯一标识、微信开发通过H5获取手机IMEI号可以吗怎样获取、android获取设备唯一ID(优化方案)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9732871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存