什么是唯一识别计算机的好方法?
我正在开发一些桌面软件供客户转售。 客户希望限制软件,使注册码只针对一台电脑。
除了使用网卡上的MAC之外,是否还有其他技术(可以在Windows和Mac OS X上使用)来唯一标识一台计算机?
另一个解决scheme是使用带有encryption狗的授权技术。 这是一个插入USB或主机上另一个I / O端口的小型设备,并作为激活软件的唯一物理键。
第三个解决scheme是提供一个许可证pipe理器 。 也就是说,当软件启动时,它会查询networking上的服务器(无论是在客户的LAN上,还是通过互联网在贵公司访问),以确认客户对软件的使用是合法的。 这是“并发许可证”的一个很好的解决scheme,这样客户就可以在多台主机上安装你的软件,但是你可以同时在有限的主机上使用许可证。 FLEXnet Publisher是许可证pipe理解决scheme的一个示例。
网卡的MAC地址是我上次使用授权软件在特定主机上运行的公司的解决scheme。
但是,我想提醒一点:如果您使用这种types的许可证,则必须预计这将成为追踪客户许可证的持续行政事务 。 一旦你有几百个客户,你会惊奇地发现有多less次打电话要求更换密钥
“我们将服务器升级到千兆networking适配器,现在许可证将无法工作,因为新的适配器具有不同的MAC地址。”
否则客户可能会更换整个机器,并需要更新的许可证才能在新机器上运行您的软件。 我们几乎每天都在我工作的公司接到这些电话。
您还需要信任客户在旧计算机(或networking适配器)上停止使用您的软件,如果您给他们一个新的密钥。 如果你不能相信他们首先服从许可证,你怎么能相信他们会扔掉旧钥匙?
如果您不打算如何支持此pipe理活动,请不要以这种方式许可您的产品。 你只会给你的好客户带来不便,而他们本来也会合作的。
我会在这里扮演魔鬼的拥护者,告诉你这样的事情可能不是在“公众”讨论的最好的事情。
有了这个说法,看看别人可能做了什么,并可能改进(或取得一部分)。 MAC地址,就像你说的,可能可以使用。 我听说Windows和其他程序使用硬盘驱动器信息(序列号) – 根据这个网站 ,Windows激活检查10个不同的项目,并把它们变成一个唯一的密钥。
我只是使用MAC地址来生成请求密钥,然后要求用户向您的客户端注册。 您的客户端将拥有一个特殊的应用程序,该应用程序接受该请求密钥并生成一个激活密钥,然后用户可以使用该密钥激活该软件 一旦激活,该软件的工作,只是工作 – 偶尔打电话回家validation等。
这就是如果这是一个真正的要求。 我的第一个任务是试图说服客户,这是一个坏主意。
原因是这些scheme几乎不会阻止你的代码被破解。 但是,它们会让你真正的顾客变得更难。 我觉得很难想象其他任何行业都会用真正的客户来打扰他们的目标(除了政府服务,当然:-))。
如果你必须这样做,我只是做一个象征性的努力来履行契约义务(不要告诉你的客户)。 把MAC地址(或一个随机数,如果$DEITY
禁止,计算机没有网卡)作为请求密钥,并使用一个程序来与一个ASCIIstringXOR
以获得激活密钥,看起来像一个可行的方法。 我还会同时存储这两个密钥,因为如果他们只是更换网卡(甚至是主板),您不希望软件停用,他们仍然会看到同一台计算机,如果软件停止工作,将不会很高兴。
你的代码将被破解(除非程序是垃圾,我敢肯定情况并非如此) – 如果你的客户的公司变得没有反应,这种方法将给你的真正的客户一个移动他们的软件到另一台机器的途径,歇业,等等)。
所有依靠一点硬件独特性的scheme的主要麻烦是客户可能会select改变那一点硬件:
- 将磁盘内容重新映射到较大的硬盘上会使HD序列号发生更改。
- 使用CPU序列号意味着升级到最新的英特尔bigmutha CPU杀死你的软件。
- 使用MAC地址意味着他们不能改变他们的网卡。
这些都可以通过使用这些值在安装时创build一个密钥来解决,只能检查该密钥,而不是在赛道下半年更改的值。 这意味着您必须存储请求和激活值,但升级不会要求您的用户完成重新激活其软件的过程。 相信我,他们会鄙视你这样做。
如果您认为计算机内置了许多可以最终replace的部件,那么没有办法唯一地识别计算机。
一些硬件部分–MAC地址,硬盘序列号,甚至主板序列号等 – 都是“唯一性”的几个很好的来源,但正如你可能知道,如果客户决定升级许可证依赖的部分…准备一些客户支持。 另外要记住的是,一些部分可以被欺骗(MAC是其中之一)。
在线许可证检查是另一个好的方法 – 您可以pipe理服务器端的所有内容,甚至可以为其定义自己的规则(每个客户端/安装的许可证数量,并发性等),但要注意的是当发生什么情况连接无法build立?
最好的方法是在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(); }
据我所知,曾经有一个印在CPU上的序列号, 这个信息(PSN,奔腾序列号)已经被弃用了。 信息可能仍然存在,但至less在P3世界中已经消失了。 另外,我认为在用于主机的主接口的NIC上明显的selectMAC地址应该被认为是一个真正的可能性。 除非你的客户不希望以太网接口出现在他们销售的主机上。
我有一些这方面的经验。 在我的解决scheme中,我们在向客户销售产品时发布服务密钥。
在客户端安装应用程序的时候,它通过读取客户机的主板串行来生成密钥。 客户应该将安装时生成的服务密钥和密钥通过电子邮件发送给我们的组织以激活产品。
我们在组织问题激活密钥处维护pipe理员应用程序。 我们只为特定服务密钥的密钥提供一个激活密钥。
我们出售的份数,它运行没有问题。 但是后来我们发现有些电脑没有提供主板序列号。 这些机器返回空值作为主板的序列号。 我们仍然试图解决这个问题。
如何使用MotherBoard唯一序列号?
可以创build一个用户必须input一次的序列密钥。 它应该包括用户的电子邮件地址(如someuser@mailprovider.com-9828372-398232)。 这将阻止许多人试图篡改或给其他人。 在激活期间,如果串行密钥存在,软件应该检查在线数据库。
我正在玩的想法是使用一些序列号或与硬件相关的唯一ID并将它们散列在一起。
被升级的东西: – 内存-MAC(可能被欺骗,USB适配器被插入等等)
不经常升级的东西:-CPU -BIOS -Motherboard
使用WMIC可以是一个很好的方法来获取一些信息,我会开始抓住不经常改变的东西作为第一和首选的select,我想能够指纹至less2个序列号或设备用于生成一个注册码。
wmic cpu get DeviceId /format:value
这将抓住CPU ID,你可以运行该命令:
1 – CPU(cpu:DeviceID)2 – 主板(底板:serialnumber)3 – BIOS(BIOS:serialnumber)
如果你没有得到至less2填充值,然后抓住
4 – networking适配器 – (nic:MAC地址)5 – RAM – (memphysical:SerialNumber)
根据您的业务逻辑,您可以使用可用的前两个序列号来创build您的注册号码,如果您始终遵循相同的顺序,那么在重新安装时,注册号码仍然可以使用,但是如果设备更改或用户尝试在辅助计算机上安装ID的更改使注册号无效。 为了减less技术支持电话数量的硬件最less的指纹将给你最less的头痛,如果你尝试指纹最不可能的项目进行升级,进一步减less头痛。 我的首选是上面的顺序。
您可以使用Diffie-Hellman密钥交换scheme让用户生成一个私钥/私钥对,并将其硬件ID作为有效载荷,然后将该信息传递给注册服务器,注册服务器将使用公钥/私钥解密有效负载并计算注册密钥以返回给最终用户。 我喜欢使用智威汤逊(JWT)来与JWT的有效载荷中包含的公钥一起来回传递。 希望有所帮助。
上面提到的UUID是一个很好的主意,你可以通过以下方式获得:
wmic csproduct get UUID /format:vale
免责声明这些命令只适用于Windows我认为2000年以上,但你需要validation,他们可能适用于2000以下的系统,但在这一点上,我真的不尝试支持这些设备。 祝你好运。
打开registry并导航到
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\encryption
find名为“MachineGuid”的密钥,该密钥在Windows安装过程中是唯一生成的,不pipe硬件交换如何(除了更换安装操作系统的可引导硬盘),该密钥都不会改变。 这意味着如果你想要跟踪每个操作系统的安装,这是另一种select。 除非您重新安装Windows,否则不会更改。
您可能会考虑使用第三方许可实用程序,如果需求发生变化(而且不总是这样),则更有可能实现这种“正确”,并为您(或您的客户)提供更多的选项。 我会提到一些具体的名字,但我真的不是很熟悉它们。
或者,您可以简单地没有激活码,并确保将审核权写入EULA并行使您不时审核的权利。
为Oracle创作奇迹。
如何处理烧毁的SN,harddrive,proc,ram等任何东西……这个哈希将保留在计算机上,直到它被部件replace。