我的公司正在寻求开始分发我们开发的一些软件,并希望能够让人们在购买之前试用该软件。我们还希望确保它不会被复制并分发给我们客户的客户。

我们见过的一种模型是将许可证与 MAC 地址绑定,这样该软件只能在一台机器上运行。

我想知道的是,生成嵌入不同信息(例如许可证到期日期、MAC 地址和不同软件限制)的许可证密钥的好方法是什么?

有帮助吗?

解决方案

我建议您在密钥中获取所需的信息,并使用 md5 对其进行哈希处理,然后仅获取前 X 个字符(其中 X 是您认为可以管理的密钥长度)。

从密码学角度来说,它远非完美,但在这个领域,你需要付出最少的努力来阻止随意的攻击者——任何更快的东西都会变成黑洞。

哦,我还应该指出,如果您沿着这条路径走下去,您还需要以纯文本(或稍微混淆的方式)提供到期日期(以及您可能想自己读出的任何其他信息)作为密钥的一部分- md5 只是为了阻止最终用户更改到期日期以延长许可证。

最简单的事情就是像这样的密钥文件......

# License key for XYZZY
expiry-date=2009-01-01
other-info=blah
key=[md5 has of MAC address, expiry date, other-info]

其他提示

我使用过 Macrovision(以前称为 Globetrotter)的 FLEXlm 和 Reprise Software 的较新的 RLM(据我所知,由 FlexLM 的原作者编写)。两者都可以关闭 MAC 地址或物理加密狗,可以是节点锁定(仅绑定到一台机器)或“浮动”(网络上的任何授权机器都可以获得中央许可证服务器发放的许可证,同时签出副本的最大数量取决于他们支付的金额)。有多种灵活的设置方式,包括到期日期、单独的分许可功能等。集成到应用程序中并不是很困难。这些只是我用过的两个,我相信还有其他的也能完成这项工作。

