在Microsoft Windows上用C ++生成唯一的硬件ID的最好方法是什么,这个C ++不容易被欺骗(例如更改MAC地址)?
Windows在注册表中存储每台机器的唯一Guid:
HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography\MachineGuid
这曾经是CPU的序列号,但今天有很多类型的主板,这个因素是不准确的。 MAC地址可以很容易伪造。 这留下了我们的内部硬盘序列号。 另见: http : //www.codeproject.com/Articles/319181/Haephrati-Searching-for-a-reliable-Hardware-ID
有各种各样的“技巧”,但唯一真正的“生理答案”是“不,没有解决办法”。
一台“机器”只不过是带有一些硬件的无源总线。 虽然每块铁都可以提供一个可用的标识符,但是每一块铁都可以被用户替换,无论是什么原因,你都无法完全意识到(所以如果你的功能基于这个原因,你就会给你的问题用户,因此 – 每当硬件必须被替换/重新初始化/重新配置等等时 – 对于你自己而言)。
现在,如果您的问题是在许多机器必须互相操作的情况下识别机器,则MAC或IP地址或主机名称扮演着良好角色。 但要准备好这样一个观点,即他们在很长一段时间内不一定是恒定的(所以应避免对它们进行硬编码 – 而是在你的任何启动时“发现”)
如果你的问题是确定一个软件实例或许可证,你最好集中精力于另一种解决方案:你向“用户”(这是用户有钱,而不是他的电脑!)出售许可证,而不是他们的“机器”(用户必须可以自由更改,只要他们需要/未经您的许可,因为您没有授权的硬件或操作系统…),因此您的问题是不识别一台机器,但一个用户(考虑到同一台机器可以成为许多用户的主机,同一个用户可以在不同的机器上工作),你不能假设/施加1:1的关系,而不会更快地遇到某种问题或以后,当这个成语如果发现不合适)。
这个想法应该是将用户注册到一个有点可达的站点,给他们生成密钥,并且检查在给定的时间段内同一个用户/密钥对不被同时使用超过约定的次数。 当违规超过,或者键变老时,就阻止并等待用户更新。
正如你所看到的,答案主要取决于你的问题背后的原因,而不是问题本身。
有各种ID分配给硬件,可以读取和组合形成一个机器密钥。 例如,您可以获取存储软件的硬盘的ID,过程ID等。其中一些可以比其他设置更容易设置,但部分优势在于将多个组合在一起,但不一定自己足够强大。
这是一个程序(也可作为DLL ),可以读取和显示您的计算机/硬件ID: http : //www.soft.tahionic.com/download-hdd_id/index.html
使用Win32系统HDS API。 不要读注册表,它根本没有意义。