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

2023-05-16

前言

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

标识符特性

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 更新计算机策略命令,组策略更新命令

    对于Windows 2000域来说 xff0c 如果你想让新修改的计算机策略立即生效的话 xff0c 可以依次单击 开始 运行 命令 xff0c 打开系统运行对话框 xff0c 并在其中输入字符串命令 cmd xff0c 单击 确定 按钮后
  • 嵌入式安卓项目笔记

    前言 xff1a 时间2021年7月电子科大人文交流月课程 嵌入式安卓系统开发 的大作业 项目描述 基于VM虚拟机Ubuntu 18 04 参考老师所给的suspendmonitor例程 xff0c 实现USB插拔监控驱动 43 APP用户
  • (一)DSP28335

    前言 xff1a 用于记录一些在学习实验室48V无人机项目所用的DSP28335时的一些心得体会 xff0c 主要参考资料是普中科技的那个资料手册 1 通信相关 区分开串口通信与串行通信 xff0c 串口通信 xff08 Serial Co
  • arm中的程序计数器PC

    在cpu中 xff0c 一条指令的执行简单的划分为 xff1a 取指 译码 执行 xff0c 三个部分 pc中存放的是下一条将要 执行 的指令的地址 xff0c 这里的执行并不是取指 译码 执行中的第三个步骤 xff0c 而是指的将存放于内
  • 韦东山第一期课程内容概要

    韦东山第一期课程内容概要 1一个嵌入式程序要运行所需的东西1 1第一条指令 b reset1 2 reset要完成的事件1 2 1设置开门狗1 2 2设置时钟1 2 3判断启动方式并设置堆栈1 2 4代码重定位 1 3执行main函数 12
  • 韦东山第一二期衔接课程内容概要

    韦东山第一二期衔接课程内容概要 0 使得一个裸板Jz2440能运行linux应用程序的过程1 uboot启动内核总结1 1 u boot分析之编译体验1 2 u boot分析之Makefile结构分析1 3 u boot分析之源码第一阶段1
  • 嵌入式总线与通信

    嵌入式总线与通信 I2C通信I2C通信的特点I2C通信协议I2C硬件连接I2C在一条数据线SDA上如何实现双向传输 xff1f xff08 如何实现半双工 xff09 SOC上的I2C通用硬件接口I2C接口与接口之间的连接I2C设备在整个A
  • jquery为动态dom元素绑定点击事件(比如动态生成的表格)

    js为动态dom元素绑定点击事件 需要给页面动态加载还未出现的元素添加事件时 xff0c 可以用jQuery的on xff0c live xff0c delegate来绑定事件 叫做委派事件 比如控制的动态生成的表格 xff0c 给一列中的
  • 嵌入式Arm+Linux中断与异常全流程讲解

    嵌入式ARM 43 Linux中断全流程讲解 ARM处理器级别的中断 异常 ARM的异常类型CPU如何检测到异常信息 进入异常处理后怎么返回前置知识 xff1a 流水线 xff0c 指令周期 xff0c 机器周期 xff0c 时钟周期复位
  • Linux设备树

    Linux设备树 1 设备树的引进与体验字符设备驱动程序的三种写法使用设备树时对应的驱动编程只想使用设备树不想深入研究怎么办 本文章基于韦东山关于设备树的课程以及自己的一些想法 xff0c 目录结构和韦东山老师的视频结构相同 1 设备树的引
  • 一些零碎知识点的索引

    一些零碎知识点的索引 前言操作系统 xff08 主要是纯Linux系统级的 xff09 Linux内存管理slab的着色写时复制的应用场景内核高端内存栈查看一个进程的地址空间分布 xff08 代码 数据 栈 xff09 匿名映射Linux中
  • Linux wget遭遇证书不可信(Wget error: ERROR: The certificate of is not trusted.)解决方法

    新安装的debian9系统使用中发现wget时提示证书问题 xff0c 搜索资料得知是缺少ca certificates包引起 Linux安装ca certificates包命令 CentOS系统 用这个 yum install y ca
  • 使用Dnsmasq来解锁Netflix(奈飞)流媒体服务

    原理 xff1a 在一台能看Netflix的IP配置Netflix解锁DNS脚本 xff0c 然后其他不能看Netflix的小鸡使用这个能看的机器的DNS xff0c 达到能看的目的 参考文章 xff1a https www 863134
  • 将它人docker镜像备份到自己docker仓库

    前提 xff1a 机器上安装好docker 1 先创建Docker hub 帐号 xff0c 并创建仓库 首先你需要一个docker hub 帐号 xff0c 记住username xff0c password xff0c email xf
  • CentOS 7 自己手动开启 BBR 加速教程

    下载更换内核 最新内核查看这里 xff1a http elrepo org linux kernel el7 x86 64 RPMS 1 运行以下代码 xff1a rpm import https www span class hljs p
  • Linux中提示-bash: wget: command not found的解决方法

    Liunx系统中 xff0c bash wget command not found是找不到命令的意思 xff0c 也就是无法执行下载命令 xff0c 主要是因为你的系统太干净了 xff0c 没有安装下载命令的控制器 xff0c 我们给系统
  • Linux如何更改root用户密码

    可以使用passwd命令来修改用户的密码 passwd命令用于对用户的密码进行管理 xff0c 可以设置 修改 删除密码 用法示例 xff1a 修改root用户的密码 sudo passwd root 或者直接passwd root
  • Debian 9快速开启Google BBR的方法

    Google BBR是一个TCP加速优化工具 xff0c 类似于锐速 xff0c 可用于优化TCP连接 xff0c 最近Google开源了其TCP BBR拥塞控制算法 xff0c 并提交到了Linux内核 根据实地测试 xff0c 在部署了
  • 解决xshell终端主机名和用户名不显示颜色

    设置完成后是这样 步骤如下 1 打开你连接的Linux服务器 2 在用户文件夹下 xff0c 打开终端 xff0c 或者输入ctrl 43 h显示隐藏文件 3 打开这个文件 bashrc 把这个注释取消掉就可以了
  • 关于安卓唯一标识的汇总及最佳做法

    前言 识别用户唯一性 xff0c 是每个做应用所遇到的问题之一 通常我们会希望有一个唯一的字符 xff0c 去识别关联我们的用户 标识符特性 Android 操作系统提供了多种具有不同行为特性的 ID 我们应该使用何种 ID 取决于以下特性