在C#中创建健壮的硬件串行/硬件ID

时间:2016-08-17 14:18:56

标签: c# .net security hardware

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

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

到目前为止一直很好 - 现在,系统在虚拟环境中运行,其中新的CPU动态链接 - 因此CPU的顺序发生变化。使用无效的密钥,软件不再运行 - 我想要和期望的,而不是我的客户。因此,我必须稍微改变一下这个过程。

据我所知,Windows 7(甚至以前的版本)在其激活/注册ID中具有某种强大功能 - 较小的硬件更改并未使激活/许可无效 - 这就是我想在我的模仿许可背景。

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

注册:

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

    启动应用程序时:

    1. 使用不同的设置(CPU,主板,BIOS,等等)生成X个不同的硬件ID(WMI访问速度是否足够快?替代方案?)
    2. 如果新生成的超过X%(95?)等于许可文件中注册的那些,一切都很好并且应用程序启动
    3. 实际上,使用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是正确的选择。

      因此最后的问题: 这是创建强大的硬件许可的实用方法还是我错过了一点? 其次,如果这是最先进的技术,我的WMI是正确的还是有更好的方法?

      提前多多感谢!

1 个答案:

答案 0 :(得分:0)

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

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