关于安卓唯一标识的汇总及最佳做法
Posted 暮暮韶尘染
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于安卓唯一标识的汇总及最佳做法相关的知识,希望对你有一定的参考价值。
前言
识别用户唯一性,是每个做应用所遇到的问题之一。通常我们会希望有一个唯一的字符,去识别关联我们的用户。
标识符特性
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
唯一标识 DOM 节点的最佳方法是啥?
【中文标题】唯一标识 DOM 节点的最佳方法是啥?【英文标题】:What is the best way to uniquely identify a DOM node?唯一标识 DOM 节点的最佳方法是什么? 【发布时间】:2011-01-05 11:46:52 【问题描述】:什么是唯一标识 HTML 文档中所有 DOM 节点的方法。为了说明我的意思,这里有一个(虚构的)例子:
脚本 X 从 document.html 中随机选择一个 DOM 节点。 脚本 X 需要告诉脚本 Y 它选择了哪个 DOM 节点。 脚本 X 如何唯一标识它选择的 DOM 节点,以便脚本 Y 准确知道它在 document.html 中的哪个节点?我对如何唯一标识 DOM 节点非常感兴趣,以便脚本 Y 可以识别并操作它。最好,它也应该与文本节点一起使用。我可能在考虑 XPath,但我不确定如何为任何给定节点生成 unique XPath。
【问题讨论】:
【参考方案1】:您应该能够通过从节点向后工作到根节点并跟踪您所在的节点以及它是哪个兄弟节点来确定唯一的 XPath,这样您就可以得到类似的结果:
/a[1]/b[2]/c[101]/text()
这是第二个 B
节点下的第 101 个 C
节点,依此类推。因此,这是一个唯一路径,可以参考原始文档进行复制
【讨论】:
Xpath 实现在大多数语言中都可用。在命令行上,您可以使用名为 xmlstarlet 的命令行工具(只需 Google 即可) 正是我想要的!如果我的代码如下所示:hello dear world
。我如何识别“世界”节点。我会做这样的事情吗? /div[0]/p[0]/text[1] ? 是的。但是 Xpath 是从 1 开始的,而不是从 0 开始的 注意非合并的文本节点,它不能完全用 XPath 来识别。【参考方案2】:您可能想看看 XPathGen https://github.com/amouat/XPathGen
它将为给定的 DOM 节点创建 /node()[1]/node()[1]
形式的唯一 XPath。但是,XPath 存在一些问题,即未合并的文本节点和“prolog”节点,它们不能完全用 XPath 唯一标识。例如,如果您在 DOM 中有以下文档:
<a>b</a>
并添加一个文本节点成为:
<a>bc</a>
节点 b 和 c 的 XPath 将是相同的,但您仍然会有单独的 DOM 节点(除非您对文档调用 normalize)。如果您需要处理这种情况,您将需要存储文本节点的偏移量和长度。
【讨论】:
【参考方案3】:嗯,产生单个节点的 XPath 表达式应该是唯一的。 “如何为任何给定节点生成唯一的 XPath”是什么意思?
【讨论】:
对,但我正在反过来做:我知道我在哪个节点,但不知道如何到达那里;)布赖恩的回答似乎足够好。【参考方案4】:沿 XPath 轴的顺序子位置。节点是强排序的,所以说:
孩子 1 的孩子 3 的孩子 4 的孩子 5。
应该这样做。
【讨论】:
以上是关于关于安卓唯一标识的汇总及最佳做法的主要内容,如果未能解决你的问题,请参考以下文章