V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thisismr2
V2EX  ›  Android

android 可以像 ios keychain 那样追踪用户吗

  •  
  •   thisismr2 · 2022-02-26 14:38:36 +08:00 · 13468 次点击
    这是一个创建于 1003 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一下:

    ios 可以通过 keychain 追踪用户。 Android (仅官方 ROM 或 Google ROM 并且是最新版, 应该 12)有没有类似方案。‘

    这里追踪的定义(或相似定义)是:

    1. 安装 app
    2. 打开 app
    3. app 在某个地方做个标记 xxx
    4. 卸载 app
    5. 再次安装 app
    6. 打开 app
    7. app 会取到之前的 xxx 标记

    就目前来看 ios 不会限制 keychain 的写入。 如果 android 做不到的话,准备考虑换 android

    第 1 条附言  ·  2022-02-26 19:48:09 +08:00
    有同学可能忽略了()内的内容。
    54 条回复    2022-02-28 16:37:16 +08:00
    lisongeee
        1
    lisongeee  
       2022-02-26 14:44:54 +08:00
    如果 app 申请了外部存储空间读写权限就可以
    dingwen07
        2
    dingwen07  
       2022-02-26 14:48:27 +08:00   ❤️ 3
    iOS 你换了手机理论上都能追踪到,keychain 似乎会同步,app 也可以用 iCloud 同步来追踪

    为了这个换安卓意义不大,安卓理论上确实不能,但是应该是有奇技淫巧能追踪到,比如通过手机里安装的其他 app 采用的广告 sdk 什么的,或者你给了内置存储 /照片权限理论上也可以,在照片元数据里写追踪信息那群家伙也不是干不出来
    thisismr2
        3
    thisismr2  
    OP
       2022-02-26 15:00:15 +08:00
    @lisongeee 这个应该会弹出提示用户授权 对吧
    thisismr2
        4
    thisismr2  
    OP
       2022-02-26 15:05:14 +08:00
    @dingwen07
    > 比如通过手机里安装的其他 app 采用的广告 sdk 什么的
    这个我不太懂,或者和 ios 也一样?

    > 或者你给了内置存储 /照片权限理论上也可以
    Android 内置存储,卸载 app ,不会像 ios 那样也清除吗
    照片是不是也可以指定部分照片授权,像现在的 ios 那样
    dingwen07
        5
    dingwen07  
       2022-02-26 15:08:31 +08:00   ❤️ 1
    @thisismr2 #4
    安卓 SDK 30 版本后,只能获取到图片权限,能读取全部图片,部分图片授权功能似乎要 Android 13
    SDK 30 以下,可以申请文件访问权限,删除 app 的时候不会被删掉
    thisismr2
        6
    thisismr2  
    OP
       2022-02-26 15:11:30 +08:00
    @dingwen07
    谢谢。绝大部分都会需要存储权限,看来 android 这条路也走不通
    0o0O0o0O0o
        7
    0o0O0o0O0o  
       2022-02-26 15:16:11 +08:00
    https://www.google.com/search?q=%E7%A7%BB%E5%8A%A8%E7%AB%AF+%E8%AE%BE%E5%A4%87%E6%8C%87%E7%BA%B9+%E6%8E%A5%E5%85%A5

    利用很多奇技淫巧尽可能地收集特征结合大数据计算唯一标识,有很多专业人士会去想办法适配新版本,所以你如果完全信任机制还是挺被动的。
    icyalala
        8
    icyalala  
       2022-02-26 15:37:11 +08:00
    iOS keychain 确实可以用于追踪,的确是有问题,但这不是追踪唯一途径。
    现在各种 SDK 都用设备指纹的方案追踪,重置设置后仍然保持不变这是基本要求,所以换 Android 也避免不了。举个例子: https://cloud.tencent.com/developer/article/1685044
    Osk
        9
    Osk  
       2022-02-26 15:57:59 +08:00
    居然觉得 Android 隐私做的好???

    等 Android 100 吧... 看看 /sdcard 那一堆堆莫名奇妙的文件, 不给存储权限? 我直接退出.
    还有一堆 App 集成的 "大数据" SDK, 简直不能让人信服.
    bkmi
        10
    bkmi  
       2022-02-26 16:22:30 +08:00 via Android
    Android 上那可太多了,OAID 、数盟 ID 、还有各大厂自己搞的未公开的各种 ID ,不需要申请任何权限,完全黑盒。
    mxalbert1996
        11
    mxalbert1996  
       2022-02-26 16:25:59 +08:00 via Android   ❤️ 1
    @Osk 你要不举一个不给存储权限就退出的例子?
    nicevar
        12
    nicevar  
       2022-02-26 18:08:53 +08:00
    @bkmi 你说的这些在 30 以上都废了,什么联盟都废了
    WhatTheBridgeSay
        13
    WhatTheBridgeSay  
       2022-02-26 18:09:07 +08:00
    Android 本身是没有类似 keychain 的东西,但是安卓可能会有系统级组件提供某些如楼上所说的国产厂抱团自创的 OAID 等,但是从另一方面来说如果 App 想要追踪就势必要找一个通用且容易实现的方法,iOS 很简单可以直接用 keychain ,但是 Android 上情况就比较复杂不会单单只依赖一种
    nicevar
        14
    nicevar  
       2022-02-26 18:10:27 +08:00   ❤️ 4
    @Osk 我觉如果你不了解就没必要胡说一通,现在 sdk 在 30 以上唯一标识就做不到了,用户一刷机或者重置手机应用没办法生成不变的 uuid 。
    nicevar
        15
    nicevar  
       2022-02-26 18:21:13 +08:00
    以前的最可靠的方案是请求电话权限去读取 PhoneID ,但是现在这个阻碍越来越多,先不说用户不给权限,各大联盟更新的 sdk 后也基本上放弃了这个做法,如果编译打包在 sdk 版本 30 以上,请求外部存储权限都麻烦。
    现在个人软件做激活管理成问题了,唯一标识基本上也就是个临时值了,以前还有各种歪门邪道,随着 google 更新基本上把路都堵死了。
    zoharSoul
        16
    zoharSoul  
       2022-02-26 20:01:16 +08:00
    @dingwen07 #5 错误回答
    exploreexe
        17
    exploreexe  
       2022-02-26 21:20:29 +08:00   ❤️ 1
    按照我对安卓的理解,安卓的黑魔法比 iOS 要多太多了。。。
    bkmi
        18
    bkmi  
       2022-02-26 23:06:34 +08:00 via Android
    @nicevar 各大联盟活的好好的,刷机没试过,至于卸载重装,Xposed hook 各种 ID ,数盟都生成同一个 ID ,Android 12 上测试的
    nicevar
        19
    nicevar  
       2022-02-26 23:38:57 +08:00
    @bkmi 各大联盟活得好好的与生成不变的 uuid 有什么关系?你这是什么理解能力,你能去帮每个用户 Xposed hook?那我不直接请求电话权限就完事了假定用户全同意不就得了,还用得着这么费劲,真不知道你怎么想的。
    tanranran
        20
    tanranran  
       2022-02-26 23:49:38 +08:00
    OAID 了解一下
    bkmi
        21
    bkmi  
       2022-02-27 00:02:50 +08:00 via Android
    @nicevar 你这什么理解能力,麻烦你多读几遍,我说各大联盟活得好好的,不受 API 30 影响,用数盟的提供的 SDK ,在 Android 12 (API 31) 上同能生成唯一不变 ID ,卸载重装不影响,甚至使用 Xposed 提供各种假信息也不影响。
    另外 OAID 是国内为了应对 Android 10 (API 29) 不可获取 IMEI 搞出来的东西。
    WebKit
        22
    WebKit  
       2022-02-27 00:13:37 +08:00 via Android
    @bkmi OAID 是一个可以用户手动重置的广告 ID 。
    WebKit
        23
    WebKit  
       2022-02-27 00:25:22 +08:00 via Android
    @bkmi @WhatTheBridgeSay OAID 是一个用户可以手动重置的 ID 在。(比如小米的隐私保护防追踪里就可以重置)
    WebKit
        24
    WebKit  
       2022-02-27 00:37:46 +08:00 via Android
    @bkmi 用 xposed 这些获取的 ID 一样是因为 OAID 是系统提供的 API ,所以肯定是一样的

    另外 OAID 可不是因为不让获取 IMEI 所以才搞出来的,如果是这样,那直接允许应用获取不更省事?反正都是要定制系统的,何必在搞这么一出?

    OAID 对标的是 google 的 ADID ( apple 也有类似的东西),因为国内没有 GMS 的原因,禁止获取硬件 ID 后,可以通过 ADID 追踪用户做个性化推荐。这些都可重置的。

    至于数据联盟这些问题。主要还是因为目前 可以读取应用列表。访问其他应用数据的问题。存储权限跟图库绑定问题。这些应该在 android 13 上稍加改善。

    表扬一下小米。权限方面做的真不错。可以给空白权限。模糊定位。
    codehz
        25
    codehz  
       2022-02-27 01:16:06 +08:00 via Android
    Android 不需要任何存储权限就可以在公共目录建立文件夹,然后就可以用于持久跟踪,当然跨设备是做不到了(
    des
        26
    des  
       2022-02-27 01:16:58 +08:00 via iPhone
    @bkmi 建议反编译一下,怎么操作的
    docx
        27
    docx  
       2022-02-27 04:01:12 +08:00 via Android
    未授予存储权限时,应用依然对公共目录可读写,结果就是某些应用骚操作留个文件记录 id 实现追踪效果
    quxinna
        28
    quxinna  
       2022-02-27 07:01:19 +08:00
    android 可以做到,但是据我分析,难度比 ios 大
    MengiNo
        29
    MengiNo  
       2022-02-27 08:06:06 +08:00 via Android
    与其研究 Android 到底能不能追踪,还不如不如花个 1 分钟定期手动删一下 keychain ...
    nicevar
        30
    nicevar  
       2022-02-27 09:44:31 +08:00
    @bkmi 你对 OAID 有半点了解吗?你去拿非国内厂家的设备试试?说白了就是乞讨合作的手机厂商给个 ID
    nicevar
        31
    nicevar  
       2022-02-27 09:45:17 +08:00
    @des 你听他胡扯,反编译啥,就是跟厂家要一个 uuid ,不给的就没有,就这样。
    jinliming2
        32
    jinliming2  
       2022-02-27 09:54:32 +08:00   ❤️ 1
    @nicevar API 30 Android 11 ,记得 Google 不是搞了个事情么,转载一条 tg 消息:

    Magisk 的代码贡献者南宫雪珊说:
    从 Android11 开始,应用能「不需要」存储权限,向 Download 、Documents 等标准文件夹内新增文件或文件夹,传统的 File API 就行。并且,可以读取存储空间全部文件夹名字。仅名字,即目录结构,文件看不到。(但自己添加的文件在卸载前能一直看见并修改)
    再次重复:以上这些读写行为,都不需要授予存储权限,只需要 Android 11+。
    目前正在利用这一行为(注意这不是漏洞,是 Android11 的行为变化)的 app 有哔哩哔哩,它在 Documents 文件夹内存放了用户 ID 文件,可能用于持久跟踪。
    鉴于卸载重装后,之前新增的文件不再对它可见,所以哔哩哔哩还采用了文件夹名字来存放用户 ID 。

    关于 Android 11 分区存储「开倒车」的实例:即便不给淘宝任何权限,淘宝启动后也会立即在 /Pictures 目录下建立一大堆以 .gs 为标识的文件夹,里面存放着各种阿里系应用包名命名的文件夹和伪装成图片文件的不知道什么屎。
    mikeven
        33
    mikeven  
       2022-02-27 10:12:01 +08:00
    你观察到了什么现象让你认为 keychian 在追踪呢?登录用户的时候吗
    WebKit
        34
    WebKit  
       2022-02-27 11:10:24 +08:00 via Android
    @codehz 不需要任何权限?
    yanyumihuang
        35
    yanyumihuang  
       2022-02-27 11:21:37 +08:00 via Android
    @jinliming2 但这个玩意用个清理软件清理下就没了啊
    ysc3839
        36
    ysc3839  
       2022-02-27 11:35:08 +08:00 via Android
    @yanyumihuang 问题是绝大多数用户不会闲得不停清理,只要你打开一个软件后不清理然后打开了别的软件,就可以建立起跟踪关系了
    Osk
        37
    Osk  
       2022-02-27 11:35:11 +08:00
    @mxalbert1996 不给存储权限就退出的 App 还少吗....
    twoyuan
        38
    twoyuan  
       2022-02-27 12:00:12 +08:00
    https://developer.android.com/training/id-auth/identify?hl=zh-cn

    记得有这个 API ,不知道符不符合楼主说的场景
    mxalbert1996
        39
    mxalbert1996  
       2022-02-27 12:58:11 +08:00 via Android
    @Osk 既然不少那你就举个例子啊,不少的话举一个例子很难吗?
    bkmi
        40
    bkmi  
       2022-02-27 15:32:24 +08:00 via Android
    @nicevar 你在这装眼瞎呢,OAID 只是其中一个,麻烦你去了解下数字联盟可信 ID ,有渠道的话也请了解下各大厂比如拼多多、头条是怎么生成唯一 ID 的。
    calloc
        41
    calloc  
       2022-02-27 16:01:30 +08:00 via iPhone
    看来做这行的还不少
    ShadowPower
        42
    ShadowPower  
       2022-02-27 18:26:15 +08:00
    @bkmi 我去了解了一下“数字联盟可信 ID”,但没找到相关技术资料。找到的大多数是其产品的广告宣传,在广告中吹嘘得神乎其神。
    我倾向于它其实不能保证获取到的 ID 可靠且不可变,只是会额外做一些检查,判断运行环境是否存在作弊。
    如果可以,希望能稍微讲讲它是如何在权限限制下保证 ID 不可变的。
    ShadowPower
        43
    ShadowPower  
       2022-02-27 18:29:03 +08:00
    @bkmi 广告的原文是这么说的:

    可信 ID 3.0 成功迭代上线,数字联盟研发了弱特征归因技术,弱特征指的是单一或者组合无法识别设备唯一性的特征,比如电量、屏幕亮度等,在弱特征归因的过程中,多维度采集环境和设备层中隐私敏感度不高的信息,利用长期积累的环境数据,与设备行为数据的拟合,通过深度机器学习与严密的算法,为设备颁发准确唯一的设备 ID 。

    听起来就不太可靠……
    nicevar
        44
    nicevar  
       2022-02-27 19:05:25 +08:00
    @bkmi 别装了好吗,你让头条和拼多多的人出来,他们敢保证能生成不变的唯一 ID 吗?头条连一些 sdk 26 的设备都搞不定,pdd 就更不用说了。
    nicevar
        45
    nicevar  
       2022-02-27 19:08:23 +08:00
    @bkmi 另外你口中的那个数字可信一堆设备都直接返回不支持,不知道你哪来的勇气胡说八道。
    ShadowPower
        46
    ShadowPower  
       2022-02-27 20:21:26 +08:00
    Dreax
        47
    Dreax  
       2022-02-27 20:40:39 +08:00
    @MengiNo 据我所知 local keychain 只有通过完全重置手机才能删
    MacDows
        48
    MacDows  
       2022-02-27 20:45:33 +08:00 via Android
    似乎如果用嵌套虚拟化 wsa 能彻底解决这个问题?
    MengiNo
        49
    MengiNo  
       2022-02-27 21:01:50 +08:00
    @Dreax 开 iCloud 同步的情况下,在 macOS 里删就可以同步把 iOS 的也删了,苹果客服是这么说的,但是官方文档没解释的非常清楚,不排除他瞎说。但像 Wi-Fi 、证书这样的东西删除是同步的,感觉上大概率都是同步的,这种东西重点在加密,功能上还是比较简单的,应该不会有很多策略。
    bkmi
        50
    bkmi  
       2022-02-27 21:37:15 +08:00 via Android
    @nicevar @ShadowPower 你们爱信不信吧,要验证也简单,数盟官网案例中有列出一堆应用,抓包找到上报的 id ,然后卸载重装看上报的是不是一样,另外友情提示不要直接在系统里设置 HTTP 代理,因为 SDK 检测到代理会主动失效。
    ShadowPower
        51
    ShadowPower  
       2022-02-28 00:04:40 +08:00   ❤️ 1
    @bkmi 它的代码里校验了证书链,没法在劫持 HTTPS 请求的情况下让它走完整个流程……
    上报的数据估计都是加密后的一些本机硬件信息和其他可能用来识别设备的信息,如果当场卸载重装那肯定不怎么会变。

    但它的宣传是用于反作弊 /风控用的,这意味着只需要做到能检测出黑产刷单薅羊毛的行为就算达到目的了。
    也许旧版本 Android/iOS 上限制不够严格,可信 ID 还能做到准确标识一台设备。
    如果是目前的版本,根据各种“不那么唯一”的信息,综合起来确实能够在一定程度上区分设备。然而问题在于:
    1. 不能确保不同的设备拿到的 ID 也一定不同,可能有一定的碰撞概率(至少要比广告 ID 的碰撞概率高,毕竟它主要用于识别相同设备,同时还没法拿到真正的设备唯一 ID ,只能靠其他数据来猜);
    2. 对于同一台设备,在不同时间地点,用户做了许多操作(清理垃圾,更换 SIM 卡,升级系统版本,跌落,部分硬件老化或故障),然后重装了应用,得到的新的可信 ID 有可能会发生变化。

    一个可靠的用来跟踪用户设备的 ID ,应该是能避免上述两种问题的。我公司的内部 APP 可能也接入了类似的东西。自从我最近换了手机,升级到 Android 12 并折腾好各种权限之后,信息部时不时给我打电话说我打卡记录异常,检测到我使用另一个同事的手机打卡,是不是有代打卡的行为……我说没有,对方说建议我重装一下应用。
    我猜测他们很可能把这类东西当作真正的设备跟踪 ID 来用,然后误报了。

    如果应用场景仅仅是反作弊 /风险检测而不是广告跟踪,只要能大幅增加黑产的操作成本就能达到效果了。
    那技术应该都在检测设备有没有安装 xposed/越狱 /处于调试模式 /是虚拟机 /APP 被篡改,以及自身的协议和库的反破解上。
    vinsoncou
        52
    vinsoncou  
       2022-02-28 09:22:32 +08:00
    鸿蒙目前是有登录凭据管理了
    lisongeee
        53
    lisongeee  
       2022-02-28 11:00:29 +08:00
    @thisismr2 -- 这个应该会弹出提示用户授权 对吧

    是的,但是某些 app 会申请这个权限然后你同意才能用,然后就在根目录乱建文件夹
    XXWHCA
        54
    XXWHCA  
       2022-02-28 16:37:16 +08:00
    Android 作为更开放的平台,应用存放或获取用户标识有很多方案
    可以直接获取的标识:
    * 广告 ID ,不同的厂商稍有差异,但大部分都是卸载应用后重置
    * SSAID ( Android ID ),格式化或系统更新(可能)重置,应用读取不需要权限
    * GUID ,应用内随机生成的设备 ID ,卸载后重置

    国内的一些联盟的方案:
    * 移动安全联盟( OAID )和各厂商合作,提供了各种周期的设备 ID 方案,集成了它的各应用也可以直接获取 https://www.jianshu.com/p/1c7ef27d6db4
    * 推送联盟(以友盟、极光为主)所有集成了这些推送的都可以互相共享数据的

    需要一定前提的方案:
    * 将标识保存到外置存储,现在需要存储权限,友盟以前是有用过的,但 Android12 存储分区后已经废弃
    * 同系应用标识 ID 共享,现在大厂应用基本都有类似功能

    已经废弃的方案:
    * IMEI ,MAC 等设备唯一标识,现在普通应用没有权限读取到
    * settings.db 将数据保存到系统配置数据库 之前又见百度系应用将一些配置存到了 Settings.Global

    现在隐私合规越来越严格而且 google 也对获取设备唯一标识的 api 进行了限制,所以各大厂的设备 id 都是多种方案结合来生成的,可以进行降级获取,但主要是使用的 OAID 和 GUID 的方案,都是卸载后可以重置,但是依旧可以通过同系应用或同联盟的应用共享。

    实际上两个平台没有什么区别,因为我们的 app 基本都被这些大厂的,都是可以相互追踪的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1146 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:56 · PVG 02:56 · LAX 10:56 · JFK 13:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.