使用 C++ 在 Microsoft Windows 上生成一个不易被欺骗的唯一硬件 ID(例如更改 MAC 地址)的最佳方法是什么?
6 回答
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 关系,而不会很快遇到某种问题或者以后,当这个成语 ifs 发现不再合适时)。
The idea should be to register the users in a somewhat reachable site, give them keys you generate, and check that a same user/key pair is not con-temporarily used more than an agreed number of times under a given time period. When violations exceed, or keys becomes old, just block and wait for the user to renew.
As you can see, the answer mostly depends on the reason behind your question, more than from the question itself.
分配给硬件的各种 ID 可以被读取和组合以形成机器密钥。例如,您可以获得存储软件的硬盘的 ID、proc ID 等。其中一些可以比其他更容易设置,但部分优势在于将多个部分组合在一起,这些部分不一定自己足够强大。
这是一个可以读取和显示您的计算机/硬件 ID的程序(也可用作DLL ):http: //www.soft.tahionic.com/download-hdd_id/index.html
使用 Win32 系统 HDS API。不要阅读注册表,它根本没有任何意义。