问题:我必须为每个联网客户端提供唯一 ID,例如:
- 一旦客户端软件安装在目标计算机上,它(ID)应该保持不变,并且如果软件重新安装在同一台计算机和相同的操作系统安装上,它应该继续保持,
- 如果以大多数方式修改硬件配置,则不应更改(更换主板除外)
- 当安装了客户端软件的硬盘被克隆到具有相同硬件配置(或尽可能相似)的另一台计算机上时,客户端软件应该知道该更改。
一点解释和一些背景故事:
这个问题基本上是一个古老的问题,也涉及软件复制保护的主题,因为这里提到了该领域使用的一些机制。在这一点上我应该清楚,我不是在寻找复制保护方案。请继续阅读。:)
我正在开发一个应该在本地网络中工作的客户端-服务器软件。我必须解决的问题之一是识别网络中的每个唯一客户端(不是什么大问题),以便我可以将某些属性应用于每个特定客户端,在特定的部署生命周期内保留和强制执行这些属性客户。
在寻找解决方案时,我意识到以下几点:
- Windows 激活系统使用某种对硬件修改极为敏感的重指纹机制,
- 磁盘映像软件沿所有卷 ID(格式化时与每个分区绑定)复制,以及在安装过程中、首次运行期间或以任何其他方式生成的自定义唯一 ID,严格来说,这些 ID 本质上是软件,并存储在注册表或在硬盘上,所以很容易混淆两者。
解决此类问题的明显选择是找出 BIOS 标识符(虽然不能 100% 确定这是否在相同的主板型号中是唯一的),因为这是我唯一可以依赖的不重复的东西,通过克隆转移,并且无法更改(至少不能通过使用某些用户空间程序)。其他一切都失败了,要么不可靠(MAC 克隆,有人吗?),要么要求太高(因为它对配置更改过于敏感)。
我想问的子问题是,我在架构方面做得对吗?也许有一个更好的工具来完成我必须完成的任务......
我想到的另一种方法类似于握手机制,其中服务器维护连接的客户端 ID 的内部查找表(在任何给定时刻,它甚至可以完全基于软件且不唯一),并告诉客户端如果在连接时提供了重复的 ID,则在握手期间提出不同的 ID。不幸的是,这种方法不能很好地满足在生命周期内将属性绑定到特定客户端的要求之一。