我正在为一个客户开发一些桌面软件以供转售。客户希望限制软件,使注册码只能用于一个特定的计算机。
除了使用网络卡的MAC地址外,还有没有其他技术(适用于Windows和Mac OS X),可以唯一地识别一台计算机?
我正在为一个客户开发一些桌面软件以供转售。客户希望限制软件,使注册码只能用于一个特定的计算机。
除了使用网络卡的MAC地址外,还有没有其他技术(适用于Windows和Mac OS X),可以唯一地识别一台计算机?
或者客户可能更换整台机器,并需要更新的许可证才能在新机器上运行您的软件。我曾在工作的公司几乎每天都会接到这些电话。"我们将服务器升级到千兆网适配器,现在许可证无法使用,因为新适配器具有不同的MAC地址。"
最好的方法是使用C#在Windows中获取UUID。
public string GetUUID()
{
var procStartInfo = new ProcessStartInfo("cmd", "/c " + "wmic csproduct get UUID")
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
var proc = new Process() { StartInfo = procStartInfo };
proc.Start();
return proc.StandardOutput.ReadToEnd().Replace("UUID", string.Empty).Trim().ToUpper();
}
wmic cpu get DeviceId /format:value
这将获取CPU ID,您可以运行该命令:
1 - CPU (cpu: DeviceID) 2 - 主板 (baseboard: serialnumber) 3 - BIOS (bios: serialnumber)
如果您没有至少两个填充值,则获取
4 - 网络适配器 - (nic: MACAddress) 5 - RAM - (memphysical: SerialNumber)
根据您的业务逻辑,您可以使用前两个可用的序列号创建您的注册号码,如果始终按照相同的顺序进行,则在重新安装时注册号码仍将起作用,但是如果设备更改或用户尝试在辅助计算机上安装,则 ID 会更改,从而使注册号码失效。为了减少技术支持电话的数量,指纹识别的硬件越少,头痛就越少,如果尝试对最不可能升级的项目进行指纹识别,那么进一步减少了头痛。我喜欢上面的顺序。
您可以使用Diffie-Hellman密钥交换方案,让用户生成带有其硬件ID作为有效负载的私钥/公钥对,然后将此信息传递到注册服务器,注册服务器将使用公共/私人密钥解密有效负载并计算返回给最终用户的注册密钥。我喜欢使用JWT来传递公钥,并将其包含在JWT的有效负载中。希望这有所帮助。
上面提到了UUID,这是一个很好的想法,您可以通过使用以下命令从Windows cmd.exe获取:
wmic csproduct get UUID /format:value
免责声明,这些命令仅适用于Windows 2000及以上版本,但您需要进行验证,它们可能适用于低于2000的系统,但在那种情况下,我真的不建议支持那些设备。祝好运。 *看起来WMI正在被弃用,而PowerShell是更好的替代方案,因此为了使本帖子保持最新,这里提供PowerShell命令。
Get-CimInstance -ClassName Win32_Processor | Select SerialNumber
Get-CimInstance -ClassName Win32_BaseBoard | Select SerialNumber
Get-CimInstance -ClassName Win32_Bios | Select SerialNumber
Get-NetAdapter -Physical | Where-Object Status -like Up | Select-Object MacAddress
Get CimInstance -ClassName Win32_PhysicalMemory | Select SerialNumber
网络适配器 cmdlet 只会检查物理适配器,因此无法使用和操作虚拟适配器。我喜欢使用第一个正在使用或处于启用状态的适配器,以防止备用网卡在安装过程中被更换。
在 Mac 上:
system_profiler | grep "Serial Number (system)"
在Linux(Debian)上:
sudo dmidecode -t system | grep "Serial Number"
dmidecode和system_profiler有其他组件可以从中获取类似于Windows中的wmic的序列号。我不使用mac,因此无法确认确切规格的列表,但是可以创建一个LCD(最小公分母)列表,其中包含三个命令都可以访问的部件的序列号,并整理到最不可能升级或更改的部件。然后,将前2-3个数字的组合哈希可以生成一个更加强大的唯一机器ID,即使在更新其操作系统的设备上也可以激活跨平台应用程序。
如果假设一台计算机由许多可以被替换的部件组成,那么没有确切的方法可以唯一地识别一台计算机。
一些硬件部件 - MAC地址、HDD磁盘序列号、甚至主板序列号等等 - 是一些好的“唯一性”来源,但是如果客户决定升级部件,而许可证依赖于这些部件,那么就要为一些客户支持做好准备。同时需要注意的是,有些部件可以被欺骗(MAC地址就是其中之一)。
在线许可证检查是另一个不错的选择 - 你可以在服务器端管理所有内容,甚至为其定义自己的规则(每个客户/安装程序的许可证数量、并发性等等),但需要注意的重要问题是当连接无法建立时会发生什么?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
"MachineGuid"键在Windows安装期间唯一生成,即使更换硬件(除了替换安装操作系统的可启动硬盘),也不会改变。我不确定这一点。
我的建议
您可以使用MachineGuid、硬盘序列号、主板序列号和UUID将它们一起使用SHA 256或任何其他HASH函数进行哈希处理。
UUID - wmic csproduct get UUID
MachineGuid - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
硬盘序列号 - wmic diskdrive get serialnumber
BIOS序列号 - wmic bios get serialnumber
主板序列号 - wmic baseboard get serialnumber
可以创建一个串行密钥,用户需要输入一次。它应该包括用户的电子邮件地址(类似于someuser@mailprovider.com-9828372-398232)。这将防止许多人试图篡改它或将其交给其他人。 在激活期间,软件应根据在线数据库检查序列号是否存在。
打开注册表并导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
找到名为“MachineGuid”的键,该键在 Windows 安装期间生成唯一,并且不会更改,无论进行任何硬件交换(除了替换安装操作系统的可启动硬盘)。这意味着,如果您想跟踪每个操作系统的安装情况,这是另一种选择。它只有在您重新安装 Windows 时才会更改。
我有一些相关经验。 我们在向客户销售产品时发放服务密钥。
客户安装应用程序时,通过读取客户机的主板序列号生成密钥。 客户应该通过电子邮件向我们的组织发送激活产品所需的服务密钥和安装生成的密钥。
我们在组织中维护一个管理应用程序来发放激活密钥。 我们只为特定服务密钥提供一个激活密钥。
我们已经销售了许多副本,并且它们运行得很顺利。 但是后来我们发现有些计算机没有提供主板序列号。这些计算机将主板序列号返回null值。我们仍在努力解决这个问题。