出于好奇:如何生成序列号?提示,算法?

时间:2009-04-03 19:08:49

标签: algorithm generator validation serial-number

我想知道序列号生成器和验证器如何工作。我的目标是生成一个序列号,其中包含五个部分,仅包含数字和字母。

我喜欢编码作为一种爱好,不会称自己为专业程序员。但是,我对这些有趣的功能如何在技术上起作用以扩大我的想法非常感兴趣。

赞赏任何提示,经验或书面算法。

7 个答案:

答案 0 :(得分:25)

Brandon Staggs写了一篇关于Implementing a Partial Serial Number Verification System的好文章。这些示例是用Delphi编写的,但可以转换为其他语言。

答案 1 :(得分:16)

嗯,传统上序列号是串行号码。所以关闭生产线的第一个例子是sn 0001,然后下一个是0002,下一个是0003.我认为大多数人都可以计算出算法。

我认为你实际上是在询问产品密钥,它使用类似于公钥密钥签名的机制 - 产品密钥是加密值,程序有一个公钥,允许它验证密钥是否有效,但只有软件供应商才有“签名”产品密钥的密钥。关于digital signatures的维基百科文章有一般机制;唯一的附带条件是,对于用户输入的密钥,它必须比PGP密钥短一些。

如果您被限制为一个非常短的序列号,那么它不可能足够大以存储典型签名机制的结果,在这种情况下,仅使用一些校验和变体是很常见的。这样做的缺点是容易进行逆向工程 - 它的安全性是因为算法是“秘密的”而不是由于任何加密属性。每个产品都有自己的算法,通常会很快破解。

如果您有5个5个字符的块,则您有36 ^ 25个组合,大于2 ^ 128,因此可以使用生成128位的标准数字签名算法之一,然后将该值转换为基数36 。

答案 2 :(得分:16)

给自己一个public/private key pair。生成具有一些识别特征的sequence numbers(10000,20000,30000,40000,....)(例如可被10000整除)。使用您的私钥加密该号码。使用一些人类可读的系统(base 3264)对该值进行编码,并将值分组,以便人们更容易解析。随每个应用程序的销售分发编码的序列号。

在应用中的某个位置,您隐藏了公钥。当用户输入编码的序列号时,首先将其解码回二进制。使用公钥解密它。检查它是否可以被10000整除。

困难的部分在于实现 - 将公钥隐藏在应用程序中,以便无法轻松替换。选择一些您可以轻松识别但不会耗尽值的序列。 Obfuscating该应用,以便有人不能轻易跳过整个支票。等...

答案 3 :(得分:4)

GUID(“全球唯一标识符”)可能是解决此问题的简单方法:

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

Guids包含16个字节,最常用文本作为十六进制数字序列写入,例如:

3F2504E0-4F89-11D3-9A0C-0305E82C3301

大多数编程语言都应该能够使用其中一个可用库生成GUID。

答案 4 :(得分:3)

您可以使用随机数生成器并将输出存储在数据库中。 如果是激活请求,您只需检查序列是否在数据库中并将序列标记为“已使用”。

当然,这需要互联网连接,但是反对“一次购买,多次使用”方法,如果是支持呼叫,您可以重新激活该系列以便重新安装。

稍后编辑:您还必须使用加密和经过身份验证的连接进行互联网验证,例如HTTPS连接。

答案 5 :(得分:1)

答案 6 :(得分:0)