在 C# 中创建可靠的硬件序列号/硬件 ID

Create a robust hardware serial / hardware ID in C#

我在许可过程中创建了一个小硬件锁。在安装之前会生成一个(希望如此)唯一的硬件 ID,并将其编码为我的许可证文件的一部分。每当我的应用程序启动时,都会重新生成硬件密钥并将其与已注册的密钥进行比较。

实际上,硬件密钥是指第一个CPU,BIOS和主板信息基于the solution by Alex Sutu

到目前为止一切顺利 - 现在,系统在虚拟环境中运行,新的 CPU 动态链接 - 因此 CPU 的顺序发生变化。使用无效的密钥,该软件不再是 运行 - 正如我而不是我的客户所希望和期望的那样。因此,我必须稍微改变一下流程。

据我所知,Windows 7(甚至更早的版本)在其激活/注册 ID 中具有某种稳健性 - 较小的硬件更改不会使激活/许可证无效 - 就是这样我想在我的许可环境中模仿。

我找到了一些解释 here - 这让我想到了以下一般过程:

报名人数:

  1. 使用不同的设置生成 X 个不同的硬件 ID(CPU、主板、BIOS 等)
  2. 在许可证文件中注册这些 ID

启动应用程序时:

  1. 使用不同的设置生成 X 个不同的硬件 ID(CPU、主板、BIOS 等等)(WMI 访问速度足够快吗?替代方案?)
  2. 如果新生成的 X%(95?)与许可证文件中注册的相同,则一切正常,应用程序启动

实际上,使用 WMI 查询生成硬件 ID 需要相当长的时间(大约在 4 到 8 秒之间)。

static string identifier(string wmiClass, string wmProperty)
        {
            string result = "";
            var mc = new ManagementClass(wmiClass);
            var moc = mc.GetInstances();
            foreach (var mo in moc)
            {
                if (result == "")
                {
                    try
                    {
                        result = mo[wmProperty].ToString();
                        //Only get the first one
                        break;
                    }
                    catch
                    {
                    }
                }
            }
            return result;
        }

调用示例:

string retVal = identifier("Win32_Processor", "UniqueId");

所以我有点不确定,考虑更多的ID是否是正确的选择。

因此最后一个问题: 这是创建强大的硬件许可的可行方法还是我遗漏了一点? 其次,如果这是 "state of the art",我的 WMI 方法是正确的还是有更好的方法?

非常感谢!

您的方法大体上是正确的。收集不同的标识符,安全地存储它们并颁发许可证。只要只有少数标识符发生变化,您就可以将存储更新为新值,但仍然 运行 应用程序。

截至收集硬件信息时,您可以在"locked mode"开始加载应用程序。一旦 HW 标识符可用,您就可以检查许可证并异步解锁应用程序。这样你就不会受到通信延迟的限制 - 我使用这种方法对远程服务器进行许可证验证。