开发简单的序列号生成器/验证器有什么好方法?

时间:2009-02-17 23:15:56

标签: language-agnostic license-key

我正在开发一个我想在某天销售的应用程序 - 早点而不是晚点!我想开发一个相当简单的序列号方案来保护它。

  • 一个简单的数字/字母组合,长度不超过25-30个字母数字字符(想想Microsoft产品密钥)
  • 不要求用户在验证中输入任何个人信息(如电子邮件地址)

我一直在想这个(很少),我认为公钥加密是一个很好的起点。我可以生成一个标识许可证的字符串(如SKU + plain ole'整数序列号),哈希,加密,并将序列号+标识符编码为25位(左右)字母数字键。然后,应用程序将密钥解码为序列号和“签名”,生成标识符散列,使用相应的公钥解密“签名”,并将其与生成的标识符散列进行比较。

基本上,产品密钥包含两个数据:用户声称拥有的序列号以及程序可用于验证声明的各种签名。我不知道25个字母数字字符(每个编码5位,实际总计120位)是否足以满足所有这些要求。但是,它不必具有加密安全性,足以使代码不易被猜测。我可以使用短键和短哈希。

就实现而言,该应用程序是用Objective-C为Mac OS X编写的,但考虑到将代码注入Cocoa应用程序是多么容易,我可能会用直接C编写验证代码。

5 个答案:

答案 0 :(得分:8)

我不会使用任何强大的加密技术,因为你必须在程序中解密它,使密钥或至少裂缝容易。

我会做以下事情 - 比如说一个25位数字。现在添加一些规则,例如:   - 数字必须可被31整除   - 它必须以最后一个字母开头和结尾  ...

始终使用这些规则生成密钥。使用20条或更多规则(越多越好)。部署应用时,请使用较少数量的规则,例如10检查密钥是否有效。 然后将这些规则反汇编并用于创建keygen。

在每次更新时启用您之前未使用过的规则之一。如果正确选择了规则,您将禁用密钥生成的大多数密钥。

答案 1 :(得分:1)

我喜欢@ bh213的方法,但是当你更新序列号规则时,它不会阻止修复密钥。

在更个人的偏好说明中,我更喜欢基于规则集方法的密钥生成器,因为如果黑客必须修补二进制文件,那么由于黑客补丁程序错误以及随之而来的战斗,您将对您的软件进行糟糕的审核在你和黑客之间。

我的偏好基于一个通用的软件真相:软件可以并且如果它足够流行就会被黑客入侵,没有方案,没有巧妙的方法可以防止这种情况发生。这场战斗是在资源有限且时间有限的开发人员与手头无限时间的黑客团队之间进行的。

您的密钥生成方案实际上只是为了让诚实的客户保持诚实 - 从应付帐款中获取支票比在密钥生成器上签名安全更容易。

答案 2 :(得分:1)

由于Redbeard 0x0A是正确的,CD-Keys将保持诚实的客户诚实。购买产品只需要比找到密钥更难。

如果您在线销售产品,那么最好的方法是给他们一个包含序列号的文件。这样,串口可能会很长,您的付费客户不必浪费时间输入序列号。

串行方案可以非常简单:

  1. 有一个很大的串行空间(25字母数字约为10 44 ,但只需使用一个串行文件,并为密钥空间10 2311 )
  2. 选择一些规则,将有效的序列号空间减少到您认为自己将在最疯狂的梦想中销售的100倍
  3. 如果您的产品有在线组件(比如游戏在线多人游戏),您可以使用加密强大的随机数生成器进一步减少有效序列号(选择基于规则的键的子集,产品使用规则检查序列,server使用final true serial list)。当您的产品从服务器请求服务时,服务器可以检查序列号。

答案 3 :(得分:0)

可以找到并破解自定义开发或基于加密的所有规则。考虑一下您为谁构建应用程序。我的许多产品都是针对企业的,所以他们要么购买,要么不购买。他们通常不会在他们的网络上运行黑客版本。无论如何,寻找keygen的人都不太可能购买您的产品。您只是想确保不会惹恼您的客户,使他们不再想要购买您的应用。

话虽这么说,我已经为我在基于AES加密的应用程序中使用的这类东西编写了一个库。我以25美元的价格出售它,它使用密码和盐来使你的序列号独一无二。如果您有兴趣,可以在此处找到它:http://simpleserials.com

答案 4 :(得分:0)

sigpipe.macromates.com上有一篇博文,解释了如何使用私钥/公钥加密来检查序列号。它可以验证用户和Serialnumber是否匹配。 (签名/验证)。我可能会添加一些盐,只是为了确定。

由于这篇文章是从2004年开始的,你应该考虑建议的密钥长度为keylength.com