如何让软件绑定计算机硬件
2015-11-15 12:35
369 查看
软件绑定计算机硬件标识是不少软件采用的防拷贝方法。然而如何确定计算机硬件的唯一标识却不是简单的事情。下面是常采用的方法及其优缺点。
首先需要说明的是,CPU批号和CPU序列号是不同的东西,同样型号的CPU具有相同的批号,而CPU序列号基本可以说是唯一的。
然而不幸的是,并不是所有CPU都支持CPU序列号。曾经这还是个政治问题,用户处于保密考虑,不希望CPU厂商使用序列号来标识其购买的CPU。Intel的官方文档还说,就算是其生产的CPU支持CPU序列号,也不能保证其唯一性,而且用户还可以在BIOS里禁用序列号功能。
问题是,虽然现在大部分机器都继承了网卡,但是仍然有部分机器没有安装网卡。而且有些机器还安装了多个网卡,这就需要做更多的判断。
但是硬盘相对而言,不如集成网卡和CPU那样稳定,用户更换硬盘的行为时而会发生。也存在多个硬盘并存的情况。
另外,对于使用RAID的用户来说,硬盘序列号是不存在的。
对于GPT硬盘分区来说,每一个分区都使用全球唯一的UUID来标识,具有良好的唯一性和可用性。
另外对于RAID设备来说,分区序列号同样存在并可用。
如何根据硬件唯一标识产生授权码是绑定算法的全部。最简单的方法是直接把硬件唯一标识作为授权码。然而这样做是非常不安全的,软件用户通过修改硬件唯一标识很容易就能蒙混过关。
所以一般的方法是: 授权码=f(硬件唯一标识)。其中的f算法是需要保密的,这样即使用户看到了授权码,仍然不能仅仅通过授权码而修改硬件唯一标识。
但是用户仍然可以复制已经获得授权的机器的硬件标识和授权码来复制软件。
所以对于硬件标识的确定也需要对用户保密,毕竟要完全复制一台机器的所有硬件序列号是一件非常困难的事情。
1 计算机唯一性标识的方法
1.1 CPU序列号
可用性
目前存在的CPU几乎都支持CPUID指令。这个指令不仅可以获取CPU生产厂商等基本信息,还可以获取其他有关CPU的硬件信息,包括CPU序列号。首先需要说明的是,CPU批号和CPU序列号是不同的东西,同样型号的CPU具有相同的批号,而CPU序列号基本可以说是唯一的。
然而不幸的是,并不是所有CPU都支持CPU序列号。曾经这还是个政治问题,用户处于保密考虑,不希望CPU厂商使用序列号来标识其购买的CPU。Intel的官方文档还说,就算是其生产的CPU支持CPU序列号,也不能保证其唯一性,而且用户还可以在BIOS里禁用序列号功能。
安全性
VMware等虚拟机可以轻松的更改虚机的CPU序列号。使用建议
不建议使用。1.2 网卡MAC
可用性
网卡MAC是具有国际标准的地址编号,能够确保世界上的每一块网卡具有唯一的序列号。问题是,虽然现在大部分机器都继承了网卡,但是仍然有部分机器没有安装网卡。而且有些机器还安装了多个网卡,这就需要做更多的判断。
安全性
虚拟网卡软件早就有了,对于虚拟的网卡,其MAC地址可以随便修改。使用建议
联网机器可以尝试使用。1.3 硬盘序列号
可用性
除了一些特殊硬盘外,大部分硬盘都有自己唯一的硬件序列号,而且不可修改。但是硬盘相对而言,不如集成网卡和CPU那样稳定,用户更换硬盘的行为时而会发生。也存在多个硬盘并存的情况。
另外,对于使用RAID的用户来说,硬盘序列号是不存在的。
安全性
对于虚拟机来说,无安全性。使用建议
一般。1.4 硬盘分区序列号
可用性
首先要说明,硬盘分区序列号和硬盘物理序列号是不同的东西。硬盘物理序列号是硬盘厂商指定的,而分区序列号是分区软件指定的。每次重新分区的时候,这个序列号会变动。对于GPT硬盘分区来说,每一个分区都使用全球唯一的UUID来标识,具有良好的唯一性和可用性。
另外对于RAID设备来说,分区序列号同样存在并可用。
安全性
由于这个序列号是分区软件指定的,所以也就无安全性而言了。使用建议
可以使用。2 绑定硬件的算法
获得了硬件唯一标识以后,需要做的就是让软件在运行时动态获取这个标识,然后把它与授权码进行比较。如何根据硬件唯一标识产生授权码是绑定算法的全部。最简单的方法是直接把硬件唯一标识作为授权码。然而这样做是非常不安全的,软件用户通过修改硬件唯一标识很容易就能蒙混过关。
所以一般的方法是: 授权码=f(硬件唯一标识)。其中的f算法是需要保密的,这样即使用户看到了授权码,仍然不能仅仅通过授权码而修改硬件唯一标识。
但是用户仍然可以复制已经获得授权的机器的硬件标识和授权码来复制软件。
所以对于硬件标识的确定也需要对用户保密,毕竟要完全复制一台机器的所有硬件序列号是一件非常困难的事情。
相关文章推荐
- javascript 硬盘序列号+其它硬件信息
- 用C#获取硬盘序列号,CPU序列号,网卡MAC地址的源码
- C#利用win32 Api 修改本地系统时间、获取硬盘序列号
- 用JAVA获取硬盘序列号的方法
- C#获取当前主机硬件信息
- Qt获取CPU序列号(最简单的方式)
- Windows下使用C++(Win32SDK)编程无需提权读取硬盘序列号(XP、Win7和Win10都可用)
- 【转载】使用C#获取CPU及硬盘序列号的源代码
- C#实现读取指定盘符硬盘序列号的方法
- 杂记
- 计算机中的字,字长,位,字节的概念
- Socket-java网络编程1
- Android网络通信中数据传输的JSON格式使用
- 再次理解HTTP请求过程[概念原理篇]
- 服务器server与http常用知识
- HttpClient-POST-GSON
- 内核调试方法之串口输出
- App的网络性能优化实践
- HttpClient 登录爬取信息
- Android网络通信必备神器Volley详解——实现一个自定义的Request(以Gson为例)