这些程序很容易被破解,这意味着存在已知的漏洞,可以让人们绕过使用它们的应用程序的安全性,或者通过削减自己的许可证来欺骗许可证服务器,或者仅仅通过修补您的二进制文件来绕过许可证检查(本质上用只显示“return 'true'”的代码替换对其库的子例程调用。它比这更复杂,但这就是它的主要归结。您将看到您的产品的破解版本发布到各个 Warez 网站上。这可能会非常令人沮丧和士气低落,尤其是因为他们经常为了破解而感兴趣,甚至对你的产品没有任何用处,也不知道如何使用它。(如果您有足够专业的程序,这一点是显而易见的。)

正因为如此,有些人会说你应该自己编写,甚至可能经常更改加密方案。但我不同意。确实,自行开发意味着针对 FLEXlm 或 RLM 的已知漏洞不会立即适用于您的应用程序。然而,除非你是这种安全性方面的专家(显然你不是,或者你不会问这个问题),否则在你缺乏经验的情况下,你很可能最终会编写出安全性更低、更容易破解的代码。计划优于市场领导者(尽管他们可能很弱)。

不推出自己的另一个原因很简单,这是一场无休止的猫捉老鼠的游戏。对于您的客户和销售人员来说,最好在许可证安全方面投入最少的精力,并花时间调试或添加功能。您需要认真对待许可计划,因为它只是“让诚实的人保持诚实”,而不是阻止坚决的破解。接受黑客无论如何也不会为该软件付费的事实。

不是每个人都能采取这种禅宗态度。有些人知道有人在某个地方不劳而获,晚上睡不着觉。但试着学会处理它。您无法阻止盗版,但您可以平衡尝试阻止所有盗版的时间/精力/费用与让您的产品更好地为用户服务。请记住,有时盗版最多的应用程序也是最受欢迎和最有利可图的。祝你好运,睡个好觉。

我们在以下位置使用了以下算法 我的公司 多年来没有发生过一起事故。

  1. 确定代码中所需的字段。尽可能多地进行位打包。例如,日期可以是“自 2007 年以来的天数”,然后您就可以使用 16 位。
  2. 添加额外的“校验和”字段。(您很快就会明白原因。)该字段的值是来自其他字段的打包字节的校验和。我们使用“MD5 的前 32 位”。
  3. 使用加密所有内容 . 。对于密钥,请使用可识别客户的内容(例如公司名称+个人电子邮件地址),这样如果有人想在互联网上发布密钥,他们必须以纯文本形式包含自己的联系信息。
  4. 以某种合理的方式将十六进制转换为字符串。您可以使用直接的十六进制数字,但有些人喜欢选择不同的 16 个字符集以使其不那么明显。还应定期添加破折号或其他内容,以便更轻松地通过电话阅读。

要解密,请将十六进制转换为字符串并使用 TEA 解密。但还有这个额外的步骤:计算您自己的字段校验和(忽略校验和字段)并与给定的校验和进行比较。 这是确保没有人篡改密钥的步骤.

原因是TEA完全混合了比特,因此即使只有一位发生变化,在TEA解密过程中所有其他比特也同样可能发生变化,因此校验和不会通过。

这可以破解吗?当然!几乎一切都是如此,但这足够严格并且易于实施。

如果绑定联系信息还不够,请包含“节点 ID”字段并将其锁定为 MAC 地址或您建议的地址。

不要使用 MAC 地址。在我们测试过的某些硬件上(特别是某些 IBM Thinkpad),MAC 地址可能会在重新启动时更改。我们没有费心去调查 为什么 确实如此,但我们在研究过程中很早就学会了不要依赖它。

强制性免责声明和插件:我共同创立的公司生产 OffByZero Cobalt 许可解决方案. 。因此,当您听到我建议外包您的许可并专注于您的核心能力时,您可能不会感到惊讶。

说实话,这些东西很难做对,而且做错了后果可能会很糟糕。如果您是小批量高价,一些盗版可能会严重削弱您的收入,而如果您是大批量低价,那么warez d00dz就有动机破解您的软件以获取乐趣和声誉。

需要记住的一件事是,不存在真正防破解的许可。一旦有人在他们的硬件上拥有了你的字节码,你就放弃了完全控制他们用它做什么的能力。

良好的许可系统的作用是提高标准,使购买软件成为更好的选择 - 特别是随着受恶意软件感染的盗版软件的增加。我们建议您采取多种措施来保护您的应用程序:

  • 获得良好的第三方许可体系
  • 使用范围包含的检查来填充您的代码(例如没有像 fIsLicensed 这样的全局变量,不要检查实现该功能的代码附近的功能状态)
  • 对 .NET 或 Java 代码进行严重的混淆

我工作的公司实际上使用了 USB加密狗. 。这很方便,因为:

  • 我们的软件也安装在该 U 盘上
  • 该程序仅在找到(唯一的)硬件密钥时才会运行(任何标准 USB 密钥都有该密钥,因此您不必购买特殊的东西,任何棒都可以)
  • 它不限于计算机,如果需要,可以安装在另一个系统上

我知道大多数人不喜欢加密狗,但在这种情况下它非常方便,因为它实际上用于特殊目的 媒体播放器 我们还提供了 USB 密钥,因此可以用作演示 任何 pc,而且一旦客户满意,也无需任何修改即可在真实应用程序(即真实玩家)中使用

我们保持简单:将每个许可证数据存储到 XML(易于阅读和管理),创建整个 XML 的散列,然后使用实用程序(也是自己的且简单的)对其进行加密。

这也远非完美,但可以维持一段时间。

几乎每个商业许可系统都被破解了,我们使用了很多年最终都被破解了,一般规则是自己编写,每次发布时更改它,一旦你高兴就尝试自己破解它。

没有什么是真正安全的,最终看看微软等大公司,他们采用的模式是诚实的人会付费,其他人会复制,不要投入太多精力。

如果你的应用值得花钱,人们就会愿意。

我使用了许多不同的产品来生成许可证,并创建了自己的解决方案,但这归结为现在和将来能给您带来最大灵活性的解决方案。

生成您自己的许可证密钥时应重点关注的主题是...

HEX 格式、椭圆曲线加密以及任何加密算法,例如 AES/Rijndael、DES、Blowfish 等。这些非常适合创建许可证密钥。

当然,拥有密钥还不够,您还需要将其与产品关联,并对应用程序进行编程,以根据您创建的密钥系统进行锁定。

我一直在创建自己的解决方案,但最终当涉及到用软件赚钱时,我不得不放弃并获得一个商业解决方案,这将节省我生成密钥和管理产品线的时间......

到目前为止,我最喜欢的是 SpearmanTech 的 License Vault,但我也尝试过 FlexNet(昂贵)、XHEO(需要太多编程)和 SeriousBit Ellipter。

我最终选择了 License Vault 产品,因为我会比其他产品便宜得多,而且它可以为我提供更多功能,因为我们的大部分工作都是在 .NET 3.5 中完成的。

如果不了解您的产品和客户,就很难提供好的答案。对于出售给技术人员的企业软件,您可以使用相当复杂的许可系统,他们会弄清楚的。对于出售给几乎不懂计算机的人的消费软件,您需要一个更简单的系统。

总的来说,我采用了制作一个非常简单的系统的做法,让诚实的人保持诚实。任何真正想要窃取您的软件的人都会找到绕过任何 DRM 系统的方法。

过去我曾在 C++ 项目中使用过 Armadillo(现在的 Software Passport)。我目前正在将 XHEO 用于 C# 项目。

如果您的产品需要使用互联网,那么您可以为机器生成一个唯一的 ID,并使用它来检查许可证 Web 服务。

如果没有,我认为使用商业产品是正确的选择。是的,他们可能会被黑客攻击,但对于那些绝对决心要黑客攻击的人来说,他们不太可能愿意付钱。

我们已经使用过: http://www.aspack.com/asprotect.aspx

我们还在他们的 sdk 产品中使用函数调用,为我们提供机器的唯一 ID。

好公司,虽然显然不是以英语为母语,因为他们的第一个产品被称为“AsPack”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top