我怎样才能为我的C#应用​​程序创build一个产品密钥?

我怎样才能为我的C#应用​​程序创build一个产品密钥?

我需要创build一个每年更新的产品(或许可证)密钥。 此外,我需要创build一个试用版本。

有关:

  • 我如何最好地混淆我的C#产品许可证validation码?
  • 基于Web的许可证激活
  • 你如何保护你的软件免遭非法分发?
  • 最好的激活关键软件的.NET应用程序?

你可以做一些事情,比如创build一个包含你想要authentication的数据的logging。 这可能包括任何你想要的 – 例如程序function启用,失效date,用户名(如果你想绑定到用户)。 然后用一个固定的密钥encryption那个encryptionalgorithm或者散列它。 那么你只需在程序中validation它。 一种分发许可证文件(在Windows上)的方法是将其作为更新registry的文件(保存用户必须键入)。

小心错误的安全感 – 迟早有人会简单地修补你的程序跳过检查,并分发补丁版本。 或者,他们会制定出一个通过所有支票和发行,或者倒计时的钥匙。无论你制定你的计划有多复杂,你所做的任何事情最终都会通过默默无闻的方式成为安全的,他们将永远能够这个。 即使他们不能,也会分发被黑客入侵的版本。 即使您提供encryption狗也同样适用 – 如果有人想要,也可以将支票打补丁。 对您的代码进行数字签名将无济于事,他们可以删除该签名或辞职。

你可以通过使用技术来防止程序在debugging器中运行等等,使问题变得复杂一些,但即使这不是防弹的。 所以你应该让这个诚实的用户不会忘记付钱。 同时要非常小心,您的scheme不会对付费用户造成冲击 – 最好是复制一些副本,而不是付费用户不能使用付费用户。

另一个select是进行在线检查 – 只需向用户提供一个唯一的ID,然后在线检查ID应具有的function,并将其caching一段时间。 所有相同的警告适用于 – 人们可以绕过这样的事情。

还要考虑不得不处理忘记密钥的用户的支持成本等。

编辑:我只是想补充一点,不要花太多时间在这个上面,或者以为不知何故,你的复杂计划将是不同的,不可破解的。 它不会,只要人们控制你的程序运行的硬件和操作系统。 开发商一直在试图想出更复杂的scheme,认为如果他们开发自己的系统,那么只有他们知道,因此“更安全”。 但它的确是编程等价物,试图build立一个永动机。 🙂

你相信谁?

我一直认为这个领域太重要了,不能相信第三方来pipe理应用程序的运行时安全。 一旦这个组件被破解了一个应用程序,它就被破解了所有的应用程序。 一旦他们在3年前使用第三方许可证解决scheme,就会在五分钟内发生Discreet ……好时光!

严重的是,考虑对自己的algorithm进行完全的控制。 如果你这样做,考虑在你的密钥中使用组件:

  • 许可证名称 – 许可证的客户名称(如果有的话)。 对于pipe理公司部署非常有用 – 让他们觉得在您提供的许可信息中拥有“个性化”名称是特别的。
  • 许可证到期date
  • 在相同许可下运行的用户数量。 这假设你有一种跟踪服务器方式的跨站点运行实例的方法
  • function代码 – 让您可以跨多个function和多个产品使用相同的许可系统。 当然,如果它是一个产品破解,它是所有的破解。

然后检查他们的地狱,并添加任何(可逆)encryption你想要的,使之更难以破解。

要制作试用许可证密钥,只需将上述值的值设置为“试用模式”即可。

由于这可能是您的应用程序/公司中最重要的代码,因此可以考虑将解密例程放在本地DLL文件中,并简单地将P / Invoke放入其中。

我曾经工作过的几家公司采用了一般化的方法,取得了巨大的成功。 或者,也许产品不值得开裂;)

无论是微不足道的还是难以破解的,我都不确定它是否真的有很大的不同。

您的应用程序被破解的可能性远远大于其实用性,而不是产品密钥处理的强度。

我个人认为有两类用户。 那些支付。 那些谁不。 即使是最琐碎的保护措施,也可能会这样做。 那些谁不会等待破解或看别处。 无论哪种方式,它不会让你更多的钱。

如果您询问可以键入的密钥,例如Windows产品密钥,那么它们将基于一些检查。 如果您正在讨论您必须复制粘贴的密钥,则它们基于数字签名(私钥encryption)。

一个简单的产品关键逻辑可以首先说产品关键字由四个5位数组组成,如abcde-fghij-kljmo-pqrst ,然后继续指定内部关系,如f + k + p应等于a,这意味着2,3和4组的第一个数字应该总计为a。 这意味着8xxxx-2xxxx-4xxxx-2xxxx有效,8xxxx-1xxxx-0xxxx-7xxxx也是如此。 当然,还会有其他的关系,包括复杂的关系,如果第一组的第二位是奇数,那么最后一组的最后一位也应该是奇数。 这样就会有产品密钥的生成器,产品密钥的validation只会检查它是否符合所有的规则。

encryption通常是使用私钥(==数字签名)encryption并转换为Base64的许可证信息的string。 公钥与应用程序一起分发。 Base64string到达​​时,通过公钥validation(==解密),如果发现有效,则激活产品。

还有Microsoft软件许可和保护 (SLP)服务选项。 阅读后,我真的希望我可以使用它。

