代码之家  ›  专栏  ›  技术社区  ›  mr.b Scott Lystig Fritchie

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

  •  25
  • mr.b Scott Lystig Fritchie  · 技术社区  · 14 年前

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

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

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

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

    我正在开发一个客户机-服务器软件,它应该在本地网络中工作。我必须解决的一个问题是,识别网络中的每个唯一客户机(不是很多问题),这样我就可以对每个特定客户机应用某些属性,在特定客户机的部署生命周期中保留和实施这些属性。

    当我在寻找解决方案时,我意识到:

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

    对于这类问题,最明显的选择是找出BIOS标识符(但不能100%确定这是否通过相同的主板型号实现唯一性),因为这是我唯一可以依赖的东西,它不会被复制、克隆传输,也不会被更改(至少不会通过使用某些用户空间程序)。其他一切都失败了,要么就是不可靠(Mac克隆,有人吗?)或者要求太高(就其对配置更改太敏感而言)。

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

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

    4 回复  |  直到 6 年前
        1
  •  7
  •   knoxgon Norman Bird    6 年前

    在我看来,您应该根据您的需求构造惟一的ID。此ID可以构造为 搞砸 (如MD5、SHA1或SHA512)来自对您很重要的信息(有关软件和硬件组件的一些信息)。

    如果您在启动过程中使用您的私钥和软件对此类哈希进行签名,并验证密钥( 有符号哈希值 )已签名(只有公钥必须与软件一起安装)。人们可以通过不同的在线服务来扩展这种解决方案,但是企业客户会发现在线服务并不那么好。

        2
  •  7
  •   David Titarenco    14 年前

    你要找的是 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语言来完成。

        3
  •  4
  •   Community Dunja Lalic    7 年前

    许多程序使用hostid来构建许可证代码(如基于flexlm的代码)。看看matlab根据操作系统做什么:

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

    还可以看看这个问题:

    Getting a unique id from a unix-like system

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

        4
  •  0
  •   Semaphore anshul garg    8 年前

    不要依赖Mac和卷ID!!!!!!!

    连接到验证服务器也可能导致许多问题,因为:
    *您的客户可能并不总是连接到Internet。
    *您的客户可以使用特殊设置(路由器/NAT/代理/网关)进行连接,这些设置需要输入到您的程序中,以便让它连接到验证服务器。
    *它们可能位于防火墙后面,防火墙将阻止除少数程序以外的所有程序(我的情况)。在某些情况下,防火墙可能不受其控制(对大多数公司用户有效)!

    如果您需要强大的保护,则需要依赖硬件ID。

    这是一个库,它提供了您想要的确切内容:一种读取计算机硬件ID的可靠方法。其中,它可以读取CPU ID和HDD ID,这两个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加载到内存中之后)。

    推荐文章