我的公司正在寻求开始分发我们开发的一些软件,并希望能够让人们在购买之前试用这些软件。我们还想确保它不能被复制和分发给我们客户的客户。
我们见过的一种模式是将许可证绑定到 MAC 地址,因此该软件只能在一台机器上运行。
我想知道的是,什么是生成许可证密钥的好方法,其中嵌入了不同的信息,例如许可证到期日期、MAC 地址和不同的软件限制?
我的公司正在寻求开始分发我们开发的一些软件,并希望能够让人们在购买之前试用这些软件。我们还想确保它不能被复制和分发给我们客户的客户。
我们见过的一种模式是将许可证绑定到 MAC 地址,因此该软件只能在一台机器上运行。
我想知道的是,什么是生成许可证密钥的好方法,其中嵌入了不同的信息,例如许可证到期日期、MAC 地址和不同的软件限制?
我使用过 Macrovision(以前的 Globetrotter)的 FLEXlm 和 Reprise Software 的较新的 RLM(据我所知,由 FlexLM 的原作者编写)。两者都可以关闭 MAC 地址或物理加密狗,可以是节点锁定(仅绑定到一台机器)或“浮动”(网络上的任何授权机器都可以获得由中央许可证服务器发放的许可证,最多最多同时签出的副本数,由他们支付的金额决定)。有多种灵活的设置方式,包括到期日期、单独的子许可功能等。集成到应用程序中并不是很困难。这只是我用过的两个,我相信还有其他人也能做同样的工作。
这些程序很容易被破解,这意味着存在已知的漏洞可以让人们绕过使用它们的应用程序的安全性,或者通过削减他们自己的许可证来欺骗许可证服务器,或者仅仅修补你的二进制文件来绕过许可证检查(本质上用只说“返回'真'”的代码替换对他们库的子例程调用。它比这更复杂,但这就是它主要归结为的原因。你会看到你的产品的破解版本发布到各种 Warez 网站。这可能会非常令人沮丧和士气低落,尤其是因为他们经常对破解感兴趣,甚至对您的产品或如何处理它的知识都没有任何用处。(如果您有一个足够专业的程序。)
正因为如此,有些人会说你应该自己写,甚至经常改变加密方案。但我不同意。确实,滚动您自己的方法意味着针对 FLEXlm 或 RLM 的已知漏洞不会立即适用于您的应用程序。然而,除非你是这种安全方面的专家(显然你不是或者你不会问这个问题),否则很有可能在你缺乏经验的情况下,你最终会写出更不安全和更易破解的计划比市场领导者(尽管他们可能很弱)。
不自己动手的另一个原因很简单,那就是这是一场没完没了的猫捉老鼠游戏。对您的客户和您的销售人员来说,最好在许可证安全方面投入最少的精力并花时间调试或添加功能。您需要掌握许可计划,因为它仅仅是“让诚实的人保持诚实”,而不是防止坚决破解。接受破解者无论如何都不会为软件付费的事实。
不是每个人都能接受这种禅宗的态度。有些人晚上无法入睡,因为他们知道某个地方的某个人正在无偿获得一些东西。但试着学会处理它。您无法阻止盗版,但您可以平衡尝试阻止所有盗版与使您的产品更好地为用户服务的时间/精力/费用。请记住,有时盗版最多的应用程序也是最受欢迎和最有利可图的。祝你好运,睡个好觉。
我建议您在密钥中获取所需的信息,并使用 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]
我们多年来一直在我的公司使用以下算法,没有发生任何事故。
要解密,请将十六进制转换为字符串并使用 TEA 解密。但是还有一个额外的步骤:计算您自己的字段校验和(忽略校验和字段)并与给定的校验和进行比较。 这是确保没有人篡改密钥的步骤。
原因是TEA完全混合了比特,所以即使一个比特被改变,在TEA解密过程中所有其他比特也同样可能改变,因此校验和不会通过。
这可以破解吗?当然!几乎所有东西都是,但这足够紧凑且易于实现。
如果绑定联系信息还不够,请包含“节点 ID”字段并将其锁定到 MAC 地址或您建议的其他地址。
不要使用 MAC 地址。在我们测试过的一些硬件上——尤其是一些 IBM Thinkpad——MAC 地址会在重启时改变。我们没有费心去调查为什么会这样,但我们在研究过程中很早就知道不要依赖它。
强制性免责声明和插件:我共同创立的公司生产OffByZero Cobalt 许可解决方案。因此,听到我建议外包您的许可并专注于您的核心竞争力,您可能不会感到惊讶。
说真的,这些东西很难做对,而且做错的后果可能很糟糕。如果您是小批量高价,那么一些盗版副本可能会严重影响您的收入,如果您是大批量低价,那么warez d00dz 有动力破解您的软件以获得乐趣和声誉。
要记住的一件事是,没有真正的防破解许可。一旦有人在他们的硬件上拥有你的字节码,你就放弃了完全控制他们用它做什么的能力。
一个好的许可系统所做的就是将标准提高到足够高,以至于购买您的软件是一个更好的选择——尤其是随着受恶意软件感染的盗版软件的增加。我们建议您采取一些措施来保护您的应用程序:
我工作的公司实际上使用了USB 加密狗。这很方便,因为:
我知道大多数人不喜欢加密狗,但在这种情况下它非常方便,因为它实际上用于我们还提供的专用媒体播放器,因此 USB 密钥可以用作任何PC 上的演示,但也,且无需任何修改,在客户端满意后即可在真实应用(即真实玩家)中使用
我们保持简单:将每个许可证数据存储到 XML(易于阅读和管理),创建整个 XML 的哈希,然后使用实用程序(也是自己的和简单的)对其进行加密。
这也远非完美,但它可以保持一段时间。
几乎每一个商业许可系统都被破解了,我们用了这么多年最终都破解了,一般的规则是自己写,每次发布都改,开心了就自己破解。
没有什么是真正安全的,最终看看微软等大玩家,他们采用诚实的人会支付和其他人会复制的模式,不要投入太多精力。
如果您的应用程序值得为人们花钱。
我使用了许多不同的产品来生成许可证并创建了我自己的解决方案,但归根结底是什么会给你现在和未来的最大灵活性。
您应该专注于生成自己的许可证密钥的主题是......
十六进制格式、椭圆曲线密码学和任何加密算法,如 AES/Rijndael、DES、Blowfish 等。这些都非常适合创建许可证密钥。
当然,仅拥有一把钥匙是不够的,您还需要将其与产品相关联,并根据您创建的钥匙系统对应用程序进行编程以锁定。
我已经搞砸了创建自己的解决方案,但最终当它归结为使用软件赚钱时,我不得不放弃并获得一个商业解决方案,这将节省我生成密钥和管理我的产品线的时间......
到目前为止,我最喜欢的是 SpearmanTech 的 License Vault,但我也尝试过 FlexNet(昂贵)、XHEO(需要太多编程)和 SeriousBit Ellipter。
我最终选择了 License Vault 产品,因为我会以比其他产品便宜得多的价格获得它,而且它只是为我提供了更多,因为我们在 .NET 3.5 中完成了大部分工作。
如果不了解您的产品和客户,很难提供一个好的答案。对于出售给技术人员的企业软件,您可以使用相当复杂的许可系统,他们会弄清楚的。对于销售给几乎不懂计算机的消费者软件,您需要一个更简单的系统。
总的来说,我采用的做法是制作一个非常简单的系统,让诚实的人保持诚实。任何真正想窃取您的软件的人都会找到绕过任何 DRM 系统的方法。
过去,我将 Armadillo(现在的 Software Passport)用于 C++ 项目。我目前正在将 XHEO 用于 C# 项目。
如果您的产品需要使用互联网,那么您可以为机器生成一个唯一 ID,并使用它来检查许可证 Web 服务。
如果没有,我认为使用商业产品是可行的方法。是的,他们可以被黑客入侵,但对于绝对决心入侵它的人来说,他们不太可能会付钱。
我们使用过:http ://www.aspack.com/asprotect.aspx
我们还在他们的 sdk 产品中使用了一个函数调用,它为我们提供了一个机器的唯一 ID。
很好的公司,虽然他们的第一个产品被称为“AsPack”,但显然不是以英语为母语的人。