在 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 - 这让我想到了以下一般过程:
报名人数:
- 使用不同的设置生成 X 个不同的硬件 ID(CPU、主板、BIOS 等)
- 在许可证文件中注册这些 ID
启动应用程序时:
- 使用不同的设置生成 X 个不同的硬件 ID(CPU、主板、BIOS 等等)(WMI 访问速度足够快吗?替代方案?)
- 如果新生成的 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 标识符可用,您就可以检查许可证并异步解锁应用程序。这样你就不会受到通信延迟的限制 - 我使用这种方法对远程服务器进行许可证验证。
我在许可过程中创建了一个小硬件锁。在安装之前会生成一个(希望如此)唯一的硬件 ID,并将其编码为我的许可证文件的一部分。每当我的应用程序启动时,都会重新生成硬件密钥并将其与已注册的密钥进行比较。
实际上,硬件密钥是指第一个CPU,BIOS和主板信息基于the solution by Alex Sutu。
到目前为止一切顺利 - 现在,系统在虚拟环境中运行,新的 CPU 动态链接 - 因此 CPU 的顺序发生变化。使用无效的密钥,该软件不再是 运行 - 正如我而不是我的客户所希望和期望的那样。因此,我必须稍微改变一下流程。
据我所知,Windows 7(甚至更早的版本)在其激活/注册 ID 中具有某种稳健性 - 较小的硬件更改不会使激活/许可证无效 - 就是这样我想在我的许可环境中模仿。
我找到了一些解释 here - 这让我想到了以下一般过程:
报名人数:
- 使用不同的设置生成 X 个不同的硬件 ID(CPU、主板、BIOS 等)
- 在许可证文件中注册这些 ID
启动应用程序时:
- 使用不同的设置生成 X 个不同的硬件 ID(CPU、主板、BIOS 等等)(WMI 访问速度足够快吗?替代方案?)
- 如果新生成的 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 标识符可用,您就可以检查许可证并异步解锁应用程序。这样你就不会受到通信延迟的限制 - 我使用这种方法对远程服务器进行许可证验证。