Answers:
注意:您不能阻止用户进行盗版,而只能让诚实的用户更容易地做正确的事。
假设您不想为每个用户做一个特殊的构建,那么:
但是,我再说一遍:这不会防止盗版
我最近读到,这种方法在密码学上不是很好。但是这种解决方案已经很弱了(因为软件本身必须在某个地方包含密钥),所以我认为这一发现不会使解决方案在任何程度上失效。
不过,我以为我真的应该提这个;如果您打算从中得到其他东西,请当心。
生成许可证密钥的方法有很多,但真正安全的方法很少。遗憾的是,对于公司而言,许可证密钥的价值几乎与真实现金相同。
理想情况下,您希望许可证密钥具有以下属性:
即使有人完全对您的产品进行反向工程,只有您的公司才能为您的产品生成许可证密钥(根据经验,这将发生)。如果您真的想控制许可,那么对算法进行混淆或在软件中隐藏加密密钥确实是不可能的。如果您的产品成功,那么从发布之日起几天内,就会有人生成密钥生成器。
许可证密钥只能在一台计算机上使用(或者至少您应该能够非常紧密地控制它)
许可证密钥应简短且易于在电话上键入或指示。您不希望每个客户都致电技术支持,因为他们不知道密钥是包含“ l”还是“ 1”。您的支持部门将对此表示感谢,您在这方面的费用将会降低。
那么您如何解决这些挑战?
答案很简单,但在技术上却具有挑战性:使用公钥密码术的数字签名。实际上,您的许可证密钥应该是经过签名的“文档”,其中包含一些有用的数据,并使用公司的私钥进行了签名。签名应该是许可证密钥的一部分。产品应使用相应的公共密钥来验证许可证密钥。这样,即使某人可以完全控制您产品的逻辑,他们也不会生成许可证密钥,因为他们没有私钥。许可证密钥如下所示:BASE32(CONCAT(DATA,PRIVATE_KEY_ENCRYPTED(HASH(DATA))))这里最大的挑战是传统的公钥算法具有较大的签名大小。RSA512具有1024位签名。您不希望许可证密钥包含数百个字符。最强大的方法之一是使用椭圆曲线密码术(精心设计以避免使用现有专利)。相同强度的ECC密钥比RSA密钥短6倍。您可以使用Schnorr数字签名算法之类的算法来进一步减小签名的大小(专利于2008年到期-很好:))
这可以通过激活产品来实现(Windows是一个很好的例子)。基本上,对于具有有效许可证密钥的客户,您需要生成一些“激活数据”,这是将计算机的硬件ID嵌入为签名数据的签名消息。通常,这是通过Internet完成的,但是只有一次:产品将许可证密钥和计算机硬件ID发送到激活服务器,然后激活服务器将已签名的消息发回(也可以使消息简短易懂)。电话)。从那时起,产品将不会在启动时检查许可证密钥,而是在激活数据方面进行检查,该激活数据需要计算机相同才能进行验证(否则,DATA将有所不同,而数字签名将不会进行验证)。
好吧,只需从您的键中消除冗余字符,例如“ 1”,“ l”,“ 0”,“ o”。将许可证密钥字符串分成字符组。
简单的答案-无论您使用哪种方案,都可以破解。
不要使用旨在防止黑客攻击的系统来惩罚诚实的客户,因为无论如何,黑客都会破解它。
一个简单的哈希码绑定到他们的电子邮件或类似的东西可能就足够了。当人们需要重新安装或更新硬件时,基于硬件的ID总是成为一个问题。
有关此问题的好线程:http : //discuss.joelonsoftware.com/default.asp?biz.5.82298.34
生成密钥时,不要忘记将版本和内部版本号连接到您计算哈希值的字符串。这样一来,就不会有一个钥匙可以解开您曾经发布的所有内容。
在astalavista.box.sk中找到一些浮动的密钥或补丁之后,您将知道您成功制作了一些流行的东西,以至于有人不愿破解。麾!
除了已经说过的...。
由于中间语言的问题,任何对.NET应用程序的使用在本质上都是易碎的。.NET代码的简单反汇编将向任何人开放您的产品。他们可以轻松地绕过您的许可代码。
您甚至不能再使用硬件值来创建密钥。虚拟机现在允许某人创建“许可”计算机的映像并在他们选择的任何平台上运行。
如果它是昂贵的软件,那么还有其他解决方案。如果不是这样,请为临时黑客增加足够的难度。并接受一个事实,那就是最终将有未经许可的副本在那里。
如果您的产品很复杂,固有的支持问题将为您提供一些保护。
现在,我们用于生成许可证密钥的C#/ .NET引擎仍保持开源状态:
https://github.com/appsoftware/.NET-Licence-Key-Generator。
它基于“部分密钥验证”系统,这意味着只需要将用于生成密钥的密钥子集编译为可分发文件即可。您可以自行创建密钥,因此许可证实施对于您的软件是唯一的。
如上所述,如果您的代码可以反编译,则规避大多数许可系统相对容易。
我是Cryptolens软件许可平台背后的开发人员之一,并且从14岁起就开始从事许可系统的开发。在此答案中,我根据多年的经验提供了一些技巧。
解决此问题的最佳方法是设置一个许可证密钥服务器,应用程序的每个实例都将调用该服务器以验证许可证密钥。
许可证密钥服务器的优点在于:
尽管在线验证许可证可以使您更好地控制应用程序的每个实例,但是互联网连接并不总是存在(特别是如果您针对大型企业),因此我们需要另一种执行许可证密钥验证的方法。
解决方案是始终使用RSA或ECC之类的公钥密码系统对服务器的许可证密钥响应进行签名(如果计划在嵌入式系统上运行,则可能会更好)。您的应用程序应仅具有公共密钥以验证许可证密钥响应。
因此,如果没有互联网连接,则可以改用以前的许可证密钥响应。确保在响应中同时存储日期和机器标识符,并检查日期是否太旧(例如,您允许用户最多30天离线等),并且许可证密钥响应属于正确的设备。
请注意,即使您已连接到Internet,也应始终检查许可证密钥响应证书,以确保自从离开服务器以来未对其进行更改(即使您的API仍要这样做,也必须这样做)。许可证密钥服务器使用https)
大多数.NET应用程序可以很容易地进行逆向工程(Microsoft提供了一个双汇编程序来获取IL代码,有些商业产品甚至可以检索C#等源代码)。当然,您始终可以混淆代码,但是它永远不会100%安全。
在大多数情况下,任何软件许可解决方案的目的都是为了帮助诚实的人诚实(即,愿意付款的诚实用户不要在试用期满后忘记付款,等等)。
但是,您可能仍然有一些绝对不希望泄漏给公众的代码(例如,预测股票价格的算法等)。在这种情况下,唯一的方法是创建一个API端点,您的应用程序将在每次执行该方法时调用该端点。它需要Internet连接,但可以确保客户端计算机永远不会执行您的密码。
如果您不想自己实现所有功能,建议您看一下本教程(Cryptolens的一部分)
我不知道你想多精打细算
但我相信.net可以访问硬盘驱动器序列号。
您可以让程序向您发送该信息以及其他信息(例如nic的用户名和mac地址)
您可以据此计算出代码,然后将其通过电子邮件发送给密钥。
拥有钥匙后,他们将阻止他们切换机器。
完成您要求的所有操作的唯一方法是要求Internet访问和服务器验证。应用程序需要使用密钥登录服务器,然后您需要存储会话详细信息,例如IP地址。这将防止密钥在多台不同的机器上使用。这通常在应用程序用户中不太流行,除非这是一个非常昂贵和复杂的应用程序,否则不值得。
您可能只拥有该应用程序的许可证密钥,然后检查客户端密钥是否正确,但是很容易将该密钥分发给其他用户,并且通过反编译器可以生成新密钥。
我已经在公司的软件(C#.net)上实现了基于Internet的一次性激活,该激活需要一个许可证密钥,该许可证密钥指向存储在服务器数据库中的许可证。该软件使用密钥访问服务器,并获得许可信息,然后使用从客户端计算机上的某些变量(CPUID和其他不会经常更改的内容的组合)生成的RSA密钥在本地对许可证信息进行加密,然后将其存储在注册表。
它需要一些服务器端编码,但是对我们来说确实非常有效,当我们扩展到基于浏览器的软件时,我能够使用相同的系统。它还为您的销售人员提供了有关谁在何时何地使用该软件的重要信息。任何仅在本地处理的许可系统都完全容易受到利用,尤其是.NET中的反射。但是,就像其他人所说的那样,没有系统是完全安全的。
我认为,如果您不使用基于Web的许可,则根本没有保护软件的真正意义。由于DRM可能引起头痛,这对实际为此付出代价的用户而言是不公平的。
我坚信,只有基于公钥加密的许可系统才是正确的方法,因为您不必在源代码中包含生成许可证所需的必要信息。
过去,我已经多次使用Treek的许可库,因为它满足了这一要求并提供了非常优惠的价格。它对最终用户及其本身使用相同的许可证保护,直到现在为止还没有人破解。您还可以在网站上找到一些好的技巧,以避免盗版和破解。
就像其他一些提到的一样,我是默认情况下对客户怀有敌意的巨大反对者 -许可行业众所周知。因此,我将为您的问题扩展一个好的解决方案,该解决方案还提供良好的客户体验。
首先,您提到您有一个软件的“有限”版本,用于尝试将客户转换为“升级”以获得其他功能。因此,您要查找的是产品的功能许可证,例如,客户可以购买功能X或功能Y的许可证。
我在构建Keygen时就考虑到了这种类型的许可。Keygen是许可的REST API,可让您管理用户帐户,许可证并跟踪计算机的使用/关联。
我要做的是设置2种许可类型(Keygen中的一种策略),其中一种是有限免费版本的基本策略,另一种是付费版本的策略。
我不确定您使用的是什么付款方式,但假设您使用的是诸如Stripe(如今相当标准)之类的东西,可以提供webhooks。Keygen也有webhooks(无论您是否使用它,所有这些仍然适用)。您可以集成Keygen来使用双方的Webhooks与您的付款提供商进行对话(请考虑:customer.created
->为客户创建基本许可证,license.created
->为新许可证向客户收费)。
因此,通过利用Webhook,我们可以自动为新客户创建许可证。那么,应用程序内部的许可证验证又如何呢?这可以通过多种方式来完成,但是最流行的方式是要求客户在输入字段中输入长许可证密钥,然后您可以进行验证;我认为这是在您的应用程序中处理许可证验证的糟糕方法。
我为什么这么认为?首先,您要求客户输入一个冗长的机器使用许可密钥,其次,您需要您和您的客户跟踪所述繁琐的许可密钥。
好吧,那有什么选择呢?我认为最好的选择是做所有您的客户都习惯的事情:允许他们使用电子邮件/密码为您的产品创建一个帐户。然后,您可以将其所有许可证和计算机与该帐户关联。因此,他们现在无需输入许可证密钥,只需使用其凭据登录即可。
那给你什么好处?首先,它消除了您和您的客户跟踪许可证密钥的需要,因为所有这些都在其用户帐户内进行了后台处理,最重要的是:您现在可以为客户提供自助式许可证和机器激活!即,由于他们的所有许可证和计算机都与他们的用户帐户相关联,因此当他们在无法识别的计算机上启动您的应用程序时,您可以提示他们购买许可证。
现在进入许可证验证:每当客户使用其电子邮件/密码登录到您的应用程序时,您都可以查询其拥有的许可证的用户帐户,以确定他们是否可以使用feature-X或feature-Y。而且,由于您的应用程序现在是自助服务,因此您可以允许客户直接在应用程序内购买其他功能!
因此,我们在许可系统中引入了大量自动化功能,我们可以许可单个功能(即有限版与完整版),我们为客户提供了出色的 UX,并且还减轻了最大的原因之一对于支持请求:许可证密钥恢复。
无论如何,这很长,但希望可以对某人有所帮助!
您可以使用免费的第三方解决方案为您处理此问题,例如Quantum-Key.Net。它是免费的,并可以通过为您创建的网络销售页面通过Paypal处理付款,通过电子邮件进行密钥发布并将密钥使用锁定到特定计算机上。防止盗版。
您还应该注意对代码进行混淆/加密,否则可以使用De4dot和.NetReflector等软件轻松对其进行反向工程。ConfuserEx是一个很好的免费代码混淆器,它快速,易于使用并且比昂贵的替代方案更有效。
您应该通过De4Dot和.NetReflector运行完成的软件,以对其进行反向工程,并查看破解者在做同样的事情时会看到什么,并确保您没有遗漏或掩盖任何重要的代码。
您的软件仍然可以破解,但对于随意的破解者来说,将其推迟可能就足够了,这些简单的步骤也将阻止提取和重复使用您的代码。
https://github.com/0xd4d/de4dot
https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download