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

原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html

唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保证你的软件在授权后才能在特定机器上使用)、软件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系统上获取设备的唯一标识

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

  2. iphone导出视频出错(连接到系统上的设备没有发挥作用)

    在将视频从iphone等设备拷贝至PC时部分视频出现错误:连接到系统上的设备没有发挥作用 错误原因:iphone的视频压缩功能 解决方法:更改iphone的设置 设置-照片-传输到MAC或PC 将其更 ...

  3. 如何在ubuntu系统上安装多个cudn环境(及对应cudnn、pytorch 、torchvision安装方法 )

    如何在ubuntu系统上安装多个cudn环境 第二版本的cuda的安装 cuda的切换设置 对应cudnn的安装 安装pytorch及torchvision 后话 转载请注明出处 在跑模型的时候报错说 ...

  4. iphone手机里的计算机没有了怎么办,iPhone连到系统上的设备没有发挥作用怎么办...

    苹果机上照片越来越多,于是连接数据线,打算把照片传到电脑上,但是在复制照片时,却出现了这样的提示:连到系统上的设备没有发挥作用,应该怎么解决呢,请看本站提供的方法 一.请确保iTunes相关服务是否开 ...

  5. 解决:win10 休眠项消失,无法使用休眠 powercfg /h /size 50 连到系统上的设备没有发挥作用

    为什么用这个休眠的功能?因为重启的话,还要打开那么多应用程序! 重复的操作,能不要就不要.因为浪费时间呀!时间就是生命 有木有! 情景再现: 之前一直使用win10的休眠 感觉还是挺好用的,晚上直接按 ...

  6. VMware安装windows 系统上提示网络上有重名的解决方法

    VMware安装windows 系统上提示网络上有重名的解决方法 标签: virtual pc 网络上有重名 虚拟机 vpc nat共享连接 杂谈 分类: 电脑知识 装了vmware 新建---添加一 ...

  7. 【Windows 7 Wifi 热点】无法启动承载网络 连到系统上的设备没有发挥作用

    [背景介绍] 我用的电脑是Lenovo ThinkPad E420,操作系统版本为:Windows 7 家庭普通版 SP1,处理器为:英特尔酷睿 i5-2450M CPU @ 2.50GHz,内存为: ...

  8. 连接到系统上的设备没有发挥作用解决方案

    连接到系统上的设备没有发挥作用解决方案 问题描述:访问其他电脑的共享文件夹,忘记输入密码,再次访问时,没有出现密码输入提示框,输入地址后提示:"连接到系统上的设备没有发挥作用" 解 ...

  9. Debug汇编程序 NTVDM has encountered a system error 连接到系统上的设备没有发挥作用

    Debug汇编程序  NTVDM has encountered a system error 连接到系统上的设备没有发挥作用 解决方案: 两种尝试 1.打开控制面板 --> 程序和功能  -- ...

最新文章

  1. openresty 前端开发入门五之Mysql篇
  2. C#控件 Datagriview控件
  3. LiveVideoStack线上分享第四季(八):实时远程医学影像服务质量保障与网络优化...
  4. linux 复制分区文件,dd复制分区后目标分区的大小变成原分区了
  5. 实验吧Web-易-天网管理系统(php弱类型,==号)
  6. ValueError: invalid literal for int() with base 10:Python报错及其解决办法
  7. CentOS下用于查看系统当前登录用户信息的4种方法
  8. mpAndroidchart 坐标和图表距离_几个小细节--图表那些事
  9. 老板下死命令:必须将20M文件从30秒压缩到1秒,我是如何做到的?
  10. gif跟随ProgressBar一起动/pk进度条gif特效
  11. C# installshield2020项目部署打包详细教程
  12. 方差分析的SPSS实现
  13. 网线水晶头接法图解8根顺序
  14. 在blog中添加attachments功能 (修改系统Control)
  15. ugui 转轮_Unity3D的FingerGesture插件
  16. 一个遮罩层怎么遮罩两个图层_遮罩动画需要用两个图层,一个是遮罩层,另一个是()层...
  17. 机器人制证系统大屏可视化
  18. 【开发工具】【Valgrind】内存问题检测工具(valgrind)的使用
  19. 命令行 笔记本键盘禁用_笔记本触控板怎么关
  20. Unity+Android 打开安卓文件管理器,并拿到文件的真实路径

热门文章

  1. WPF的Effect效果
  2. sql——字符串处理
  3. 【JDBC-1】jdbc编程六大步骤
  4. SEO优化:自建站图片优化攻略
  5. 使用python批量提取txt中的数据并写入excel
  6. .NET Quartz介绍
  7. Docker--容器挂载
  8. FileNotFoundError: Could not find module ‘C:\Users\Yolanda\anaconda3\envs\python38\lib\site-packages
  9. Paxos太难懂?五张图读懂Paxos协议
  10. Redis介绍及其简单使用方法