原文地址 设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识 zz

唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证你的软件在授权后才能在特定机器上使用)、软件 License,设备标识,设备身份识别等。下面列举一下各种方法的优劣:

(1)网卡 MAC 地址

MAC 地址可能是最常用的标识方法,但是现在这种方法基本不可靠:一个电脑可能存在多个网卡,多个 MAC 地址,如典型的笔记本可能存在有线、无线、蓝牙等多个 MAC 地址,随着不同连接方式的改变,每次 MAC 地址也会改变。而且,当安装有虚拟机时,MAC 地址会更多。MAC 地址另外一个更加致命的弱点是,MAC 地址很容易手动更改。因此,MAC 地址基本不推荐用作设备唯一 ID。

(2)CPU ID

在 Windows 系统中通过命令行运行 “wmic cpu get processorid” 就可以查看 CPU ID。

目前 CPU ID 也无法唯一标识设备,Intel 现在可能同一批次的 CPU ID 都一样,不再提供唯一的 ID。而且经过实际测试,新购买的同一批次 PC 的 CPU ID 很可能一样。这样作为设备的唯一标识就会存在问题。

(3)硬盘序列号

在 Windows 系统中通过命令行运行 “wmic diskdrive get serialnumber” 可以查看。

硬盘序列号作为设备唯一 ID 存在的问题是,很多机器可能存在多块硬盘,特别是服务器,而且机器更换硬盘是很可能发生的事情,更换硬盘后设备 ID 也必须随之改变,不然也会影响授权等应用。因此,很多授权软件没有考虑使用硬盘序列号。而且,不一定所有的电脑都能获取到硬盘序列号。

(4)自定义算法生成唯一 ID

可以使用自制的一个特定算法(如 GUID、或者一定位数的随机数)生成唯一的 ID,然后写入到注册表或者设备上,作为其唯一 ID。

这种方法不依赖任何硬件特征,唯一性也可以自己完全控制,不过纯软件的实现缺点是这个 ID 很容易伪造,也很容易擦除;而且很可能还需要在线验证,后台存储所有 ID 的服务器必须保持在线。

(5)Windows 的产品 ID(ProductId)

在 “控制面板 \ 系统和安全 \ 系统” 的最下面就可以看到激活的 Windows 产品 ID 信息,另外通过注册表 “HKEY_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion” 也可以看到看到 “ProductId” 字段。

不过这个产品 ID 并不唯一,不同系统或者机器重复的概率也比较大。虚拟机中克隆的系统,使用同一个镜像安装激活的系统,其产品 ID 就可能一模一样。经过实测,笔者在两台 Thinkpad 笔记本上发现其 ProductId 完全一样。

(6)MachineGUID

Windows 安装时会唯一生成一个 GUID,可以在注册表 “HKEY_MACHINE\SOFTWARE\Microsoft\Cryptography” 中查看其 “MachineGuid” 字段。

这个 ID 作为 Windows 系统设备的唯一标识不错,不过值得注意的一点是,与硬件 ID 不一样,这个 ID 在重装 Windows 系统后应该不一样了。这样授权软件在重装系统后,可能就需要用户重新购买授权。

(7)主板 smBIOS UUID

在 Windows 系统中通过命令行运行 “wmic csproduct get UUID” 可以查看。

主板 UUID 是很多授权方法和微软官方都比较推崇的方法,即便重装系统 UUID 应该也不会变(笔者没有实测重装,不过在一台机器上安装双系统,获取的主板 UUID 是一样的,双系统一个 windows 一个 Linux,Linux 下用 “dmidecode -s system-uuid” 命令可以获取 UUID)。

但是这个方法也有缺陷,因为不是所有的厂商都提供一个 UUID,当这种情况发生时,wmic 会返回 “FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF”,即一个无效的 UUID。

(8)外置密码设备提供唯一 ID

这种方法很多,比如 U 盾里面可以提供唯一的密钥标识,可信计算密码芯片里面的背书密钥 EK 等都是唯一固定在安全硬件里面的,而且通过良好的密码算法生成,唯一性和差异性都可以保证,安全性也更高。

这种方法需要在计算设备连接外置密码芯片,增加经济负担和开发成本。而且,即便这种方法也存在欺骗攻击和代理攻击等破解方法。

当然还有很多其它方法,如可以获取声卡、CPU 模式和频率、IDE 控制器、内存等其他信息。甚至,可以收集设备的软硬件配置,通过统计方法和机器学习方法进行分类识别设备。学术上,还有各种密码算法,硬件不可克隆函数 PUF 等唯一标识的方法可以使用。

从软件授权这个简单的应用来看,购买外置密码设备硬件太过昂贵,可以采用简单的组合方法,推荐使用主板 UUID 作为主标识,当 UUID 返回无效的值时,可以进一步采用 CPU ID、BIOS 序列号、MachineGUID 等方式作为次标识,这基本可以解决问题。

