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

获取计算机唯一识别码的问题,有大佬有经验吗?

  •  
  •   PUBG98k · 2020-11-09 20:54:38 +08:00 · 9514 次点击
    这是一个创建于 1235 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Windows,macOS.下
    如何给计算机 生成绝对唯一的 识别码.类似 Teamviewer 的 ID.
    ------------
    需要考虑到 VMWARE 系统,以及服务器 云机.Ghost 系统.
    ------------
    目前 ToDesk 使用的是:
    uuid+mac,但是依然还是不行.
    ---
    uuid 在 ghost 系统会重复,mac 地址重复.

    系统安装时间,Win10 在更新补丁的时候,会更改.

    硬盘序列号,在 vmware 的系统里是没有硬盘序列号的.
    cpu 序列号 也是不唯一了.现在都改成生产批号了.

    服务器系统又没有鼠标键盘显卡可以获取唯一码.
    蛋疼~~~
    66 条回复    2020-11-10 17:44:38 +08:00
    dingwen07
        1
    dingwen07  
       2020-11-09 20:59:07 +08:00 via Android
    我这 teamviewer id 会变,经常被退出登录
    为什么要用唯一 ID ?除了作恶我想不到别的了
    PUBG98k
        2
    PUBG98k  
    OP
       2020-11-09 21:02:18 +08:00
    @dingwen07 如果你办公室里的电脑,下班之前,安装了 ToDesk,设置了开机自启动和无人值守密码.开开心心的回家了
    因为其他原因,比如断电,系统自动更新或者你重启了下
    回到家.想远程上去工作,ID 变了.无法连接怎么办呢?
    ho121
        3
    ho121  
       2020-11-09 21:13:41 +08:00 via Android
    随机生成一个 uuid,然后写入注册表
    3dwelcome
        4
    3dwelcome  
       2020-11-09 21:13:51 +08:00 via Android
    @PUBG98k 不用唯一 id,用账号密码在线登录就可以。
    PUBG98k
        5
    PUBG98k  
    OP
       2020-11-09 21:19:11 +08:00
    @ho121 安装好了 todesk 生成 id 的.然后 Ghost 系统呢?注册表就一样了
    PUBG98k
        6
    PUBG98k  
    OP
       2020-11-09 21:20:32 +08:00
    @3dwelcome 一个账号密码是可以登陆多台电脑的.
    dyv9
        7
    dyv9  
       2020-11-09 21:21:51 +08:00 via Android
    @ho121 好主意,就应该用户来指定 id,登录时自动映射设备与账户的关联,这和动态域名一样的思路。我们只需要在不存在缓存的设备编号时生成 uuid 然后缓存越来代表这个用户,在用户明确注销登录时才清空缓存,类似 cookie,不主动注销登录就不清空缓存。
    phpc
        8
    phpc  
       2020-11-09 21:25:00 +08:00
    把你提到的和楼上提到的这些东西拼接在一起?
    PUBG98k
        9
    PUBG98k  
    OP
       2020-11-09 21:30:16 +08:00
    @dyv9 不能的,同一个账号下,如果有 10 台电脑.
    我应该用什么来区别,我这个 ID 是绑定在某个电脑上的.
    以什么特征来区别.这就回到我的问题上去了.
    3dwelcome
        10
    3dwelcome  
       2020-11-09 21:43:44 +08:00 via Android
    @PUBG98k 用户名密码在线登录,服务器是可以知道你有没有重复登录的。
    服务器给客户端分配唯一 id,还不是轻而易举的事情。
    PUBG98k
        11
    PUBG98k  
    OP
       2020-11-09 22:30:06 +08:00
    @3dwelcome ID 要固定啊.只要这台电脑不重装的情况下,都要求 ID 固定才能满足我们的业务需求.
    10 个数字 ID 对应 10 台电脑.
    我全部都退出账号了,再登陆.如何确保原来哪台电脑是什么 ID.还是那个 ID.
    zsdroid
        12
    zsdroid  
       2020-11-09 22:44:09 +08:00
    登录生成 uuid,写入文件。每次打开软件时联网校验 uuid 是否重复,重复了重新生成。
    mcone
        13
    mcone  
       2020-11-09 22:58:18 +08:00
    @PUBG98k 既然你都有账号系统了,你每次新设备登录的时候,让用户自己选 /服务器强行分配一个目前可使用的独一无二 ID 不就行了……

    理论上说,只要用户全心想作恶,你用 mac/序列号 /cpu 都没用,作恶设备的 ID 只能用过服务器鉴权后重新分配才能达到你的效果
    Greatshu
        14
    Greatshu  
       2020-11-09 23:01:05 +08:00
    一样的 UUID 没关系,服务器限制同样 UUID 不能同时登陆就行,登录总有先后的
    PUBG98k
        15
    PUBG98k  
    OP
       2020-11-09 23:10:50 +08:00
    @mcone 很多用户是企业用户.他们一个账号下几百台设备的..

    @zsdroid 如果生成在本机,然后 Ghost 的系统镜像,再去拿这个镜像去装别的电脑.2 台电脑就一样了.
    supermoonie
        16
    supermoonie  
       2020-11-09 23:15:00 +08:00 via iPhone
    oshi 里有生成机器码的 demo
    nuk
        17
    nuk  
       2020-11-09 23:18:07 +08:00
    onetime key, 每次连接到服务器分配下一次连接的 key,如果 key 已经被用过,就分配一个新的 ID
    GM
        18
    GM  
       2020-11-09 23:24:51 +08:00
    给你 TV 在 Mac 下的大概做法做参考:

    第一次启动,生成唯一 ID,存入特定位置,以后永远都用这个 ID,除非手动清除掉存储的信息。

    Ghost 问题:
    Ghost 之前,删掉之前生成的信息再 Ghost,下次系统启动后会发现这是全新的系统,走上面的流程。
    如果没删掉就 Ghost,新系统会冲突导致登录不上,新系统不会上线,不干扰之前的系统。
    cz5424
        19
    cz5424  
       2020-11-09 23:33:56 +08:00 via iPhone
    服务端分配后,写入本地的某个位置,启动后校验一下 id 是不是服务端生成的,不是就重新分配
    3dwelcome
        20
    3dwelcome  
       2020-11-09 23:39:43 +08:00 via Android
    @PUBG98k id 固定就必然要存到磁盘上,存到磁盘上就必然会遇到 ghost,所以不能用静态 id 。
    只要能联局域网,就直接根据网络出口路径 tracert,分配一个动态 id 就可以了。
    除非网络环境变了,本机 ip 变了(比如 ghost 了一个虚拟机)就需要用户强制登录一次,再分配一个新 id 。
    PUBG98k
        21
    PUBG98k  
    OP
       2020-11-09 23:43:12 +08:00
    @GM 我做过实验.tv 在 安装后启动.然后在 ghost.
    拿这个 ghost 去重装系统.第一次启动后 ID 居然不一样.可以正常连接
    也不会跟 ghost 之前的 id 重复
    无论怎么重启都一个 id 不变.
    jim9606
        22
    jim9606  
       2020-11-09 23:44:03 +08:00
    Teamviewer 只认网卡 MAC,所以很多绕过商用限制的方法都是靠改 MAC 实现的。
    CPU 印象里没有***公开的***获取 PSN 的方法,因为部分国家明令禁止部署这种技术。
    比较合理的做法是通过 SMBIOS 读主板的 Serial Number,就算是虚拟机也有这玩意的。
    PUBG98k
        23
    PUBG98k  
    OP
       2020-11-09 23:45:02 +08:00
    @3dwelcome 您这样的话没有办法的.同一个公司的好多台电脑 出口 tracert 基本都一样.而且很多人都是 dhcp 自动从路由器获取内网 IP 呀.肯定是变的.
    PUBG98k
        24
    PUBG98k  
    OP
       2020-11-09 23:48:14 +08:00
    @jim9606 主板的 Serial Number 我查阅了资料了.目前是不唯一的.
    是生产批号.同一批号下来的基本上都是一样的 Serial Number.
    这样就会造成 企业批量采购的相同配置的 PC 设备 存在大量重复的 主板 Serial Number
    Lemeng
        25
    Lemeng  
       2020-11-09 23:48:42 +08:00
    来学习学习的
    PUBG98k
        26
    PUBG98k  
    OP
       2020-11-09 23:52:25 +08:00
    @jim9606 ghost 的话,或者 vmware 复制的系统.mac,uuid,系统安装时间,都是重复的.
    crclz
        27
    crclz  
       2020-11-09 23:55:15 +08:00
    别指望把所有破解方法都防住。你防不住逆向工程。
    nuk
        28
    nuk  
       2020-11-09 23:56:00 +08:00
    @PUBG98k mac 地址加 onetime key,基本上和 tv 一样了啊。。
    3dwelcome
        29
    3dwelcome  
       2020-11-10 00:01:43 +08:00 via Android
    @PUBG98k 我又没让你用本机的动态 ip 算 id,用 mac 啊。
    之所以还要加上 tracert,是因为同一个出口路由下只能有一个 mac,如果有别人恶意修改,导致重复,那就变成了局域网 apr 投毒,网速会很慢的,得不偿失。
    xuanbg
        30
    xuanbg  
       2020-11-10 00:03:21 +08:00   ❤️ 1
    客户端产生一个唯一 ID 保存在本地即可。如果是虚拟机克隆导致重复,那么可以和服务端做一个验证。如果 ID 存在,那就重新生成一个并重新验证,如果验证成功就覆盖掉本地的那个。
    jim9606
        31
    jim9606  
       2020-11-10 00:03:42 +08:00
    @PUBG98k 个人觉得不要在虚拟机唯一 ID 上费神,因为 VMM 总有办法骗过你的检测。
    如果是你的控制下的虚拟机和系统镜像:
    vmware 要用模板克隆模式且在导入导入虚拟机时要选择“复制了虚拟机”使 UUID 重置( https://kb.vmware.com/s/article/1541);
    windows 镜像在生成前要运行 sysprep ( https://docs.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/sysprep--generalize--a-windows-installation
    xcstream
        32
    xcstream  
       2020-11-10 01:01:17 +08:00
    题目是 生成绝对唯一的 识别码
    那么答案很明确 不存在
    dai640
        33
    dai640  
       2020-11-10 01:19:13 +08:00
    ghost 系统不是按当前日期吗?
    laminux29
        34
    laminux29  
       2020-11-10 03:12:19 +08:00
    1.计算机没有唯一 ID 一说。有些设备能拿到唯一 ID,有些设备能拿到名字。业界的做法是,把能拿到的 ID + 名字,联合起来当做唯一 ID 。

    2.远程桌面类软件,主流的无人值守有两种形式。第一种是每次打开后,会生成一个新 ID 与临时密码,通过这个 ID 与临时密码进行远程控制,但电脑重启后或软件重启后,ID 与临时密码会更新;第二种是登陆账号后,直接使用账号+密码进行远程控制,这种就算是软件或电脑重启,也不会更新。

    如果你是希望稳定远程控制,通过第二种方式就行。

    3.如果你是 ToDesk 这类应用商,来防止用户一个账号多开,你应该去看防止重复登录与防止重复在线的技术。这类技术不难,无非是利用令牌或服务器端开长连接来实现。
    msg7086
        35
    msg7086  
       2020-11-10 06:05:01 +08:00   ❤️ 2
    光靠操作系统,做不到。

    很简单的做法,开个虚拟机,登录你的系统,然后关机做个快照,在快照上起两台一模一样的虚拟机,那他们一定能拿到重复的识别码。SMBIOSID 是可以不唯一的,同理 MAC 也可以相同。起来的两台虚拟机就是完全一样的。
    savasun
        36
    savasun  
       2020-11-10 06:10:21 +08:00
    SLI
    savasun
        37
    savasun  
       2020-11-10 06:13:00 +08:00
    @savasun 黑苹果系统要往主板注入 SLI,CPU 有些用户换得多、换内存,硬盘啥的也很常见。只有获取主板 SLI 版号可以达到你想要的效果。
    widewing
        38
    widewing  
       2020-11-10 06:17:28 +08:00 via Android
    想个办法存 cmos?
    kokutou
        39
    kokutou  
       2020-11-10 07:26:18 +08:00 via Android
    procmon 监控下 teamviewer
    xiangyuecn
        41
    xiangyuecn  
       2020-11-10 09:10:35 +08:00
    同 Android 里面某些 app,win 、mac 同样往根目录拉屎就完了,多拉几个地方多拉几坨,隐藏起来
    cigarzh
        42
    cigarzh  
       2020-11-10 09:23:02 +08:00
    device fingerprint 是个很大的坑,
    建议造不如买
    3dwelcome
        43
    3dwelcome  
       2020-11-10 09:26:33 +08:00
    @msg7086 "同理 MAC 也可以相同。起来的两台虚拟机就是完全一样的。"
    这个分两种情况,第一种是一台设备上,同时启动两个 MAC 一模一样的虚拟机,由于 IP 包的转发依赖的是 MAC 地址,理论上多开会遇到问题。
    第二种是先把旧虚拟机关闭,只用新镜像虚拟机启动,MAC 一样,这情况应该允许客户被识别为一个 ID 。因为没有同时多开。
    kuro1
        44
    kuro1  
       2020-11-10 10:14:18 +08:00
    硬盘序列号?
    DoctorCat
        45
    DoctorCat  
       2020-11-10 10:41:20 +08:00
    方向不对,努力白费。
    zouri
        46
    zouri  
       2020-11-10 10:52:26 +08:00
    @Greatshu 这个靠谱,出现相同的之后强制掉线一个,或者重新下发一个 uuid
    msg7086
        47
    msg7086  
       2020-11-10 11:06:55 +08:00
    @3dwelcome MAC 冲突只会出现在单个物理连接上(不论是真物理还是虚拟物理)。
    前面各加一级交换机就没事了。
    gkuchan
        48
    gkuchan  
       2020-11-10 11:15:45 +08:00
    我研究过这个问题,采用的方案是:uuid+mac

    1. uuid 在不用的 vm 上面可以保证不一致,这个是云服务商保证的。从 snapshot 创建的 vm 也不一致。

    wmic path win32_computersystemproduct get uuid

    2. mac 地址主要用于区分 container,要注意,每一台机器上的 container 的 mac 地址都是从同一个地址开始增长的
    Greatshu
        49
    Greatshu  
       2020-11-10 11:45:03 +08:00
    在显示相同 UUID 不能同时登录的同时,每次登录时返回一个时间戳,只有拥有服务器中记录的最新时间戳的才能够登录。否则当新设备处理,生成新的 UUID 。
    Greatshu
        50
    Greatshu  
       2020-11-10 11:45:27 +08:00
    @Greatshu #49 显示-->限制
    no1xsyzy
        51
    no1xsyzy  
       2020-11-10 11:48:38 +08:00
    @msg7086 MAC 冲突会发生在同一个以太网上吧……
    要加路由器的吧
    ——
    我觉得这是个 XY 问题
    你先讲清楚为什么要唯一识别码?
    就是 Windows10 自动在线授权都只管主板 ID
    no1xsyzy
        52
    no1xsyzy  
       2020-11-10 11:50:00 +08:00
    @Greatshu 类似乐观锁么,诶刚才就差一步想到的,冷得想不起来了……
    newmlp
        53
    newmlp  
       2020-11-10 12:20:40 +08:00
    tv 是根据网卡 mac 地址生成的
    msg7086
        54
    msg7086  
       2020-11-10 12:33:43 +08:00
    @no1xsyzy 啊对,应该是路由器。脑抽了。
    fuxiuyin
        55
    fuxiuyin  
       2020-11-10 12:54:13 +08:00
    生成一个塞 TPM 里面存?不过 TPM 也能清空重来。看上去需要标识的不是计算机,是要标识默认的某台计算机,而不管这台计算机是不是唯一的。比如办公室,家总共有 4 台设备,想要的是在其他地方比如地铁上能连上家里 /办公室的某一台机器,而不管这台机器有没有被人换过硬盘 /CPU/内存或者直接换了一台新的是吗?这样看起来应该让用户在新设备上登录的时候给设备取别名比如名字叫"家_卧室_NAS_VM01",然后连接的时候列出来用户所有注册并且现在在线的设备,然后选一个连接。对于 GHOST 和复制的 VM,你们是想免登陆吗?就是说第一台设备已经登陆了 ToDesk,然后做了一个 GHOST 或者 VMware 镜像,复制出来一个出来之后能直接把设备注册上而不用用户进入系统之后重新登录 ToDesk 吗?如果是的话那就客户端上报名称然后服务器发现冲突的名称之后在后面加 01,02,03 ;比如已经登陆了一个 VM 叫"VM",然后复制了 10 个并且都启动起来了,那服务器就给他们叫"VM01","VM02","VM03"...用户连接的时候列表里面显示"VM","VM01","VM02"...
    YUCOAT
        56
    YUCOAT  
       2020-11-10 13:13:43 +08:00
    如果需要严格唯一的话,唯一的办法就是让服务端生成 id 并且存入本地。然后每次启动的时候,去服务端校验一下自己是不是唯一,如果是唯一就把时间存本地,并且今日内启动都不再校验。如果不唯一就让服务单重新分配一个 id 并存入本地。
    UN2758
        57
    UN2758  
       2020-11-10 13:55:55 +08:00
    要绝对唯一,首先得假设客户端不可信,那么验证工作全在服务端完成,前面大佬提到服务端发凭证,每次做冲突检测挺好的
    FaiChou
        58
    FaiChou  
       2020-11-10 15:28:48 +08:00
    Sip(macOS 上取色工具)的作者是这么给我回复的:

    ```
    Hey,

    I can give you a light how this works

    1) We use the kIOPlatformSerialNumberKey, basically this identifies a machine, the only way the user change this is by changing the board
    2) We made some changes to this serial number, basically using some function in CryptoKit and some private keys
    3) Then we save that transformed and some data locally and remote
    4) Everytime a user open Sip, sip try validate that data, a check if the hash saved locally is different in the server, if that’s different, that means something changed in local, so we delete everything and the user need to start again, will need to enter the license, like you deleted the app
    5) We have some algorithms to handle some edge cases, like what if the user dent have internet, what if sip servers are down etc

    Hope this helps you
    ```

    希望能帮到你
    PUBG98k
        59
    PUBG98k  
    OP
       2020-11-10 15:46:06 +08:00
    @fuxiuyin
    @Greatshu
    @laminux29
    许多情况下用户并不登录.但是也要保证 ID 不同,而且不变.以便于别人随时可以控制.即便重启系统.
    ID 也不能变.
    PUBG98k
        60
    PUBG98k  
    OP
       2020-11-10 16:05:07 +08:00
    @zouri 不能重新下发一个.因为考虑到这种场景..
    我无人值守的设备,安装好了,我记录下来了我的 id.
    我就离开了,等我需要的时候我直接连我记录的 id.
    如果重新下发了,那人家不是又要跑到现场看原因.无法远程连接了
    PUBG98k
        61
    PUBG98k  
    OP
       2020-11-10 16:09:03 +08:00
    @FaiChou 感谢大佬回复.mac 目前我们用的是 IOPlatformSerialNumber+UUID+MAC
    但是有些人使用无线网卡,mac 会经常变.所以 mac 打算去掉了
    fuxiuyin
        62
    fuxiuyin  
       2020-11-10 16:22:26 +08:00 via iPhone
    @PUBG98k 如果不登陆的话 TV 那种也不保证一直用一样的 ID 连上,TV 在处理这个问题的时候是让用户登陆然后列出来所有在线机器,用 ID 连接的也只目标在一次性远程协助。我觉得处理不完,比如用户电脑坏了,整个主机都换了就剩下硬盘没换,修好的电脑还在他办公桌上放着,他还想接着在家用相同的 ID 连上。或者彻底坏了,IT 给了一台新机器,IT 标准化以完成后放到了这个员工桌子上连上网,然后这个员工在家试了下说原来的 ID 用 ToDesk 连不上。不过有有效范围内的解决方案,比如在公司这种场景下每个人的员工账号是固定的,然后电脑入域之后可以给电脑一个{员工账号-01}.{公司域名}的机器名,然后就不换电脑硬件如何的固定下来的。依赖于办公场景加域,其实相当于一个登陆。
    icyalala
        63
    icyalala  
       2020-11-10 16:37:44 +08:00
    设备指纹的原理是这样的:

    收集若干标识符,比如 CPU 序列号、磁盘序列号、主板序列号、Mac 地址、显卡、内存、系统安装时间、内存大小、已安装字体、系统版本等等,加密后上报服务端,服务端生成一个唯一标识符下发。

    后续当再次启动时,重新发送这数据,如果其中只有某几项发生变化,那仍然可以匹配到原有设备(也就是召回)。
    kokutou
        64
    kokutou  
       2020-11-10 17:06:52 +08:00
    @PUBG98k #60
    无线网卡 mac 地址也是固定的啊.
    除非他一直换不同的无线网卡.

    或者说获取的 mac 不对, 是那个 "针对此网络使用随机硬件地址" 产生的随机地址...
    lxz6597863
        65
    lxz6597863  
       2020-11-10 17:12:55 +08:00
    BSD:

    cat /etc/hostid
    # or (might be empty)
    kenv -q smbios.system.uuid


    Linux:

    cat /var/lib/dbus/machine-id
    # or when not found (e.g. Fedora 20)
    cat /etc/machine-id


    OS X:

    ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID


    Windows:

    reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography /v MachineGuid


    -------------------
    参考 https://github.com/denisbrodbeck/machineid
    THESDZ
        66
    THESDZ  
       2020-11-10 17:44:38 +08:00
    这不就是证书吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5234 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 09:25 · PVG 17:25 · LAX 02:25 · JFK 05:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.