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

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

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

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

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

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

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

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

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

我想到的另一种方法类似于握手机制,其中服务器维护已连接客户端 ID 的内部查找表(甚至可以完全基于软件并且在任何给定时刻都不是唯一的),并告诉客户端如果连接时提供了重复的 ID,则在握手期间提供不同的 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!曾经。它不是永久的。用户可以轻松更改它(30秒以内).

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top