对于生成每台 PC 许可证密钥的要求,我需要一些代码,这些代码将在任何 PC 上返回一个稳定且(接近)唯一的密钥。它不必保证是唯一的,但要接近。不过,它确实需要相当稳定,以便给定的 PC 始终生成相同的结果,除非硬件发生重大变化。
这适用于 Windows 应用程序,使用 wxWidgets 但 Win32 或其他选项很好。
我在考虑 MAC 地址,但是笔记本电脑可以在省电模式下定期禁用网卡呢?我遇到了GetCurrentHwProfile但它看起来不像我想要的?
对于生成每台 PC 许可证密钥的要求,我需要一些代码,这些代码将在任何 PC 上返回一个稳定且(接近)唯一的密钥。它不必保证是唯一的,但要接近。不过,它确实需要相当稳定,以便给定的 PC 始终生成相同的结果,除非硬件发生重大变化。
这适用于 Windows 应用程序,使用 wxWidgets 但 Win32 或其他选项很好。
我在考虑 MAC 地址,但是笔记本电脑可以在省电模式下定期禁用网卡呢?我遇到了GetCurrentHwProfile但它看起来不像我想要的?
不久前我有一个想法是使用CryptProtectData作为识别机器的一种方式。在该 API 的幕后,Microsoft 已经完成了您正在寻找的事情。我从来没有测试过它,我很好奇它是否真的可行。
CryptProtectData
基本上你会用with编码一个常量魔法值,CRYPTPROTECT_LOCAL_MACHINE
结果就是你的机器 ID。
我只会使用 MAC 地址方法;当无线/ LAN 卡关闭时,它们仍会显示在网络连接中。因此,您应该仍然能够获得 MAC。
考虑一下:任何时候您可以联系您的网络服务器或任何您用来编目这些 ID 的东西,用户都必须有某种形式的网卡可用。
哦,你也许可以使用客户电脑支持的CPU序列号。
我认为到目前为止,这里还没有发现真正简单而独特的方法。
问候米克尔。
对于一个漂亮的脑死亡测试,我使用操作系统的 ProductID 代码和计算机名称 - 两者都从注册表中提取。不是很安全,但无论如何它都假装安全。
编辑
要回答约翰关于我正在阅读什么键的问题:
SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID
SYSTEM\CurrentControlset\Control\ComputerName\ComputerName\ComputerName
如果您想要比机器本身可以告诉您的更难欺骗的东西,您可能需要提供专用于此目的的 USB 加密狗(不仅仅是闪存驱动器)。
用安装windows的硬盘的序列号怎么样?
函数GetVolumeInformation()会给你这样的序列号。要访问硬盘供应商分配的 ID 而不是 Windows 分配的 ID,您可以使用 Win32_PhysicalMedia 类。
要确定安装 windows 的驱动器,您可以使用函数 ExpandEnvironmentStrings() 扩展变量 %windir"
如果您的体系结构允许,另一种选择是使用 UuidCreate() 在安装时生成随机 GUID 并将其永久保存在注册表中。只要保留注册表,此 GUID 就可以用作 ID。新的注册表数据库通常被视为新安装。
第三种选择是让知名服务器分配 ID。启动时,软件可以在注册表中查找 ID,如果找不到,将联系服务器并提供其 MAC 地址、主机名、硬盘序列号、机器 SID 和任何数量的可识别信息(密钥)。
然后服务器根据给定的信息确定客户端是否已经注册。服务器可以有一个宽松的策略,例如只需要大部分密钥进行匹配,这样即使在注册表完全清除并且部分(但不是全部)硬件的情况下,该机制也可以工作。更换。
如何使用 CPU 的序列号。我记得微软曾经为此提供了一个 api,它可以运行必要的汇编代码,并为您提供有关 CPU 的各种信息,包括序列号。不确定它是否适用于 AMD 芯片,我认为它是特定于英特尔的。
当然,CPU ID 足够安全和静态!!