我正在开发一些桌面软件供客户转售。客户希望限制软件,以便注册码特定于一台且只有一台计算机。
除了使用网卡中的MAC之外,是否还有其他任何技术(适用于Windows和Mac OS X)以便唯一识别计算机?
答案 0 :(得分:38)
另一种解决方案是使用带有 dongle 的许可技术。这是一个小型设备,可插入主机上的USB或其他I / O端口,并作为激活软件的唯一物理密钥。
第三种解决方案是提供许可证管理器。也就是说,当软件启动时,它会查询网络上的服务器(在客户的LAN上或通过互联网在贵公司访问),验证客户对软件的使用是否合法。这是“并发许可证”的一个很好的解决方案,因此客户可以在许多主机上安装您的软件,但您可以在有限数量的主机上同时使用它。 FLEXnet Publisher是许可证管理解决方案的一个示例。
网卡的MAC地址是我上次为一家授权软件在特定主机上运行的公司所使用的解决方案。
但是,我想提醒一下:如果您执行此类许可,则必须预计它将成为正在进行的管理工作以跟踪客户的许可。一旦你有几百个顾客,你会惊讶于你接到电话的频率和更改密钥的请求
“我们将服务器升级到千兆位 网络适配器,现在是许可证 将无法工作,因为新适配器具有 一个不同的MAC地址。“
否则客户可能会更换整台机器,并需要更新的许可证才能在新机器上运行您的软件。几乎我每天都在我工作的公司接到这些电话。
如果您给他们一个新密钥,您还需要信任客户停止在旧计算机(或网络适配器)上使用您的软件。如果你不能相信他们首先遵守许可证,你怎么能相信他们会扔掉旧钥匙?
如果您不打算如何支持此管理活动,请不要以这种方式许可您的产品。你只会给那些本来会合作的好客户带来不便。
答案 1 :(得分:10)
我会在这里扮演魔鬼的拥护者并告诉你这样的事情可能不是在“公开”中讨论的最好的事情。
话虽如此,看看别人可能做了什么,并可能改进(或采取一部分)它。像你说的那样,MAC地址可能可以使用。我听说Windows和其他程序使用硬盘驱动器信息(序列号) - 根据this site,Windows激活检查10个不同的项目并将它们变成一个唯一的密钥。
答案 2 :(得分:9)
最好的方法是在Windows中使用C#获取UUID
The Best Way To Uniquely Identify A Windows Machine
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();
}
答案 3 :(得分:5)
我只是使用MAC地址生成请求密钥,然后要求用户向您的客户注册。您的客户端将有一个特殊的应用程序,它接收该请求密钥并生成一个激活密钥,然后用户可以使用该激活密钥来激活软件。一旦激活,该软件就可以正常工作 - 不会偶尔打电话回家进行验证等。
如果这是一个真正的要求。我的第一个任务是试图让客户相信这是一个坏主意。
原因是这些方案实际上永远不会阻止您的代码被破解。然而,它们确实使您真正的客户的生活更加艰难。我觉得很难想到任何其他行业都会用一种从未实现目标的方案来惹恼真正的客户(当然除了政府服务之外: - )。
如果您必须这样做,我只是为了履行合同义务而努力(不要告诉您的客户)。取MAC地址(或随机数,如果$DEITY
禁止,计算机没有网卡)作为请求密钥,并使用程序只用XOR
用ASCII字符串获取激活密钥,似乎是一种可行的方法。我还会存储两个密钥,因为如果他们只是更换网卡(甚至是主板),你不希望软件取消激活 - 他们仍然认为它是同一台计算机,如果软件停止工作则不会感到高兴。
你的代码会被破解(除非程序是垃圾,我确定不是这种情况) - 如果客户的公司变得反应迟钝,这种方法将为你的真正客户提供将其软件移动到另一台机器的途径(放弃支持,破产等等)。
依赖于一些硬件唯一性的所有方案的主要问题是客户可能会选择更改硬件的这一部分:
这些都可以通过使用这些值在安装时创建密钥并且仅针对该密钥进行检查而不是在轨道下方六个月后更改的值来修复。这意味着您必须存储请求和激活值,但升级不会要求您的用户完成重新激活其软件的过程。相信我,他们会鄙视你不得不这样做。
答案 4 :(得分:5)
我正在考虑的想法是使用一些序列号或与硬件相关的唯一ID,并将它们一起散列。
升级的东西: -记忆 -MACs(可以欺骗,usb适配器插入等)
经常升级的东西: -中央处理器 -BIOS -Motherboard
使用WMIC可以很好地获取一些信息,我会首先抓住不经常改变的东西作为第一个和首选的选择,我希望能够指纹至少2个序列号或设备到用于生成注册密钥。
wmic cpu get DeviceId /format:value
这将获取CPU ID,您可以运行该命令:
1 - CPU(cpu:DeviceID) 2 - 主板(踢脚板:序列号) 3 - BIOS(bios:serialnumber)
如果您没有获得至少2个填充值,请抓住
4 - 网络适配器 - (nic:MACAddress) 5 - RAM - (memphysical:SerialNumber)
根据您的业务逻辑,您可以使用前两个可用的序列号来创建您的注册号,如果您始终遵循相同的订单,那么在重新安装时,注册号仍然有效,但是如果设备更改或用户尝试在辅助计算机上安装id的更改,使注册号无效。为了减少技术支持的数量,您指纹所需的硬件数量最少,从而产生最少的麻烦,如果您尝试指纹最不可能的要升级的项目,则可以进一步降低头痛。我的偏好是上面的顺序。
您可以使用Diffie-Hellman密钥交换方案让用户生成私有/ pulic密钥对,其硬件ID作为有效负载,然后将此信息传递到注册服务器,注册服务器将使用public /私钥解密有效负载并计算注册密钥以返回给最终用户。我喜欢使用JWT通过JWT有效载荷中包含的公钥来回传递信息。希望有所帮助。
上面提到了UUID,你可以通过使用windows cmd.exe中的以下命令来获得它:
wmic csproduct get UUID /format:value
免责声明这些命令仅适用于Windows我认为2000及以上但您需要验证,它们可能适用于2000以下的系统,但此时我真的尝试不支持这些设备。祝你好运。
在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,并允许甚至在更新操作系统的设备上激活跨平台应用程序。
答案 5 :(得分:4)
如果您认为计算机是由最终可以替换的许多部件构建的,那么无法确定计算机的唯一标识。
一些硬件部件 - MAC地址,HDD磁盘序列号,甚至主板串口等 - 都是“唯一性”的一些好来源,但是如果客户决定升级部件,许可证依赖于......为一些客户支持做好准备。 另外要记住的是,某些部分可能是欺骗性的(MAC就是其中之一)。
在线许可证检查是另一种好方法 - 您可以管理服务器端的所有内容,甚至可以为其定义自己的规则(每个客户端/安装的许可证数量,并发性等),但需要注意的是无法建立连接时会发生什么?
答案 6 :(得分:2)
如何使用MotherBoard唯一的序列号?
答案 7 :(得分:2)
打开注册表并导航到
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\加密
找到名为“MachineGuid”的密钥,此密钥在Windows安装期间唯一生成,无论是否进行任何硬件交换(除了更换安装了操作系统的可启动硬盘驱动器)之外,它都不会更改。这意味着如果你想继续跟踪每个操作系统的安装,这是另一种选择。除非您重新安装Windows,否则它不会改变。
答案 8 :(得分:1)
据我所知,曾经有一个印在CPU上的序列号;此信息(PSN,Pentium序列号)已被弃用。这些信息可能仍然存在,但至少在P3世界中它已经消失了。此外,我认为用于主机的主接口在NIC上明显选择MAC地址应该被认为是一种真正的可能性。除非您的客户不希望以太网接口出现在他们销售的主机上。
答案 9 :(得分:1)
您可能会考虑第三方许可实用程序,它更有可能获得“正确”,并且还会在需求发生变化时向您(或您的客户)提供其他选项(而且它们不是总是如此?)。我会提到一些具体的名字,但我真的不熟悉它们。
答案 10 :(得分:1)
我对此有一些经验。在我的解决方案中,当我们将产品销售给客户时,我们会发布服务密钥。
在客户端安装应用程序时,它会通过读取客户端计算机的主板序列来生成密钥。客户端应将服务密钥和安装时生成的密钥通过电子邮件发送给我们的组织以激活产品。
我们在有问题的组织维护一个管理应用程序。我们只为特定服务密钥的密钥提供一个激活密钥。
我们销售的副本数量没有问题。但后来我们发现一些计算机没有提供主板序列号。这些机器返回null值作为主板序列号。我们还在努力解决这个问题。
答案 11 :(得分:1)
可以创建用户必须输入一次的序列密钥。 它应该包括用户的电子邮件地址(类似someuser@mailprovider.com-9828372-398232)。这将阻止许多人试图篡改它或将其交给其他人。 在激活期间,如果存在串行密钥,软件应检查在线数据库。
答案 12 :(得分:1)
如何对具有烧录SN,硬盘驱动器,触发器,内存等的任何东西进行散列...这个散列将保留在计算机上,直到它的部件被替换为止。
答案 13 :(得分:0)
或者您可能根本没有激活码,并确保您已将审核权限写入EULA并行使您不时进行审核的权利。
为Oracle创造奇迹。
答案 14 :(得分:0)
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\加密
“MachineGuid”密钥在Windows安装过程中唯一生成,无论硬件交换如何,都不会更改(除了更换安装了操作系统的可启动硬盘驱动器)。我不确定这个
我的建议
您可以使用MachineGuid,硬盘序列号,主板序列号和UUID。使用SHA 256或任何其他HASH功能将它一起HASH。
UUID - wmic csproduct获取UUID
MachineGuid - HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography
硬盘序列号 - wmic diskdrive get serialnumber
BIOS序列号 - wmic bios get serialnumber
主板序列号 - wmic baseboard get serialnumber