我的公司正在寻求开始分发我们开发的一些软件,并希望能够让人们在购买之前试用该软件。我们还希望确保它不会被复制和分发给我们客户的客户。
我们已经看到的一种模型是将许可证绑定到MAC地址,这样软件就只能在一台机器上运行。
我想知道的是,有什么好方法可以生成一个包含不同信息的许可证密钥,比如许可证到期日期、MAC地址和不同的软件限制?
发布于 2008-09-08 13:09:13
我建议您获取密钥中需要的信息片段,并使用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]发布于 2008-09-08 14:15:48
我使用过Macrovision (前身是Globetrotter)的FLEXlm,也用过Reprise的更新版本(据我所知,是由FlexLM的原始作者编写的)。两者都可以键入MAC地址或物理加密狗,可以是节点锁定的(仅绑定到一台机器)或“浮动”(网络上的任何授权机器都可以获得由中央许可证服务器分发的许可证,最多同时签出的副本数量由它们支付的金额确定)。有多种灵活的方式来设置它,包括到期日期,单个子许可功能等。集成到应用程序中并不是很困难。这只是我用过的两个,我相信还有其他的也做得很好。
这些程序很容易被破解,这意味着有一些已知的漏洞攻击,可以让人们绕过使用它们的应用程序的安全性,或者通过剪切他们自己的许可证来欺骗许可证服务器,或者仅仅通过修补您的二进制文件来绕过许可证检查(本质上是将对他们的库的子例程调用替换为只说"return 'true'“的代码。它比这复杂得多,但这就是它最主要的归结。您将在各个Warez站点上看到您的产品的破解版本。这可能是非常令人沮丧和士气低落的,尤其是因为他们经常对破解有兴趣,甚至对你的产品没有任何用处,也不知道如何处理它。(如果你有一个足够专业的程序,这一点是显而易见的。)
正因为如此,有些人会说你应该自己写,甚至经常改变加密方案。但我不同意。确实,滚动您自己的代码意味着针对FLEXlm或RLM的已知攻击不会立即在您的应用程序中起作用。然而,除非你是这种安全性的专家(显然你不是,或者你不会问这个问题),否则你很可能会因为缺乏经验而写出一个比市场领先者(尽管他们可能很弱)更不安全和更容易破解的方案。
另一个不滚你自己的原因很简单,那就是这是一个没完没了的猫和老鼠的游戏。对您的客户和销售人员来说,最好将最少的精力放在许可证安全性上,并将这些时间花在调试或添加功能上。你需要认真对待许可计划,仅仅是“让诚实的人诚实”,而不是阻止决心破解。接受黑客无论如何都不会为软件买单的事实。
并不是每个人都能接受这种禅宗的态度。有些人晚上睡不着觉,因为他们知道某人在某处无偿得到了一些东西。但是试着去学习如何处理它。你不能阻止盗版,但你可以平衡你的时间/精力/费用,试图阻止所有盗版和使你的产品更好地为用户服务。请记住,有时盗版最多的应用程序也是最受欢迎和最赚钱的。祝你好运,睡个好觉。
发布于 2008-09-08 13:40:05
多年来,我们在my company使用了以下算法,没有发生过一起事故。
要解密,请将十六进制转换为字符串,并使用TEA解密。但是还有这个额外的步骤:计算你自己的字段的校验和(忽略校验和字段),并与给定的校验和进行比较。这是确保没有人篡改密钥的步骤。
原因是TEA完全混合了比特,所以即使一个比特被改变,所有其他比特在TEA解密过程中也同样可能改变,因此校验和将不会通过。
这是可破解的吗?当然了!几乎所有的东西都是,但这是足够紧凑和简单的实现。
如果绑定到联系信息还不够,那么可以添加一个"Node ID“字段,并根据您的建议将其锁定到MAC地址或类似的地址。
https://stackoverflow.com/questions/49662
复制相似问题