35

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

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

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

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

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

在寻找解决方案时,我意识到以下几点:

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

解决此类问题的明显选择是找出 BIOS 标识符(虽然不能 100% 确定这是否在相同的主板型号中是唯一的),因为这是我唯一可以依赖的不重复的东西,通过克隆转移,并且无法更改(至少不能通过使用某些用户空间程序)。其他一切都失败了,要么不可靠(MAC 克隆,有​​人吗?),要么要求太高(因为它对配置更改过于敏感)。

我想问的子问题是,我在架构方面做得对吗?也许有一个更好的工具来完成我必须完成的任务......

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

4

4 回答 4

10

您正在寻找的是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 语言来完成。

于 2010-05-16T00:00:22.853 回答
9

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

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

于 2010-05-15T23:57:28.420 回答
4

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

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

也看看这个问题:

从类 Unix 系统中获取唯一 ID

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

于 2010-05-20T15:31:32.360 回答
4

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

卷 ID
不要依赖卷 ID!曾经。它不是永久性的。用户可以很容易地改变它。它也可以通过简单地格式化驱动器来改变。

WMI
WMI 是一项服务。可以很容易地禁用。实际上,我试过了,我发现在许多计算机上都被禁用或损坏(是的,经常损坏)。

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

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

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

于 2011-01-07T13:51:32.340 回答