我真的很喜欢根据许可证阻止部分代码的想法。 最热的东西,最安全的.NET。 有趣的阅​​读,即使你不使用它!

Microsoft®软件许可和保护(SLP)服务是一项软件激活服务,它使独立软件供应商(ISV)能够为其客户采用灵活的许可条款。 Microsoft SLP服务采用独特的保护方法,有助于保护您的应用程序和许可信息,使您能够更快地进入市场,同时提高客户合规性。

注意:这是我发布具有敏感代码的产品(如有价值的algorithm)的唯一方法。

我不得不承认我会做一些相当疯狂的事情。

  1. find一个CPU瓶颈并将其解压缩到P / Invokeable DLL文件中。
  2. 作为后期构build操作,使用XORencryption密钥encryption部分DLL文件。
  3. select公钥/私钥scheme,在DLL文件中包含公钥
  4. 安排这样的解密产品密钥和XORing这两个一起导致DLL的encryption密钥。
  5. 在DLL的DllMain代码中,禁用保护(PAGE_EXECUTE_READWRITE)并使用密钥对其进行解密。
  6. 制作一个LicenseCheck()方法,对许可证密钥和参数进行健全性检查,然后校验整个DLL文件,同时抛出许可证违规。 哦,在这里做一些其他的初始化。

当他们find并删除LicenseCheck时,DLL开始分段错误时会有什么乐趣。

如果您想要一个简单的解决scheme来创build和validation序列号,请尝试省略号 。 它使用椭圆曲线密码学,并具有“过期date”function,因此您可以创build试用版本或时间限制的注册密钥。

另一个价格便宜的产品密钥和激活工具是InstallKey。 看看www.lomacons.com

诀窍是有一个只有你知道的algorithm(这样才能在另一端解码)。

有一些简单的事情,比如“选一个素数并添加一个幻数”

更复杂的选项,如使用一组二进制数据的非对称encryption(可能包括一个唯一的标识符,版本号等)和分发encryption的数据作为关键。

也值得一读这个问题的答案

有一些工具和API可用。 但是,我不认为你会find一个免费的;)

例如有一个OLicense套件: http ://www.olicense.de/index.php?lang=en

你可以检查LicenseSpot 。 它提供:

  • 免费许可组件
  • 在线激活
  • API来集成你的应用程序和在线商店
  • 序列号的生成
  • 撤销许可证
  • 订阅pipe理

一个简单的方法是使用全局唯一标识符 (GUID)。 GUID通常存储为128位值,通常显示为32个hex数字,并用连字符分隔,如{21EC2020-3AEA-4069-A2DD-08002B30309D}

通过System.Guid.NewGuid()在C#中使用下面的代码。

 getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string. _key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/". 

我希望它有帮助。

请检查此答案: https : //stackoverflow.com/a/38598174/1275924

这个想法是使用SKM平台作为许可证服务器。 这里是一个分步的例子 (在VB.NET中)

我要搭上@ frankodwyer的伟大答案,并深入一点基于在线的许可。 我是Keygen的创始人,这是为开发人员构build的许可REST API。

由于您提到希望为您的应用程序提供2种“许可证types”,即“完整版”和“试用版”,我们可以简化并在许可应用程序特定function的情况下使用function许可证模式 (在这种情况下,有一个“完整”function集和一个“试用”function集)。

首先,我们可以创build两种许可证types (在Keygen中称为策略 ),每当用户注册一个帐户时,您就可以为他们创build一个“试用”许可证(“试用”许可证实现我们的“试用”function策略) ,您可以使用它来在应用程序内进行各种检查,例如用户可以使用Trial-Feature-ATrial-Feature-B

在此基础上,无论用户何时购买您的应用程序 (无论您使用的是PayPal,Stripe等),都可以生成实施“完整”function政策的许可证并将其与用户的帐户相关联。 现在在您的应用程序中,您可以检查用户是否具有可以执行Pro-Feature-XPro-Feature-Y的“完整”许可证(通过执行诸如user.HasLicenseFor(FEATURE_POLICY_ID) )。

我提到允许您的用户创build用户帐户 – 我的意思是什么? 我在其他一些答案中详细介绍了这一点,但是为什么我认为这是一种validation和识别用户的高级方法:

  1. 用户帐户可让您将多个许可证多台机器关联到单个用户 ,让您了解客户的行为, 并提示他们进行“应用内购买”,即购买“完整”版本(类似移动应用程序)。
  2. 我们不应该要求我们的客户input很长的许可证密钥,这些密钥既乏味又难以追踪,即易于丢失。 (尝试在Twitter上search“丢失的许可证密钥”)
  3. 客户习惯于使用电子邮件/密码 ; 我认为我们应该做一些人们习惯的做法,以便提供良好的用户体验(UX)。

当然,如果您不想处理用户帐户,并希望用户input许可证密钥,那就完全没问题了(Keygen也支持这样做 )。 我只是提供另一种处理许可方面的方法,并希望为您的客户提供一个很好的用户体验。

最后,由于您还提到要每年更新这些许可证,因此您可以在自己的政策上设置一个持续时间 ,以便“完整”许可证在一年后“过期”,“试用”许可证持续两周,要求用户购买新的许可证到期后。

我可以挖掘更多,与用户和类似的东西进入关联机器,但我想我会尽量保持这个答案简短,重点在于简单地向用户授予许可function。