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

Posted

技术标签:

【中文标题】创建许可证密钥的安全算法?【英文标题】:Secure algorithm for creating license keys? 【发布时间】:2010-11-04 04:10:30 【问题描述】:

我想分发一个应用程序,但有他们可以输入的许可证密钥来解锁。什么是创建简洁密钥的好算法,其中包含有关他们购买的版本的信息,以及许可期限等其他信息。

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

我们都见过这种情况,什么算法效果最好?我应该询问用户的明文名称并使用它根据他们自己的信息创建唯一的产品密钥吗?

是否有一个系统可以用来使生成有效密钥几乎不可能?

可能是公/私密钥对加密情况,只有制造商拥有私钥,数据可以通过公钥验证,但无法劫持公钥以创建有效密钥。

由于这是一个产品密钥,如果它相当短,64 个字符或最多 128 个字符会很好,但越短越好,32 个或更少会很好。

【问题讨论】:

如果您分发的是人们想要的独立软件,而无需付费,它就会被破解。我能想到可靠解决这个问题的唯一方法是创建依赖于您控制的服务器的东西。 +1。我认为“让诚实的人保持诚实”是解决这个问题的正确心态。没有什么是加密安全的,但是为每个许可证拥有某种唯一的密钥或编号实际上可以使商业客户更容易对其软件进行说明,从而为您的产品增加价值。旨在挫败犯罪分子(无论如何都不会付款)的繁重 DRM(不起作用)只是向客户付费的障碍。 @erickson 除非你搞砸了,否则让事情变得加密安全相对容易。不安全的是执行环境。如果用户可以修改他们机器上的内存,他们就可以绕过你的加密。 @Paul - 大多数开发人员都把密码学搞砸了。例如,当应用程序需要真实性而不是隐私时,您正在谈论加密。无论如何,当我说“加密安全”时,我将密钥管理作为所需加密操作的安全性的核心。当您的协议要求将密钥提供给攻击者时,您将无法获得安全性。 【参考方案1】:

你没有说你在什么平台上,但这是 Microsoft .Net 中的一个:

Really Simple Licensing Scheme for .NET

这个页面文档很简单 您可以使用的许可方案 您的 .NET 应用程序。它的目的是 相当安全,易于实施 并且易于扩展。示例版本 允许您提供许可证文件 其中嵌入了客户名称 但您可以轻松扩展它以添加 其他识别信息,机器 绑定,到期日期等。

这个方案利用了微软的 RSA 库和 XML 签名。基本上 你把任何你想要的东西放入 XML 记录并签署该文件。然后 您可以将该文件提供给您的 客户和应用程序可以读取 许可证信息 文件。由于文件是数字化的 签署的许可文件不能 被篡改,除非你释放你的 私钥(你真的 不应该)。

【讨论】:

这可以很容易地适应其他平台。 链接似乎已失效:404【参考方案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 的文章的作者。

【讨论】:

以上是关于创建许可证密钥的安全算法?的主要内容,如果未能解决你的问题,请参考以下文章

为java项目生成许可证密钥[重复]

是否可以在客户端安全地验证离线许可证密钥?

许可证方案、欺骗安全和撤销功能

在单独的表格上验证许可证密钥?

软件许可证密钥是如何生成的?

在 PHP 中加密和解密许可证密钥