2009-05-21 90 views
5

我试图创造一个独特的CD-KEY就摆在我们的产品中,就像在用户使用注册产品标准的软件箱子发现了一个普通的CD-KEY独特的CD-KEY生成。算法与验证

但是我们不是卖软件,我们为刑事和医疗目的销售DNA采集盒。用户将通过邮件收到唾液采集盒与它的CD-KEY,他们将使用该CD-KEY来创建我们的网站上的帐户,并得到他们的结果。测试结果将与CD-KEY相关联。这是我们必须将结果与患者联系起来的唯一方法。因此重要的是它不会失败:)

其中一个要求是,CD-KEY必须足够“分散”,以便不会有人输入错误的CD-KEY,仍然有批准为其他人套件,从而混合两个套件。这可能会让我们承担数千美元的赔偿责任。

例如,它不可能是数字的增量序列如
...
其理由是,如果有人接收到套件00002,但通过将其登记为000003事故,那么他的结果将会与其他人相匹配。因此,它必须像信用卡号码...除非输入有效的序列,你的随机打一个有效的数字机会是1百万...

此外,我们每年销售超过50000套各种供应商(他们将使用我们的算法生成他们自己的CD-KEYS),所以我们无法保存以前发布的所有CD-KEYS列表来检查重复。该算法必须生成唯一的CD-KEY。

我们还需要验证CD-KEY是有效使用快速检查算法,所以,如果他进入该代码是无效的,我们可以通知用户的能力。这留下了许多散列算法或MD5算法,我相信。它不能是128位,因为谁会花时间在电脑屏幕上输入它?

到目前为止,这是我想最后的CD-KEY结构会看起来像

(4个字符产品代码) - (4字符经销商代码) - (12字符唯一的,可验证的CD-KEY)

例如, 384A - GTLD - {4565 - FR54 - EDF3}


为了保证键的唯一性,我可以包括当前日期(20090521)作为源的一部分。我们不会每周产生一次以上的独特密钥,所以这个值经常变化足以达到独特的初始值。

什么可能的算法,我可以用它来生成唯一键?

+2

密码是不安全的,如果它的安全在于算法,它是秘密保存的。 :) – 2009-05-21 10:48:59

+0

最终的cd-key将使用带有密钥的散列类型算法进行加密。 – 2009-05-21 11:03:18

回答

6

创建的字符串<providername>000001<providername>000002等,或任何并将其与公共密钥加密,这就是你的“CD-KEY”的用户输入。使用私钥解密CD-KEY,并验证解密时是否使用有效的提供程序名称获得有效的字符串。

1

信用卡号码使用Luhn algorithm,你可能想看看类似的东西。

+0

那里的Verhoeff算法参考看起来好多了,因为它会捕捉到transpozition错误。 – JonnyBoats 2009-05-21 11:56:45

1

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

由于它首先使用了密钥生成的加密方法,而且价格相对便宜,所以我确实值得一看。

+0

感谢您的建议。我尝试了一下,我有些失望。如果我在末尾00001,00002等处更改序列号,则它返回的cd键中只有一个值被更改。 – 2009-05-21 16:51:52

-1

生成GUID并将一个随机数链接到它。 GUID保证是独一无二的,随机数字会使偶然碰到代码变得不可能。不要以任何方式修改GUID,否则可能会影响唯一性。

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

+0

-1 GUID不是加密安全的。许多实现都有确定性的部分,比如包含计算机的MAC地址。也需要互联网连接才能真正工作。 – Aron 2013-02-08 10:21:10

1

我终于尘埃落定这种形式

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

我用国防部11 ISBN校验位算法一个CD-KEY。