用于创建许可证密钥的安全算法?

24

我想要发布一个应用程序,但需要许可证密钥来解锁该应用。有什么好的算法可以创建一个简明的密钥,其中包含已购买版本的信息以及其他内容,如许可证持续时间等。

我知道这种保护措施可能被破解,但它可以让诚实的人保持诚实。我可能会实现在线激活,但我主要关心的是生成这些密钥的好方法。

我们都见过这种情况,哪种算法最好?我是否应该要求用户提供明文用户名,并使用其自己的信息创建唯一的产品密钥?

是否有一种系统可以使生成有效密钥变得几乎不可能?也许可以使用公钥/私钥加密形式,在这种情况下只有制造商拥有私钥,数据可以通过公钥验证,但无法劫持公钥来创建有效密钥。

由于这是产品密钥,如果长度较短,64个字符或最多128个字符将更好,但越短越好,32个字符或更少更好。


如果你正在分发独立软件,而人们想要使用它却不愿意付费,那么它很可能会被破解。我能想到的唯一可靠的方法是创建一个依赖于你控制的服务器的东西。 - geofftnz
8
我认为“保持诚实的人诚实”是解决这个问题的正确心态。没有什么东西可以在密码学上完全安全,但为每个许可证提供某种独特的密钥或编号,实际上可以使企业客户更容易核算他们的软件,并增加您产品的价值。旨在阻止罪犯(他们永远不会付款)的繁琐DRM只会成为付费客户的障碍。 - erickson
1
@erickson,除非你犯了严重错误,否则要使事物在加密方面相对安全是相对容易的。不安全的是执行环境。如果用户可以修改其计算机上的内存,则可以绕过您的加密。 - Paul McMillan
@Paul - 大多数开发人员在密码学方面都会犯大错。例如,在应用程序需要身份验证而不是隐私时,您正在谈论加密。无论如何,当我说“加密安全”时,我将密钥管理作为所需密码操作的安全性的核心。当您的协议要求将密钥交给攻击者时,您就无法拥有安全性。 - erickson
2个回答

10

您没有说明使用的平台,但是这里提供了一个Microsoft .Net平台下的解决方案:

.NET真正简单的许可证方案

这个页面介绍了一种非常简单的许可证方案,可以用于您的.NET应用程序。它旨在安全性较高,易于实现并易于扩展。示例版本允许您提供包含客户端名称的许可文件,但是您可以轻松扩展它以添加其他识别信息、机器绑定、到期日期等。

该方案利用了微软的RSA库和XML签名。基本上,您将任何想要的内容放入XML文档中并进行签名。然后,您可以将该文件提供给您的客户端,并且应用程序可以从那个文件中读取许可证信息。由于文件是数字签名的,因此除非您发布私钥(您真的不应该这样做),否则无法篡改许可证文件。


这可以很容易地适应其他平台。 - Alex S
链接似乎已经失效:404。 - Jonas Johansson

3

无法上网和快捷键

关于序列号大小,短/易读的密钥(不太安全)与长密钥或许可文件(更安全)之间存在权衡。

如果你想要短且易读的密钥,允许你存储到期日期和功能等信息,可以使用SKGL和Software Protector,它们都是开源的(https://help.cryptolens.io/faq/what-is-skgl)。

然而,缺点是它们很可能使用对称加密和/或在应用程序中存储密钥生成算法。这意味着最终用户可以试图找到加密密钥和/或算法(请参见http://www.codeproject.com/Articles/764610/Licensing-systems-in-NET)。

互联网访问(或离线激活文件)

更好的选择是使用基于云的系统来跟踪所有许可证密钥,并允许您随时修改它们。

如果你有一个基于Web的许可系统,你可以保持密钥更短,不必在实际密钥中存储信息(这是大多数离线系统的情况)。

此外,你将能够支持更多的许可模型,例如,基于订阅的模型。

解决方案有:

  • 自己构建这样的系统 - 这将花费很多时间,并使你分散开发应用程序的核心功能。

  • 使用现有的开源系统作为起点 - 虽然它可能很诱人,因为它是开源和免费的,但需要时间将它们带到云端+根据你的特定需求进行配置+维护。我观察到的开源系统往往功能非常广泛,这增加了复杂性。

  • 外包给第三方 - 缺点是大多数都不是免费的。

在我看来,整个过程应该外包给专门开发该特定组件的第三方。一旦你扩展,你可能需要改变授权逻辑。与其自己开发,不如找一个已经支持该场景的第三方。

市面上有几种解决方案(确保寻找基于Web的解决方案),例如Cryptolens。如果你正在开发.NET应用程序,这里是一个逐步示例:https://help.cryptolens.io/examples/key-verification


免责声明:我是SKGL /软件保护器、有关许可系统的文章和Cryptolens的作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接