其实设备唯一标识其实也是指纹的一种,想要使用标识或者指纹时,首先必须明确自己的真实意图,是要标识一个用户(这样可以使用身份证、指纹、手机验证等方式),还是要标识一个设备(本文列举的各种设备 ID)。根据自己的真实意图才能进一步思考具体使用的方式,不忘初衷。

不过,不管使用怎样的硬件信息或者牛气的算法来进行用户或者设备的标识,还是一句老话 “道高一尺,魔高一丈”,都是可以被攻破的,即便你的标识伪造不了、克隆不了,攻击者也可以使用其它攻击方式,如逆向你的验证 check 代码,然后将其修改掉,使其 check 失灵。因此,无论设备标识或者用户标识,很多情况下可能只防君子、不防小人,甚至悲观者认为这些手段都是防止合法用户的,影响用户使用的方便性,大可以取消掉。笔者认为,没有必要这么悲观,知识产权等信息是尊敬人的价值和劳动的表现,即便不能完全防止小人,我们也要通过这些方法将一般的小人排除在技术门槛之外,并尽量增加高级小人破解时的代价。

设备唯一标识方法(Unique Identifier):如何在 Windows 系统上获取设备的唯一标识的更多相关文章

  1. 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

  2. [转]设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

  3. 如何在Windows系统上利用Telnet协议连接Linux服务器

    Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家 ...

  4. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  5. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  6. 非Unicode编码的软件如何在Windows系统上运行

    我们常常会遇到这样一种情况:点开某些日文软件(我不会说就是galgame( ╯□╰ ))会出现乱码或者直接无法运行. 出现乱码的原因很简单:编码与译码的方式不一致!!!!!!!!!!! 首先大家需要知 ...

  7. 如何在Windows系统上基于Sublime搭建Python的编译环境

    刚刚接触到Python,直接在计算机上编译时不能正确的运行,所以将一些有关编译环境调试的知识总结了一下. 环境搭建: Python在 windows系统上编译的时候可能会出现一些编译无法运行的情况,我 ...

  8. Redis进阶实践之三如何在Windows系统上安装安装Redis

    一.Redis的简介        Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...

  9. java生成UUID通用唯一识别码 (Universally Unique Identifier)

    转自:http://blog.csdn.net/carefree31441/article/details/3998553 UUID含义是通用唯一识别码 (Universally Unique Ide ...

  10. (转)java生成UUID通用唯一识别码 (Universally Unique Identifier)

    (原文链接:http://blog.csdn.net/carefree31441/article/details/3998553)   UUID含义是通用唯一识别码 (Universally Uniq ...

随机推荐

  1. Minio 安装部署

    minio 入门 简介 简介 自己看官网 https://min.io/docs/minio/kubernetes/upstream/ 安装部署 (1)Linux服务器安装 minio 可以采用以下几 ...

  2. jmeter 二次开发详解

    背景: JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求.通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求.例如,可能需要添加自定义的 测试元件.报 ...

  3. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  4. 图解 LeetCode 算法汇总——双指针

    双指针算法是一种比较常用于搜索链表或数组相关的问题,很多算法的基本的解题思路就是使用暴力搜索法.而双指针是对暴力搜索的一种优化,通过双指针可以减少数据的遍历次数.通常双指针是有两个指针,叫做 ligh ...

  5. 拯救Win7,2023该如何正确升级?

    对于现存的Win7系统用户,微软曾多次提醒将在2023年1月停止对Win7与Win8.1的安全更新和技术支持.而转眼已经来到2023,时间已到,对于Win7,微软已经再也不管了,停止为Win7用户提供 ...

  6. Springboot简单功能示例-2 KEY初始化功能和全局错误处理

    springboot-sample 介绍 springboot简单示例 跳转到发行版 查看发行版说明 软件架构(当前发行版使用) springboot hutool-all 非常好的常用java工具库 ...

  7. DESTOON做中英双语言(多语言)切换版本具体详解

    第一次发原创好激动,该注意点什么? 在开发过程中用户有许多要求,比如这个多语言切换就是一个需求. 首先讲解一下DESTOON(DT)后台系统如何做这个中英.甚至多语言切换的这个功能. DT本身不自带多 ...

  8. Python常用模块-20个常用模块总结

    目录 time模块 datetime模块 random 模块 os 模块 sys 模块 json 和 pickle 模块 hashlib和hmac 模块 logging 模块 numpy 模块 pan ...

  9. 其它——ZeroRPC和SimpleXMLRPCServer

    文章目录 一 Python中RPC框架 二 SimpleXMLRPCServer使用 服务端 客户端 三 ZeroRPC使用 服务端 客户端 一 Python中RPC框架 自带的:SimpleXMLR ...

  10. 判断两个数a,b,输出较大数的平方值。所谓平方值就是两个相同的数相乘的积。

    平方值   描述 判断两个数a,b,输出较大数的平方值.所谓平方值就是两个相同的数相乘的积. 输入 两个数a和b 输出 输出较大数的平方值. 输入样例 1 1 2 输出样例 1 4 a,c = map ...