我该如何为我的C#应用程序创建产品密钥?
我需要创建一个每年更新的产品(或许可)密钥。此外,我还需要为试用版本创建一个密钥。
相关:
我该如何为我的C#应用程序创建产品密钥?
我需要创建一个每年更新的产品(或许可)密钥。此外,我还需要为试用版本创建一个密钥。
相关:
您可以创建包含要用于应用程序认证的数据的记录。这可以包括任何您想要的内容 - 例如启用的程序功能、过期日期、用户名(如果您想将其绑定到用户)。然后,使用固定密钥的某些加密算法对其进行加密或哈希。然后只需在程序中进行验证即可。在Windows上分发许可文件的一种方法是将其提供为更新注册表的文件(保存用户无需输入)。
但要注意虚假安全感 - 迟早有人会简单地修补您的程序以跳过该检查并分发已经过修补的版本。或者,他们将找出可以通过所有检查的密钥,并且分发它,或者回溯时钟等等。无论您使计划多么复杂,最终都将成为模糊安全性,而他们总是能够做到这一点。即使他们不能,有人也会,他们会分发这个被黑客攻击的版本。即使您提供了一个加密狗,情况也如此 - 如果有人愿意,他们也可以修补掉那个检查。数字签名代码也没用,因为他们可以删除该签名或重新签名。
您可以通过使用技术防止程序在调试器中运行等方式来使问题更加复杂,但即使这也不是万无一失的。因此,您应该让它足够困难,以至于诚实的用户不会忘记付款。还要非常注意,您的方案不会对付费用户产生障碍 - 最好有一些被盗版副本,而不是让您的付费客户无法使用他们已经支付的东西。
另一个选择是进行在线检查 - 仅向用户提供唯一ID,并在线检查该ID应具有的功能,并缓存一段时间。但同样要注意所有警告 - 人们可以绕过任何类似的操作。
还要考虑处理忘记密钥用户等用户支持成本。
编辑:我只想补充一点,不要在这上面花太多时间,也不要认为你的错综复杂的计划会有所不同并且难以破解。它不会,只要人们控制你的程序运行的硬件和操作系统就无法做到。开发人员一直在尝试提出越来越复杂的方案,认为如果他们为此开发自己的系统,则只有他们才知道,因此“更安全”。但这实际上就像是试图构建永动机的编程等效物。:-)
你信任谁?
我一直认为这个领域太重要了,不能信任第三方来管理应用程序的运行时安全性。一旦该组件被破解,对于所有应用程序都是如此。几年前Discreet选择第三方许可证解决方案后,他们的3ds Max在五分钟内就被破解了...好时光!
认真考虑自己开发以完全控制算法。如果这样做,请考虑在您的密钥中使用以下组件:
然后对它们进行校验和并添加任何(可逆)加密,使其更难破解。
要创建试用许可证密钥,只需为上述值设置固定值,表示“试用模式”即可。
由于这可能是您的应用程序/公司中最重要的代码,因此除了混淆之外,考虑将解密例程放在本地DLL文件中,并简单地P / Invoke调用它。
我曾经为几家公司采用过通用方法,并取得了巨大成功。或者也许产品不值得破解 ;)
abcde-fghij-kljmo-pqrst
,然后继续指定内部关系,例如f+k+p应该等于a,意思是第2、3和4组的第一个数字应该总计为a。这意味着8xxxx-2xxxx-4xxxx-2xxxx是有效的,8xxxx-1xxxx-0xxxx-7xxxx也是有效的。当然,还会有其他关系,包括复杂的关系,例如,如果第一组的第二个数字是奇数,则最后一组的最后一个数字也应该是奇数。这样就会有产品密钥生成器,并且验证产品密钥只需检查是否符合所有规则。我必须承认我会做一些相当疯狂的事情。
当他们找到并删除LicenseCheck时,DLL开始分段错误,接下来会发生什么有趣的事情。
还有一种选择是Microsoft Software Licensing and Protection(SLP)服务。阅读后,我真的希望能够使用它。
我非常喜欢根据许可证来阻止代码部分的想法。这是.NET最安全的热门功能。即使您不使用它,也是有趣的阅读!
Microsoft® Software Licensing and Protection (SLP) Services是一项软件激活服务,使独立软件供应商(ISV)可以为其客户采用灵活的许可条款。 Microsoft SLP服务采用独特的保护方法,有助于保护您的应用程序和许可信息,从而使您更快地进入市场,同时增加客户的合规性。
注意:这是我发布包含敏感代码(例如有价值的算法)的产品的唯一方式。
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 "/".
var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";
var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
Key = licenseKey,
ProductId = 3349,
Sign = true,
MachineCode = Helpers.GetMachineCode()
});
if (result == null || result.Result == ResultType.Error ||
!result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
// an error occurred or the key is invalid or it cannot be activated
// (eg. the limit of activated devices was achieved)
Console.WriteLine("The license does not work.");
}
else
{
// everything went fine if we are here!
Console.WriteLine("The license is valid!");
}
Console.ReadLine();