C ++获取处理器ID

这个线程是好的。 如何获得处理器和主板ID?

我想使用不使用WMI或任何第三方库的C ++代码获得处理器ID。

或者电脑上的任何东西都是独一无二的。 有一点是以太网ID,但在某些机器上又可以移除。 这我主要用于许可目的。

处理器ID是唯一且可在所有主要处理器上使用的?

我最近有类似的问题,我做了以下。 首先,我获得了一些独特的系统识别值:

  • GetVolumeInformation用于HDD序列号

  • GetComputerName (这当然不是唯一的,但我们的系统使用计算机名称来识别局域网上的客户端,所以它对我来说很好)

  • __cpuid (特别是PSN – 处理器序列号字段)

  • GetAdaptersInfo为MAC地址

我采取了这些值,并以任意但确定性的方式将它们结合起来(阅读下面的更新!) (添加,xoring,划分和保留余数等)。 对价值进行迭代,就好像它们是字符串并且有创意。 最后,您将得到一个字节文字,您可以将其转换为字母和数字的ASCII范围,以获得看起来不像噪音的独特“可读”代码。

另一种方法可以简单地连接这些值,然后用它们上面的东西(也许再次转换成字母)来“掩盖”它们。

我说这是唯一的,因为至少有一个输入应该是唯一的(MAC地址)。 当然,你需要对数论有一些理解,而不是把这个独特性吹掉,但无论如何它应该足够好。

重要更新 :自从这篇文章我学到了一些关于密码学的东西,而且我认为组成一个任意的组合(本质上是你自己的散列)几乎肯定是一个坏主意。 在实践中使用的散列函数被构造成行为良好(如低冲突概率)并且难以破解(能力构造具有与另一散列值相同的散列值的值)。 构建这样的功能是一个非常困难的计算机科学问题,除非你是合格的,你不应该尝试。 正确的方法是连接你可以收集的有关硬件的任何信息(即我在帖子中列出的信息),并使用加密散列或数字签名来获得可验证和安全的输出。 不要自己实施密码算法; 有很多漏洞需要花费大量的知识才能避免。 使用一个众所周知的,值得信赖的库来实现算法。

如果您使用的是Visual Studio,Microsoft将在<intrin.h>标头中提供__cpuid内在。 链接的msdn网站上的示例。

嗯…

有特殊的库可以根据安装的硬件生成唯一的ID(因此对于指定的计算机,这个ID始终是相同的)。 他们大多数需要主板ID +硬盘ID + CPU ID和混合这些值。

Whe重新发明轮子? 为什么不使用这些库? 任何严重的原因?