63

我正在开发一些桌面软件供客户转售。客户希望限制软件,以便注册码将特定于一台且仅一台计算机。

除了使用网卡中的 MAC 之外,还有其他技术(适用于 Windows 和 Mac OS X)来唯一识别计算机吗?

4

15 回答 15

45

另一种解决方案是使用带有加密狗的许可技术。这是一个插入主机上的 USB 或其他 I/O 端口的小型设备,用作激活软件的唯一物理密钥。

第三种解决方案是提供许可证管理器。也就是说,当软件启动时,它会查询网络上的服务器(无论是在客户的 LAN 上,还是在您的公司通过 Internet 访问),以验证客户对该软件的使用是否合法。这是“并发许可”的一个很好的解决方案,因此客户可以在许多主机上安装您的软件,但您许可它在有限数量的主机上同时使用。 FLEXnet Publisher是许可证管理解决方案的一个示例。

网卡的 MAC 地址是我上次为一家许可软件在特定主机上运行的公司工作时使用的解决方案。

但是,我想提醒您:如果您进行这种类型的许可,您必须预料到跟踪客户的许可将成为一项持续的管理工作。一旦您有几百个客户,您会惊讶于收到要求更改密钥的电话的频率

“我们将服务器升级为千兆网络适配器,但现在许可证无法使用,因为新适配器具有不同的 MAC 地址。”

否则客户可能会更换他们的整台机器,并且需要更新的许可证才能在新机器上运行您的软件。在我工作的公司,我们几乎每天都会接到这些电话。

如果您给他们一个新密钥,您还需要相信客户停止在旧计算机(或网络适配器)上使用您的软件。如果你一开始就不能相信他们会遵守许可证,你怎么能相信他们会扔掉旧钥匙呢?

如果您不计划如何支持此管理活动,请不要以这种方式许可您的产品。你只会给那些本来会合作的好客户带来不便。

于 2009-03-23T00:40:31.633 回答
11

最好的方法是在 Windows 中使用 C# 获取 UUID

唯一识别 Windows 机器的最佳方法

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();
}
于 2015-09-17T17:57:44.387 回答
10

我会在这里扮演魔鬼的拥护者,告诉你这样的事情可能不是在“公共”讨论的最佳事情。

话虽如此,看看其他人可能做了什么,并可能改进(或采取一部分)它。正如您所说,MAC 地址可能可以使用。我听说 Windows 和其他程序使用硬盘驱动器信息(序列号)——根据这个站点,Windows 激活检查 10 个不同的项目并将它们变成一个唯一的密钥。

于 2009-03-23T00:25:38.143 回答
9

我正在玩弄的想法是使用一些与硬件相关的序列号或唯一 ID 并将它们散列在一起。

升级的东西:-内存-MAC(可以被欺骗,USB适配器被插入等)

不经常升级的东西:-CPU -BIOS -Motherboard

使用 WMIC 可能是获取一些信息的好方法,我会首先获取不经常更改的东西作为首选和首选,我希望能够识别至少 2 个序列号或设备以用于生成注册密钥。

wmic cpu get DeviceId /format:value

这将获取 CPU ID,您可以运行该命令:

1 - CPU (cpu:DeviceID) 2 - 主板 (baseboard:serialnumber) 3 - BIOS (bios:serialnumber)

如果您没有得到至少 2 个填充值,则抓取

4 - 网络适配器 - (nic:MACAddress) 5 - RAM - (memphysical:SerialNumber)

根据您的业务逻辑,您可以使用前两个可用的序列号来创建您的注册号,如果您始终遵循相同的顺序,那么在重新安装时注册号仍然有效,但是如果设备发生更改或用户尝试在辅助计算机上安装使注册号无效的 ID 更改。为了减少技术支持电话的数量,您使用指纹识别的硬件数量最少,并且如果您尝试对最不可能升级的项目进行指纹识别,则会进一步减少头痛。我的偏好是上面的顺序。

您可以使用 Diffie-Hellman 密钥交换方案让用户生成一个私有/公共密钥对,并将其硬件 ID 作为有效负载,然后将此信息传递到注册服务器,注册服务器将使用公共/私有密钥解密有效载荷并计算注册密钥以返回给最终用户。我喜欢使用 JWT 来回传递信息,而公钥包含在 JWT 的有效负载中。希望有帮助。

上面提到了 UUID,这是一个好主意,您可以通过使用 Windows cmd.exe 中的以下命令来获得它:

wmic csproduct get UUID /format:value      

免责声明这些命令仅适用于我认为 2000 及更高版本的 Windows,但您需要验证,它们可能适用于 2000 以下的系统,但那时我真的尽量不支持这些设备。祝你好运。*看起来 WMI 正在被弃用以支持 powershell,因此为了使这篇文章保持最新状态,这里是 power shell 命令。

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 将仅检查物理适配器,因此无法使用和操纵虚拟适配器,我喜欢使用第一个已启动或正在使用的适配器,以便由于安装原因无法交换备用 NIC。

在 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,并且即使在更新了操作系统的设备上也可以激活跨平台应用程序。

于 2017-01-23T16:58:51.537 回答
5

如果您假设一台计算机由许多最终可以更换的部件组成,那么没有确定的方法可以唯一地识别一台计算机。

一些硬件部分——MAC 地址、HDD 磁盘序列号,甚至主板序列号等——是一些很好的“唯一性”来源,但您可能知道,如果客户决定升级许可证所依赖的部分……请做好准备一些客户支持。另外要记住的是,某些部分可能会被欺骗(MAC 就是其中之一)。

在线许可证检查是另一种好方法 - 您可以管理服务器端的所有内容,甚至可以为它定义自己的规则(每个客户端/安装有多少许可证、并发性等),但要注意的重要一点是,当无法建立连接?

