我想分发一个应用程序,但有许可证密钥,他们可以输入解锁。什么是一个很好的算法来创建一个简洁的密钥,其中包含有关他们购买的版本的信息,以及许可证持续时间等其他内容。
我意识到这种保护可以被破解,但它让诚实的人保持诚实。我可能会或可能不会实现在线激活,但我主要关注生成这些密钥的好方法。
我们都看到过这种情况,哪种算法效果最好?我应该要求用户的明文名称并使用它来根据自己的信息创建唯一的产品密钥吗?
是否有可用于使其几乎无法生成有效密钥的系统?
可能是公共/私有密钥对加密情况,其中只有制造商拥有私钥,数据可以通过公钥验证,但公钥不能被劫持以创建有效密钥。
由于这是一个产品密钥,如果它相当短,64个字符或者最多128个字符会很棒,但是越短越好,32个或更少会很好。
答案 0 :(得分:11)
你没有说出你所使用的平台,但这里是微软.Net中的一个:
http://jclement.ca/devel/dotnet/reallysimplelicensing.html
此页面记录非常简单 您可以使用的许可方案 你的.NET应用程序。它的目的是 相当安全,易于实施 并且易于扩展。样本版本 允许您提供许可证文件 其中嵌入了客户名称 但你可以轻松扩展它来添加 其他识别信息,机器 绑定,到期日等。
这个方案利用了微软的 RSA库和XML签名。基本上 你把任何你想要的东西放到XML中 记录并签署该文件。然后 您可以将该文件提供给您 客户和应用程序可以阅读 许可证信息 文件。由于文件是数字的 签署许可证文件不能 篡改,除非你释放你的 私钥(你真的 不应该这样做。)
答案 1 :(得分:2)
关于串行密钥大小,短/人可读密钥之间存在折衷 (安全性较低)并拥有长密钥或可能的许可证文件(更安全)。
如果您需要允许存储过期日期和功能等内容的简短和人类可读密钥,您可以将SKGL与Software Protector一起使用,它们都是开源的(https://help.cryptolens.io/faq/what-is-skgl)。
然而,缺点是它们很可能使用对称加密和/或将密钥生成算法存储在应用程序中。这意味着最终用户可以尝试查找加密密钥和/或算法(请参阅http://www.codeproject.com/Articles/764610/Licensing-systems-in-NET)。
更好的选择是使用基于云的系统来跟踪所有许可证密钥,并允许您随时修改它们。
如果您拥有基于Web的许可系统,则可以缩短密钥,而不必将信息存储在实际密钥中(大多数基于离线的系统就是这种情况)。
此外,您将能够支持更多许可模式,例如,基于订阅的模型。
解决方案是:
自己构建此类系统 - 这将耗费大量时间并让您分散应用程序的核心功能。
使用现有的开源系统作为起点 - 虽然它可能很诱人,因为它是开源的并且是免费的,但是需要时间将它们带到云端+配置它满足您的特殊需求+维护它。我观察到的开源系统在功能上往往非常广泛,这导致了复杂性。
外包给第三方 - 缺点是大多数都不是免费的。
在我看来,整个程序应该外包给专门开发该特定组件的第三方。扩展后,您可能需要更改许可逻辑。而不是自己开发,很可能第三方已经支持这种情况。
有几种解决方案(确保寻找那些基于网络的),Cryptolens就是一个例子。如果您正在开发.NET应用程序,请按以下步骤示例:https://help.cryptolens.io/examples/key-verification。
免责声明:我是SKGL / Software Protector的作者,有关许可系统和Cryptolens的文章。