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

时间:2009-05-21 10:45:11

标签: algorithm primary-key unique

我正在尝试创建一个独特的CD-KEY放入我们的产品包装盒,就像用户用来注册产品的标准软件盒中的普通CD-KEY一样。

然而,我们不销售软件,我们正在销售用于刑事和医疗目的的DNA收集套件。用户将通过邮件收到唾液收集工具包,上面有CD-KEY,他们将使用该CD-KEY在我们的网站上创建一个帐户并获得他们的结果。测试结果将与CD-KEY相关联。这是我们必须将结果与患者联系起来的唯一方式。因此,重要的是它不会失败:)

其中一个要求是CD-KEY列表必须充分“分散”,这样就不会有人输入错误的CD-KEY并且仍然可以将其批准用于其他人套件,从而混淆两个工具包。这可能会使我们承担数千美元的责任。

例如,它不能是数字的增量序列,例如
00001
00002
00003
...
原因是,如果有人收到套件00002,但偶然将其注册为000003,那么他的结果将与其他人匹配。所以它必须像信用卡号码......除非输入有效的序列,否则随机点击有效数字的几率是百万分之一......

此外,我们每年向各个提供商销售超过50,000个工具包(他们将使用我们的算法生成他们自己的CD-KEYS),因此我们无法维护所有先前发布的CD-KEYS列表以检查重复。该算法必须生成唯一的CD-KEY。

我们还要求能够使用快速检查算法验证CD-KEY是否有效,以便我们可以通知用户他输入的代码是否无效。这遗漏了许多哈希或MD5算法我相信。它不能是128位,因为谁会花时间在电脑屏幕上输出它?

到目前为止,这就是我认为最终的CD-KEY结构看起来像什么 (4个char产品代码) - (4个char经销商代码) - (12个字符唯一,可验证的CD-KEY)

防爆。 384A - GTLD - {4565 - FR54 - EDF3}


为了确保KEYS的唯一性,我可以将当​​前日期(20090521)作为来源的一部分。我们不会每周多次生成唯一键,因此这个值经常变化,以达到唯一的初始值。

我可以使用哪种算法来生成唯一键?

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我使用SeriousBit Ellipter link进行软件保护,但我没有看到任何理由让您每周都能生成一组唯一密钥,并且我们会在进入您的网站时验证密钥的有效性。您还可以将可选服务编码到密钥中,以便控制从密钥处理样本的方式(即如果您有不同的服务级别)。

因为它首先使用加密的密钥生成方法并且它相对便宜,所以我肯定值得一看。

答案 3 :(得分:1)

我最终选择了这种形式的cd-key

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

我使用了mod 11 ISBN校验和数字算法。

答案 4 :(得分:-1)

生成GUID并为其附加一个随机数。 GUID保证是唯一的,并且随机数将使得不可能意外地击中代码。只是不要以任何方式修改GUID,否则可能会损害唯一性。

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