于 2009-03-23T01:01:58.213 回答
5

我只会使用 MAC 地址生成请求密钥,然后要求用户向您的客户端注册。您的客户将拥有一个特殊的应用程序,该应用程序接受该请求密钥并生成一个激活密钥,然后用户可以使用该激活密钥来激活软件。一旦激活,该软件就可以正常工作了——无需偶尔打电话回家进行验证等。

如果这是一个真正的要求。我的首要任务是尝试说服客户这是一个坏主意。

原因是这些方案实际上永远不会阻止您的代码被破解。但是,它们确实使您真正客户的生活更加艰难。我发现很难想到任何其他行业会不遗余力地用永远无法实现其目标的计划来惹恼真正的客户(当然,除了政府服务:-)。

如果你必须这样做,我只是做一个象征性的努力来履行合同义务(但是不要告诉你的客户)。将 MAC 地址(如果$DEITY计算机没有网卡,则为随机数)作为请求密钥,并使用程序将XOR其与 ASCII 字符串一起获取激活密钥,这似乎是一种可行的方法。我还会存储这两个密钥,因为如果他们只是更改网卡(甚至主板),您不希望软件停用 - 他们仍然将其视为同一台计算机,并且如果软件停止工作,他们将不高兴。

无论如何,您的代码都会被破解(除非程序是垃圾,我敢肯定不是这种情况) - 如果您的客户的公司以某种方式变得无响应,这种方法将为您的真正客户提供将他们的软件转移到另一台机器的途径(放弃支持,倒闭,等等)。

所有依赖硬件唯一性的方案的主要问题是客户可能会选择更改该硬件:

  • 将其磁盘内容幻影到更大的硬盘会导致 HD 序列号发生变化。
  • 使用 CPU 序列号意味着升级到最新的 Intel bigmutha CPU 会杀死您的软件。
  • 使用 MAC 地址意味着他们无法更改其 NIC。

这些都可以通过使用这些值在安装时创建一个密钥来修复,并且只检查该密钥,而不是六个月后更改的值。这意味着您必须存储请求和激活值,但升级不需要您的用户完成重新激活其软件的过程。相信我,他们会因为你不得不这样做而鄙视你。

于 2009-03-23T01:43:32.247 回答
3

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography

“MachineGuid”密钥是在 Windows 安装过程中唯一生成的,无论任何硬件交换如何,它都不会改变(除了更换安装操作系统的可引导硬盘驱动器)。我不确定这一点。

我的建议

您可以使用该 MachineGuid、硬盘序列号、主板序列号和 UUID。一起使用 SHA 256 或任何其他 HASH 函数对其进行 HASH。

UUID - wmic csproduct 获取 UUID

MachineGuid - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography

硬盘序列号- wmic diskdrive 获取序列号

BIOS 序列号- wmic bios 获取序列号

主板序列号- wmic 基板获取序列号

于 2018-01-23T11:26:28.840 回答
2

可以创建用户必须输入一次的序列号。它应该包括用户的电子邮件地址(类似于 someuser@mailprovider.com-9828372-398232)。这将阻止许多人试图篡改它或将其提供给其他人。在激活过程中,软件应检查在线数据库是否存在序列号。

于 2013-05-21T17:52:43.167 回答
2

使用主板唯一序列号怎么样?

于 2014-02-06T19:47:10.760 回答
2

打开注册表并导航到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography

找到名为“MachineGuid”的密钥,该密钥是在安装 Windows 期间唯一生成的,无论进行任何硬件交换(除了更换安装操作系统的可引导硬盘驱动器),它都不会改变。这意味着如果您想继续跟踪每个操作系统的安装,这是另一种选择。除非您重新安装 Windows,否则它不会改变。

于 2017-06-09T14:10:29.503 回答
1

据我所知,曾经有一个序列号印在 CPU 上;此信息(PSN,奔腾序列号)已被弃用。这些信息可能仍然存在,但至少在 P3 世界中它已经消失了。此外,我认为在 NIC 上为主机使用的主接口选择 MAC 地址的明显选择应该被认为是一种真正的可能性。除非您的客户不期望以太网接口出现在他们出售的主机上。

于 2009-03-23T00:29:19.663 回答
1

您可能会考虑使用第三方许可实用程序,该实用程序更有可能获得此“正确”,并且还为您(或您的客户)在需求发生变化时提供额外的选项(而且它们不是总是如此吗?)。我会提到一些具体的名字,但我真的不是很熟悉它们。

于 2009-03-23T01:21:47.900 回答
1

我对此有一些经验。在我的解决方案中,我们在向客户销售产品时发布服务密钥。

在客户端安装应用程序时,它通过读取客户端机器的主板序列来生成一个密钥。客户应该将服务密钥和安装时生成的密钥通过电子邮件发送给我们的组织以激活产品。

我们在问题激活密钥的组织中维护一个管理应用程序。我们只为特定服务密钥的密钥提供一个激活密钥。

我们卖了很多份,它运行没有问题。但后来我们发现有些电脑没有提供主板序列号。这些机器返回空值作为主板序列号。我们仍然试图解决这个问题。

于 2011-05-04T07:50:50.023 回答
1

或者您可以简单地没有激活代码,并确保您拥有写入 EULA 的审核权,并不时行使您的审核权。

为甲骨文创造奇迹。

于 2012-08-22T02:40:49.147 回答
1

如何散列任何有烧毁的 SN、硬盘驱动器、proc、ram 等的东西......这个散列将保留在计算机中,直到它的部件被更换。

于 2016-03-21T06:45:06.030 回答