生成唯一硬件ID的可靠方法

问题:我必须为每个联网的客户端提供唯一的ID,例如:

  • 一旦在目标计算机上安装了客户端软件,它应该保持不变(ID),如果软件重新安装在同一台计算机和同一个OS安装中,它应该继续保留,
  • 如果在大多数情况下修改了硬件configuration(不包括更换主板)
  • 当安装有客户端软件的硬盘驱动器被克隆到具有相同硬件configuration的另一台计算机(或尽可能相似)时,客户端软件应该知道该更改。

一点点的解释和一些背景故事:

这个问题基本上是一个古老的问题,也涉及软件复制保护的主题,因为这里提到了一些在这方面使用的机制。 我现在应该清楚,我不是在寻找一个防拷贝scheme。 请继续阅读。 🙂

我正在开发一个应该在本地networking中工作的客户端 – 服务器软件。 我必须解决的一个问题是要识别networking中的每个独特的客户端(不是那么多的问题),以便我可以将某些属性应用于每个特定的客户端,在特定的部署生命周期中保留和执行这些属性客户。

当我正在寻找解决scheme时,我意识到以下几点:

  • Windows激活系统使用某种对硬件修改非常敏感的重指纹机制,
  • 磁盘映像软件在安装过程中,首次运行时或以任何其他方式复制所有卷ID(在格式化时与每个分区绑定),以及自定义,唯一生成的ID,并且存储在registry中或在硬盘上,所以很容易混淆两个。

这种问题的明显select是找出BIOS标识符(不是100%确定是否通过相同的主板型号是唯一的),因为这是我可以依赖的唯一不是重复的,通过克隆,并且不能改变(至less不能使用一些用户空间程序)。 一切都失败了,要么是不可靠的(MAC克隆,任何人?),要么太苛刻(对configuration的变化太敏感)。

我想问的问题是,我正确地做,架构明智吗? 也许有一个更好的工具,我必须完成的任务…

我想到的另一种方法是类似握手机制,其中服务器维护一个连接的客户端ID的内部查找表(甚至可以完全基于软件,在任何特定时刻都是非唯一的),并告诉客户端如果在连接时提供重复的ID,则在握手期间拿出一个不同的ID。 不幸的是,这种方法并不能很好地满足在特定客户生命周期中将特性绑定到特定客户端的要求。

Solutions Collecting From Web of "生成唯一硬件ID的可靠方法"

在我看来,你应该自己构建与您的需求相对应的唯一ID。 这个ID可以从对您很重要的信息(有关软件和硬件组件的一些信息)中构建为哈希 (如MD5,SHA1或SHA512)。

如果您使用自己的私钥签名这样的哈希,并且您的软件在启动过程中进行验证, 签名的密钥( 签名哈希值 )(只有公钥必须与您的软件一起安装),则可以使您的解决方案更加安全。 人们可以通过不同的在线服务来扩展这种解决方案,但是企业客户可能会发现在线服务不太好。

你正在寻找的是Windows WMI 。 您可以获得主板ID(在同一类型的主板上唯一的)或许多其他类型的唯一标识符,并提供一些聪明的种子功能来生成UHID。 我刚刚做了一个缩写呢?

如果您正在寻找获取主板(BIOS)ID:

WMI class: Win32_BIOS Namespace: \Root\Cimv2 

文档: http : //msdn.microsoft.com/en-us/library/aa394077(VS.85).aspx
示例代码: http : //msdn.microsoft.com/en-us/library/aa390423%28VS.85%29.aspx

编辑 :你没有指定一种语言(我假设C ++),但是这可以用Java(使用COM驱动程序)和任何.NET语言来完成。

许多程序使用hostId来构建许可证代码(如基于FlexLM的许可证代码)。 根据操作系统,看看Matlab做了什么:

http://www.mathworks.com/support/solutions/en/data/1-171PI/index.html

也看看这个问题:

从类Unix系统获取唯一的ID

一旦我还看到了一些基于硬盘序列号的许可证计划,也许这是不太可能改变的。 有些人会建议使用以太网卡的MAC,但可以重新编程。

不要依靠MAC和音量ID !!!!!

连接到验证服务器可能会导致您还有很多麻烦,因为:
*您的客户可能并不总是连接到互联网。
*您的客户可能需要连接特殊设置(路由器/ NAT /代理/网关),以便让它连接到验证服务器。
*他们可能在防火墙后,将阻止除少数(我的情况)以外的所有程序。 在某些情况下,防火墙可能不受其控制(适用于大多数企业用户)!

如果你需要强大的保护,你需要依靠硬件ID。

这是一个图书馆,提供你想要的:一个可靠的方法来读取计算机的硬件ID。 其中,它可以读取CPU ID和HDD ID都是唯一的,永远不会改变(是的,甚至不格式化计算机并重新安装Windows)。

有一个编译的演示应用程序,演示确实ID是唯一的和永久性的: http : //www.soft.tahionic.com/download-hdd_id/index.html

还有许多编程语言的演示源代码: http : //www.soft.tahionic.com/download-hdd_id/hardware%20ID%20programmer%27s%20DLL.html

库的使用很简单,就像调用一个单一的函数(当然你在加载DLL之后)。