生成并验证唯一CD-KEY的算法

5
我正在尝试创建一个唯一的CD-KEY,放在我们产品的盒子里,就像标准软件盒子中找到的普通CD-KEY一样,用户用它来注册产品。
然而,我们并不销售软件,我们销售用于犯罪和医疗目的的DNA采集套装。用户将通过邮寄收到一份唾液采集套装,其中包含CD-KEY,他们将使用该CD-KEY在我们的网站上创建帐户并获取结果。测试结果将与CD-KEY相关联。这是我们将结果与患者关联的唯一方法。因此,它非常重要,不能出错:)
其中一个要求是,CD-KEY列表必须足够“分散”,以便没有人输入不正确的CD-KEY并仍然被批准为其他套装,从而混淆两个套装。这可能会给我们造成数千美元的责任。
例如,它不能是数字的递增序列,例如
00001
00002
00003
...
原因是如果有人收到00002套装,但意外地将其注册为000003,则他的结果将与其他人匹配。所以它必须像信用卡号码一样......除非输入有效序列,否则随机命中有效号码的机会是100万分之一......
此外,我们每年向各种供应商销售超过50,000个套装(他们将使用我们的算法生成自己的CD-KEYS),因此我们无法维护所有先前发出的CD-KEYS列表以检查重复。该算法必须生成唯一的CD-KEYS。
我们还需要能够使用快速检查算法验证CD-KEY是否有效,以便我们可以通知用户输入的代码是否无效。我认为这排除了许多哈希或MD5算法。它也不能是128位,因为谁会花时间在计算机屏幕上输入它呢?
到目前为止,这就是我认为最终CD-KEY结构将如何

(4个字符的产品代码) - (4个字符的经销商代码) - (12个字符的独特、可验证的CD-KEY)

例:384A - GTLD - {4565 - FR54 - EDF3}

为确保KEYS的唯一性,我可以将当前日期(20090521)作为源的一部分。我们不会生成超过一周的唯一密钥,因此该值足够经常更改以实现唯一初始值的目的。
我可以使用什么可能的算法来生成唯一密钥?

2
密码学是不安全的,如果它的安全性仅仅依赖于保密的算法。 :) - Arnis Lapsa
最终的CD密钥将使用一种哈希类型算法和秘密密钥进行加密。 - Anon21
5个回答

7
创建字符串<providername>000001<providername>000002等等,并使用公钥加密它们,这就是用户输入的“CD-KEY”。使用私钥解密CD-KEY并验证解密后是否得到一个有效的字符串和有效的提供商名称。

你是不是指使用私钥加密,公钥解密呢? - Cam
不,他使用这些术语是正确的。对于他的目的,只要他使用另一个密钥来进行加密,他就可以使用私钥或公钥来进行加密。在使用公钥/私钥时,如果其中一个操作(加密/解密)需要由一组人执行,则使用公钥进行该操作。这就是名称的来源。在这种情况下,使用哪个并不重要。 - Walter

1

我最终选择了这种形式的CD密钥

<TIMESTAMP>-<incremented number>-<8 char MD5 hash>-<checksumdigit>

我使用了模11 ISBN校验位算法。


1
信用卡号码使用Luhn算法,您可能希望查看类似的内容。

Verhoeff算法的参考文献看起来更好,因为它可以捕捉到置换错误。 - JonnyBoats

1

我使用SeriousBit Ellipter 链接来进行软件保护,但我认为你完全可以每周生成一组唯一的密钥,并使用该库验证输入网站时密钥的有效性。您还可以将可选服务编码到密钥中,以控制如何从密钥处理样本(如果您有不同的服务级别)。

由于它首先使用加密方法生成密钥,而且相对便宜,所以我认为一定值得一试。


谢谢你的建议。我尝试了这种方法,但有点失望。如果我改变序列号结尾的 00001、00002 等,它返回的 CD 密钥里只有一个值被更改。 - Anon21

-1
生成GUID并将一个随机数与其拼接起来。GUID保证是唯一的,而随机数会使得意外命中代码变得不太可能。只要不以任何方式修改GUID,否则可能会危及其独特性。

http://msdn.microsoft.com/en-us/library/aa475087.aspx


-1 GUID不是密码学安全的。许多实现都具有确定性部分,例如包括计算机的MAC地址。此外,它需要实际的互联网连接才能工作。 - Aron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接