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

mr.*_*r.b 30 windows client-server bios uniqueidentifier hardware-id

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

  • 一旦客户端软件安装在目标计算机上,它(ID)应该保持不变,并且如果软件重新安装在同一台计算机和相同的操作系统上,则应继续保持,
  • 如果在大多数情况下修改硬件配置(更换主板除外),则不应更改
  • 当安装了客户端软件的硬盘驱动器克隆到具有相同硬件配置(或尽可能相似)的另一台计算机时,客户端软件应该知道该更改.

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

这个问题基本上是古老的问题,也触及了软件拷贝保护的主题,因为这里提到了该领域中使用的一些机制.在这一点上我应该清楚,我不是在寻找一种复制保护方案.请继续阅读.:)

我正在开发一个应该在本地网络中工作的客户端 - 服务器软件.我必须解决的一个问题是识别网络中的每个唯一客户端(而不是问题),以便我可以将某些属性应用于每个特定客户端,在特定部署的生命周期中保留并强制执行这些属性.客户.

在我寻找解决方案时,我发现了以下情况:

  • Windows激活系统使用某种对硬件修改极其敏感的重型指纹识别机制,
  • 磁盘映像软件会复制所有卷ID(格式化时绑定到每个分区),以及在安装过程中,首次运行期间或以任何其他方式自定义,唯一生成的ID,严格来说属于软件本身,并存储在注册表或在硬盘上,所以很容易混淆两个.

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

我想问的一个子问题是,我是否正确地进行了架构方面的工作?也许有一个更好的工具来完成我必须完成的任务......

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

Dav*_*nco 9

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

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

WMI class: Win32_BIOS
Namespace: \Root\Cimv2
Run Code Online (Sandbox Code Playgroud)

文档: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语言来完成.

  • 默认情况下,WMI并非在所有计算机上都可用.而且,它很容易崩溃.我发生在我身上.幸运的是,有一个修复程序(http://searchwindowsserver.techtarget.com/tip/Repairing-damaged-WMI).无论如何,在这些情况下,许可证验证代码可能会失败. (2认同)

Ole*_*leg 8

在我看来,您应该构建与您的要求相对应的唯一ID.此ID可以根据对您很重要的信息(有关软件和硬件组件的一些信息)构建为哈希(如MD5,SHA1或SHA512).

如果您使用私钥签署此类哈希并且您的软件在启动期间进行验证,那么您可以使解决方案更加安全,密钥(签名哈希值)已签名(只有公钥必须与您的软件一起安装).可以通过不同的在线服务扩展这种解决方案,但企业客户可以找到不太好的在线服务.

  • 我的意思是,您可以生成一个字符串或字节数组,其中包含所有信息(此信息的串联),这些信息很重要,并且在克隆计算机时**不变.然后从这个字节数组计算哈希值.此哈希值将是您的唯一ID.您在软件安装期间保存此类哈希值.每次启动软件时,您都会再次计算ID(哈希),并与安装期间保存的值进行比较.这不是你想要的吗?如何读取硬件信息不是问题.包含WMI的方式有很多种. (2认同)

Sys*_*ank 5

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

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

另外看看这个问题:

从类 Unix 系统获取唯一 ID

有一次我还看到一些程序的许可证基于硬盘驱动器的序列号,也许这是不太可能改变的事情。有些人建议使用以太网卡的 MAC,但这可以重新编程。


WeG*_*ars 5

MAC
\n不要依赖 MAC!曾经。它不是永久的。用户可以轻松更改它(30 秒内)。

\n\n

卷 ID
\n不要依赖卷 ID!曾经。它不是永久的。用户可以轻松更改它。它也可以通过简单地格式化驱动器来改变。

\n\n

WMI
\nWMI 是一项服务。可以轻松禁用。实际上,我尝试过,发现在许多计算机上它被禁用或损坏(是的,经常损坏)。

\n\n

许可证服务器
\n连接到验证服务器也可能会给您带来很多麻烦,因为:
\n * 您的客户可能并不总是连接到 Internet。
\n * 您的客户可能会使用特殊设置(路由器/NAT/代理/网关)进行连接,他们需要将这些设置输入到您的程序中,以便让它连接到验证服务器。
\n * 他们可能位于防火墙后面,该防火墙将阻止除少数程序(我的情况)之外的所有程序。在某些情况下,防火墙可能不受他们的控制(对大多数企业用户有效)!
\n *将您的程序重定向到模拟您的许可服务器的本地假网络服务器非常容易。

\n\n

硬件数据
\n如果需要强有力的保护,则需要依靠硬件。用户无法编辑的内容。例如 Intel/AMD CPU 中可用的 CPU ID 指令以及写入驱动器 IDE 接口的序列号。
\nCPU ID 和 HDD ID 是永久的。它们永远不会改变,即使在您格式化计算机并重新安装 Windows 后也是如此。

\n\n

这是可行的。例如,该库读取计算机的硬件 ID。有一个已编译的演示以及源代码/ DLL。免责声明:该链接指向商业产品(19\xe2\x82\xac/无版税)。

\n

  • 抱歉,但这并不能回答问题 - 它只是链接到一个商业网站,其中包含一个所谓的“解决问题”的 DLL。 (9认同)