基于软件/硬件唯一识别PC

时间:2010-09-03 13:20:34

标签: c++ security winapi hardware-id

对于生成每个PC许可证密钥的要求,我需要一些代码,这些代码将在任何PC上返回稳定和(近乎)唯一密钥。 不保证唯一,但是关闭。它确实需要相当稳定,因此除非硬件发生实质性改变,否则给定的PC总会生成相同的结果。

这适用于Windows应用程序,使用wxWidgets但Win32或其他选项都可以。

我在考虑MAC地址,但笔记本电脑可以在省电模式下常规禁用网卡呢?我遇到GetCurrentHwProfile,但它看起来不像我想要的那样?

7 个答案:

答案 0 :(得分:4)

我暂时想到的一个想法是使用CryptProtectData作为识别机器的方法。在该API的幕后,微软已经完成了你正在寻找的东西。我从未测试过它,我很好奇它是否真的可行。

基本上,您会使用CryptProtectData CRYPTPROTECT_LOCAL_MACHINE编码一个恒定的魔术值,结果就是您的机器ID。

答案 1 :(得分:2)

我会选择MAC地址方法;当无线/ LAN卡关闭时,它们仍然显示在网络连接中。因此,您仍然可以获得MAC。

请考虑这一点:只要您能够联系您的网络服务器或任何您正在使用这些ID编目的内容,用户就会拥有以获得某种形式的网卡。< / p>

哦,您可能可以使用客户计算机的CPU序列号来支持它。

答案 2 :(得分:1)

如果你想要的东西比机器本身可以告诉你的更难,你可能需要提供专用于此目的的USB加密狗(不仅仅是闪存驱动器)。

答案 3 :(得分:1)

如何使用安装了Windows的硬盘的序列号?

函数GetVolumeInformation()将为您提供此类序列号。 要访问由硬盘供应商分配的ID而不是Windows分配的ID,您可以使用Win32_PhysicalMedia类。

要确定安装Windows的驱动器,可以使用函数ExpandEnvironmentStrings()扩展变量%windir“

如果您的体系结构允许,另一个选项是使用UuidCreate()在安装时生成随机GUID并将其永久保存在注册表中。只要注册表仍然存在,就可以将此GUID用作ID。新的注册表数据库通常被视为新安装。

第三种选择是让知名服务器分配ID。启动时,软件可以在注册表中查找ID,如果没有找到,将联系服务器并提供其MAC地址,主机名,硬盘序列号,机器SID和任意数量的可识别信息(密钥)。

然后,服务器根据给定的信息确定客户端是否已注册。服务器可以有一个宽松的策略,例如只需要大多数密钥进行匹配,这样即使在完全擦除注册表的情况下该机制也可以工作,并且部分(但不是全部)硬件是替换。

答案 4 :(得分:1)

我认为到目前为止还没有发现真正简单而独特的方法。

  1. GetVolumeInformation检索甚至不接近唯一ID .....
  2. 使用任何硬件序列都存在问题,因为制造商并不致力于始终支持它,尤其是保持全球唯一性。
  3. GetCurrentHwProfile检索GUID,但它的值受未成年人的影响!硬件变化......
  4. 使用产品密钥......将带来U来处理被盗软件 - 全球有很多海盗装置。
  5. 创建自己的GUID并将其保存在注册表中(在任何地方)不会通过克隆图像来防止重复....
    等等... 从我的角度来看,最好的方法是结合: 卷ID + MAC列表+机器SID +机器名称。显然,在服务器端管理许可证策略; 0)
  6. 此致 MICKEL。

答案 5 :(得分:0)

对于一个漂亮的脑死测试,我使用的是操作系统的ProductID代码和计算机名 - 都是从注册表中提取的。不是很安全,但无论如何它都假装安全。

修改

回答John关于我正在读什么键的问题:

SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductID

系统\ CurrentControlSet \控制\计算机名\计算机名\计算机名

答案 6 :(得分:0)

如何使用CPU的序列号。我记得微软曾经为此提供了一个API,它将运行必要的汇编程序代码并返回各种有关CPU的信息,包括序列号。不确定它是否适用于AMD芯片,我认为这是特定于英特尔的。

当然,CPU ID安全且足够静态!!