=Start=
缘由:
最近在做这一块的数据分析,所以整理一下在 iOS/Android 系统上有哪些指标可以作为设备唯一标识符或是辅助唯一确定一台设备,方便以后参考。
正文:
参考解答:
# iOS
iOS 10 IDFA 新策略
`
当Apple设备升级到 iOS10 及以后版本,且开启了限制广告跟踪的情况下,在获取 IDFA 时会返回:
00000000-0000-0000-0000-000000000000
`
iOS 10 and IDFA zeroed attribution
iOS获取设备UUID和IDFA
`
UDID #iOS 5之后废弃
IDFV
IDFA #iOS 10之后可能为0
MAC地址 #iOS 7之后废弃
`
# Android
https://android-developers.googleblog.com/2011/03/identifying-app-installations.html
How can I get the UUID of my Android phone in an application?
Android唯一标识符最佳做法
`
我们建议您在使用 Android 标识符时遵循以下原则:
原则 1:避免使用硬件标识符。您可以在大多数用例中避免使用 SSAID (Android ID) 和 IMEI 等硬件标识符,而必需功能也不会受到限制。
原则 2:只为用户分析或广告用例使用广告 ID。使用广告 ID 时,务必遵守限制广告追踪标记,确保标识符无法与个人可识别信息 (PII) 建立关联,并避免桥接广告 ID 重置。
原则 3:尽一切可能为防欺诈支付和电话以外的所有其他用例使用实例 ID 或私密存储的 GUID。对于绝大多数非广告用例,使用实例 ID 或 GUID 应该足矣。
原则 4:使用适合您的用例的 API 以尽量降低隐私权风险。为高价值内容保护使用 DRM API,为滥用预防使用 SafetyNet API。Safetynet API 是能够确定设备真伪而又不会招致隐私权风险的最简单方法。
`
android获取设备唯一标识完美解决方案的思考以及实现方式
Is there a unique Android device ID?
参考链接:
- 如上
=END=
《 “iOS/Android的设备唯一标识符” 》 有 18 条评论
聊一聊薅羊毛党最爱用的改机神器
https://media.weibo.cn/article?id=2309404283470665937933
`
本文讨论了薅羊毛的危害,羊毛党使用的某些技术以及一些对抗羊毛党的思路。
0x00 什么是薅羊毛
薅羊毛,简单来讲就是通过刷活动来获取奖励。举例来说:某公司搞推广活动,介绍一个新用户奖励10元,如果真的去介绍是很困难的,所以羊毛党要做的就是自己注册很多账号,并邀请自己的账号来获取奖励。又或者刷注册、刷点击等等,都算薅羊毛项目之一。
简单总结一下羊毛党的危害:
1、运营成本高,推广费用在短时间都被羊毛党薅干,导致资损。
2、本来推广的费用是给正常用户的一些福利,结果被羊毛党薅走,影响正常用户的体验和一些网站活动的口碑。
3、对服务器带来一定的压力,严重的话会导致服务器宕机,影响活动的正常进行。
0x01 基础对抗
一机一号一券。也就是说一台手机只能注册一个账号才能领到一个红包(优惠券)。
0x02中级对抗
既然平台对机器进行了限制,那么羊毛党有三个选择:1. 真的买一堆机器(根据用户行为进行判断)。2. 使用虚拟机(分析很难伪造的虚拟机特征)。3. 用改机神器,让一台机器化身千万台机器。
0x03 改机神器
在Android和iOS平台上都有大量的改机神器,他们的基本原理是都是在root(越狱)的基础上,对app获取系统和设备信息的API进行了hook,然后将内容替换为伪造的系统和设备信息(java层hook,native层hook,替换系统配置文件,以及屏蔽文件等)。
0x04 对抗改机神器的思路
1. 改机神器会hook大量的信息获取API,但依然会漏掉一些可以对机器进行唯一标示的API函数,因此我们可以寻找这样的API函数并使其成为设备唯一标识符的参考。
2. 虽然改机神器hook了一些关键的API,但是依然有办法绕过这些hook,并获取到真实的数据,这里会涉及到一些内存和汇编的对抗技术。
3. 就算是改机神器伪造了机器的数据,但是通过云端的一些算法,依然可以识别出这些伪造的设备。如果再配合上环境指纹和行为信息的话,即使是全部数据都是伪造的,依然可以有方法识别出来羊毛党的流量。
`
探针盒子收集附近的手机号码和个人信息是怎么实现的?普通人怎么防范?
https://daily.zhihu.com/story/9709274
https://www.zhihu.com/question/303176001
`
收集 MAC 地址,很简单,只要 Wi-Fi 开启,手机会广播(以及跟 SSID 源交互)自己的 MAC 地址,在人流量较多的地方,“探针”只要“探”一下即可获得大量地址,直到这个地方的信号太过拥挤,通讯质量太差或是缓存满了为止。
iPhone 用户则需要升级到至少 iOS 9,才能够获得比较好的防护(iOS 8 的太初级了),而且 iOS 版本越高,往往防追踪能力越强(例如 iOS 12 的防跟踪)。在 Wi-Fi MAC 地址防护上,iOS 10 就已经基本完备了,也就是说,iPhone 7 以后的用户即使不升级系统,也能得到最高限度的一定保护,而 iPhone 7 以下机型最好运行 iOS 10 或更高版本。
iPhone 4S 无法随机生成 MAC 地址,多高系统也没用。
最重要的,不要胡乱连接 Wi-Fi,大型连锁快餐店和大型连锁商场或许还行,但是其他地方我不敢保证。
`
2019 央视 3·15 曝光案例全面盘点 – 4/10智能骚扰电话
https://www.zhihu.com/special/20746695#NewsSpecial-SubModule-1089989412917620736
What is the risk of leaking IMEI / IMSI numbers over a network
https://security.stackexchange.com/questions/49343/what-is-the-risk-of-leaking-imei-imsi-numbers-over-a-network
`
IMEI是手机的唯一全球标识符(硬件元素),而IMSI是SIM卡的唯一全球标识符(因此它可以或多或少地映射到拥有它的人身上)。
IMEI 是和Android手机 硬件相关 的参数,同一台手机的IMEI相同,一般情况下不同手机的IMEI不同;
IMSI 是和Android手机 SIM卡相关 的参数,即同一台手机换了SIM卡之后,IMSI就不一样了。
`
https://www.quora.com/What-is-the-difference-between-ICCID-IMSI-and-IMEI-numbers
华为宣布EMUI10将取消IMEI支持,改推OAID规范清除广告毒瘤
https://zhuanlan.zhihu.com/p/69810647
Android Q 将获得大量的隐私保护功能
https://www.oschina.net/news/105233/android-q-to-get-a-ton-of-new-privacy-features
https://www.zdnet.com/article/android-q-to-get-a-ton-of-new-privacy-features/
实测SDK“偷”数据:隐瞒收集、明文回传!你装了哪些App它也知道
https://mp.weixin.qq.com/s/b9NSzS71JVC4_0DglgHDJw
`
为了摸清SDK获取用户个人信息的合规现状,近日,南都个人信息保护研究中心、中国金融认证中心(CFCA)对60款常用App以及主流SDK进行了测评,并联合发布《常用第三方SDK收集使用个人信息测评报告》(下称《报告》)。
《报告》显示,讯飞、TalkingData等SDK收集的个人信息未在其嵌入App的隐私政策或弹窗中被提及;友盟SDK和高德地图SDK可能隐瞒了其要收集的个人信息;支付宝、携程、百度地图、美团等SDK则会向自己的服务器明文回传用户的个人信息甚至个人敏感信息。
平均每款App使用19.3个SDK,获取IMEI号最多
国家标准《信息安全技术 个人信息安全规范》修订草案要求,当个人信息控制者在其产品或服务中接入具备收集个人信息功能的第三方产品或服务时,应通过合同等形式明确双方的安全责任及应实施的个人信息安全措施,并要求第三方向个人信息主体征得收集个人信息的授权同意。
也就是说,SDK收集个人信息也需要经过用户授权同意。由于SDK不直接与用户交互,使用它的App有义务代为向用户告知。然而,不少App并没有做到——用户的隐私很可能在不知情的情况下被SDK收集了。
`
http://research.nandu.com/piprc/static/pdf/%E5%B8%B8%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9SDK%E6%94%B6%E9%9B%86%E4%BD%BF%E7%94%A8%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF%E6%B5%8B%E8%AF%84%E6%8A%A5%E5%91%8A.pdf
Android下如何获取已安装app应用列表
`
final PackageManager pm = getPackageManager();
//get a list of installed apps.
List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo packageInfo : packages) {
Log.d(TAG, “Installed package :” + packageInfo.packageName);
Log.d(TAG, “Source dir : ” + packageInfo.sourceDir);
Log.d(TAG, “Launch Activity :” + pm.getLaunchIntentForPackage(packageInfo.packageName));
}
`
https://stackoverflow.com/questions/2695746/how-to-get-a-list-of-installed-android-applications-and-pick-one-to-run
https://developer.android.com/reference/android/content/pm/PackageManager
iOS 获取手机安装的所有的Apps
https://www.jianshu.com/p/10b504e446a9
`
在 iOS 11 以前我们可以使用(私有API) LSApplicationWorkspace 来获取手机上已安装的应用列表;
在 iOS 11 上获取所有已安装应用接口被禁,但可以根据BundleId检查App是否存在。
`
https://www.jianshu.com/p/8e5ddae29841
iOS11 获取手机已安装应用列表
https://www.cnblogs.com/ciml/p/9224826.html
Android 流量监测的原理
https://blog.csdn.net/wangbaochu/article/details/44649913
`
Alilang/阿里郎
com.alibaba.android.security.activity
钉钉
com.alibaba.android.rimet
`
Android手机卸载第三方应用
https://www.cnblogs.com/csj2018/p/9739400.html
设备指纹详解
https://zhuanlan.zhihu.com/p/68852244
手机的IMEI、MEID、ICCID、UDID、IMSI
https://blog.csdn.net/errizh/article/details/53308231
https://en.wikipedia.org/wiki/Mobile_equipment_identifier
https://en.wikipedia.org/wiki/International_Mobile_Equipment_Identity
https://en.wikipedia.org/wiki/International_mobile_subscriber_identity
https://en.wikipedia.org/wiki/SIM_card#ICCID
https://www.imei.info/faq-what-is-IMEI/
https://www.imei.info/faq-what-is-MEID/
移动端设备ID标识整理(IMEI、MEID、ICCID…
https://www.jianshu.com/p/f888390e37d5
IMEI值和MEID值的获取
https://www.jianshu.com/p/740e9116281f
`
MEID是CDMA手机的识别码,IMEI是GSM、WCDMA手机的识别码,对应到国内的运营商如下:
移动:2G使用 GSM, 3G使用 TD-SCDMA 4G使用TD-LTE
联通:2G使用 GSM, 3G使用 WCDMA 4G使用TD-LTE、FDD-LTE
电信:2G使用 CDMA,3G使用 CDMA2000 4G使用TD-LTE、FDD-LTE
所以,你知道了,IMEI是联通移动手机的标识,MEID是电信手机的标识。
`
移动安全联盟
http://www.msa-alliance.cn/col.jsp?id=120
`
移动智能终端补充设备标识体系架构共涉及四类实体,包括开发者、开发者开发的应用软件、移动智能终端设备的操作系统、用户及用户使用的设备。为保护用户用户的隐私和标识设备的唯一性,根据不同使用对象和不同用途,基于移动智能终端设备,分别生成设备唯一标识符、匿名设备标识符、开发者匿名设备标识符和应用匿名设备标识符,将这四个设备标识符构成补充设备标识体系。
UDID – 设备唯一标识符是指设备唯一硬件标识,设备生产时根据特定的硬件信息生成,可用于设备的生产环境及合法性校验。
OAID – 匿名设备标识符是可以连接所有应用数据的标识符,移动智能终端系统首次启动后立即生成,可用于广告业务。
VAID – 开发者匿名设备标识符是指用于开放给开发者的设备标识符,可在应用安装时产生,可用于同一开发者不同应用之间的推荐。
AAID – 应用匿名设备标识符是指第三方应用获取的匿名设备标识,可在应用安装时产生,可用于用户统计等。
应用向系统发送获取设备标识的请求时,系统需要对应用采取合适的手段进行身份验证,并验证其请求符合策略规定,才可将结果返回给应用。
UDID 、OAID、VAID和AAID这四个设备标识符之间不存在映射关系。
`
https://mtj.baidu.com/static/userguide/book/android/oaid.html
`
因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。
近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。
`
https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_android_oaid-7541893.html
https://github.com/guxiaonian/MobileInfo/wiki/Oaid
Android获取OAID
https://blog.csdn.net/haovip123/java/article/details/101679971
https://github.com/haoguibao/OaidDemo/tree/master
`
IMEI 国际移动设备识别码 International Mobile Equipment Identity 15~17位
UDID 设备唯一标识符 Unique Device Identifier 最长64位
OAID 匿名设备标识符 Open Anonymous Device Identifier 最长64位
VAID 开发者匿名设备标识符 Vender Anonymous Device Identifier 最长64位
AAID 应用匿名设备标识符 Application Anonymous Device Identifier 最长64位
`
设备风控攻防新挑战——定制ROM改机
https://mp.weixin.qq.com/s/0f2fVf_z_iu9mg8ny887nA
iOS 14隐私博弈场:数据追踪,苹果说No
https://mp.weixin.qq.com/s/vyfRltJeieVGzxE-lITTjQ
`
IDFA(Identifier for Advertising,广告识别符)是一种iOS设备识别码,广告平台可借此对广告和用户进行追踪,通过抓取用户浏览记录,打通不同App之间的广告。
最常见的就是当你在某个电商app浏览了一款商品后打开了某个资讯类app时,就可以看到关于这款商品的广告。
可在iOS 14中,一个极其重要的变化出现了:用户可以通过授权跟踪权限来决定是否被广告商识别,授权行为从系统层面下沉到了App层面。
在手机中直观地体现就是,当App获取IDFA时,就会像获取相机权限、相册权限一样,弹出一个窗口,出现“****想要获取权限以在其他公司拥有的app和网站中追踪您的活动”的字样。用户可以选择“允许追踪”或“禁止追踪”。
因为广告平台既可以通过IDFA记录用户点击、购买以及转化次数,完成广告的即时效果测量,也可以关注到广告的长期效果,记录用户在下载完应用程序之后的留存、付费等相关信息,实现广告归因和衡量广告投放效果。
如果很多用户不同意软件追踪自己的IDFA,这些效果都无法被准确监测,进而影响广告变现业务。
此外,除了IDFA,剪切板和LocalNetwork(本地网络)也围绕用户隐私有了大变化。这些隐私新规使得获取用户身份充满不确定性,洪雷觉得,跨App之间的用户识别也成为了问题,或者说“可能就识别不到用户了”。
==
除了鼓励用户(App在弹出窗口寻求授权的时候,有一段文字可以自定义,苏玥相信,App会写一些例如“如果不授权,很有可能无法享受产品提供的服务”等类似的话术去劝导用户允许追踪)之外,企业还有一条对策,那就是主动适配苹果公司的解决方案——SKAdNetwork。这是苹果2018年推出的广告系统,目前已经迭代到2.0版本。
SKAdNetwork不依靠IDFA,广告平台可以在不获取IDFA的前提下,通过API进行转化归因,对用户的点击、购买或安装行为进行追踪,但是不会包含设备或者用户的相关信息。
简单的来说,SKAdNetwork就像便利店的收银员,只知道用户购买了什么商品、是什么时间购买的商品、价格是多少,并不知道用户的年龄、职业、喜好等个人隐私信息。
==
或许是担心广告商们集体倒戈到安卓端,又或许是因为引起了众多诉讼,在iOS 14正式版发布前,苹果宣布IDFA追踪许可功能将于明年年初生效,理由是“我们希望给开发人员足够的时间进行必要的更改”。
迫于压力的妥协能持续多久不得而知,未来,苹果如何应对也是一个未知数。
但对于苏玥而言,至少可以肯定的是,以后,广告行业的发展会对于统一的标识方案有需求。未来,很有可能会由中国广告协会、中国信息通信研究院等协会牵头,制定一个行业标准,或者推出IP+UA(模糊匹配)方式,又或者通过一些非隐私的参数的组合,来去生成一个标识来追踪一个人。
“我觉得一年之后的话,情况应该变得更明朗一点,会形成新的平衡” 苏玥说。
`
【Android笔记 二】Location获取地理位置信息(上)
https://blog.csdn.net/octobershiner/article/details/6628241
Maps SDK for Android -> 指南 -> 位置数据
`
如果您的应用需要访问用户的位置信息,您必须向应用添加相关的 Android 位置权限来请求权限。
Android 提供两种位置权限: ACCESS_COARSE_LOCATION 和 ACCESS_FINE_LOCATION 。您选择的权限决定了 API 所返回位置的精确度。您只需根据自己需要的精确度请求其中一种 Android 位置权限:
android.permission.ACCESS_COARSE_LOCATION – 允许 API 使用 WLAN 或移动数据流量(或同时利用两者)来确定设备的位置。API 返回的位置精确度大约相当于城市街区。
android.permission.ACCESS_FINE_LOCATION – 允许 API 利用包括全球定位系统 (GPS) 在内的可用位置提供商以及 WLAN 和移动数据流量尽可能精确地确定位置。
ACCESS_FINE_LOCATION
提供的位置信息比请求 ACCESS_COARSE_LOCATION 时所提供的位置信息更准确。这是某些连接任务(例如通过蓝牙低功耗 (BLE) 连接到附近的设备)所必需的权限。
`
https://developers.google.com/maps/documentation/android-sdk/location?hl=zh-cn
https://developer.android.com/training/location/permissions
How to check app is installed or not in phone
https://stackoverflow.com/questions/41545283/how-to-check-app-is-installed-or-not-in-phone/
`
Beginning with iOS 9.0, that is not possible.
Apps for iOS 9 and later must have a list of requested URL schemes in the Info.plist before being allowed to use canOpenURL:. This is to protect user privacy, as advertisers were abusing this functionality in an arguably invasive fashion.
结论:
在 iOS 9 之前,可以通过 url scheme 的方式进行任意探测;在这个版本之后,你需要先把需要探测的APP的 url scheme 提前放入 Info.plist 文件,然后才可以。
`
https://stackoverflow.com/questions/6854362/iphone-check-if-an-app-is-installed
https://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
Check if application Already installed
https://developer.apple.com/forums/thread/84733
https://www.hackingwithswift.com/example-code/system/how-to-check-whether-your-other-apps-are-installed
http://findnerd.com/list/view/How-to-Detect-if-an-app-is-installed-in-iOS-or-Android-Using-Javascript-and-Deep-Linking/4287/
identifierForVendor
https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor
UIDevice currentDevice identifierForVendor – can this change on an iPad
https://stackoverflow.com/questions/31344173/uidevice-currentdevice-identifierforvendor-can-this-change-on-an-ipad
iOS—[UIDevice identifierForVendor]慎用!
https://blog.csdn.net/zhtl3333/article/details/51094381
Correct way of generating unique id for iOS device even after app reinstall using keychain
https://stackoverflow.com/questions/38146684/correct-way-of-generating-unique-id-for-ios-device-even-after-app-reinstall-usin
`
ThisDeviceOnly
加了相关选项之后,deviceID这种和设备相关的内容就不会通过keychain同步到iCloud上面去,到时候也就不会出现多个iPhone设备在1个deviceID上的情况了(理论上)
`
https://developer.apple.com/documentation/security/ksecattraccessible
https://developer.apple.com/documentation/security/ksecattraccessiblewhenpasscodesetthisdeviceonly