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

42
我想了解序列号生成器和验证器的工作原理。我的目标是生成一个由五个部分组成的仅包含数字和字母的序列号。
我喜欢编码作为一种爱好,我不会自称为专业程序员。然而,我对这些有趣的函数在技术上如何工作非常感兴趣,以扩展我的思维。
任何提示、经验或书面算法都将不胜感激。

序列号在什么情况下会被使用?它只是一个标识符还是像Windows注册密钥一样用于安全目的? - TofuBeer
2
无论你做什么,请尝试使最左边的数字非零,这样“代码”就不会被解释为数字,并在导入Excel和其他格式时消失。我发现这是我们行业中最大的问题之一,因为我们经常使用它们。我们已经学会了以1开头所有序列号。我认为最近有一个视频游戏发布了错误的序列号,他们可能遇到了这样的问题。 - Joe Phillips
6个回答

25

16

传统上,序列号就是连续的数字编号。因此,生产线上的第一个例子是 sn 0001,接下来是 0002,然后是 0003。我认为大多数人都能理解这个算法。

我想你实际上在询问产品密钥,它使用类似于公钥消息签名的机制——产品密钥是加密值,程序具有公钥,允许验证该密钥是否有效,但只有软件供应商拥有秘密密钥来“签署”产品密钥。维基百科上关于数字签名 的文章包含了一般机制;唯一的限制是,对于用户输入的密钥,它必须比 PGP 密钥要短得多。

如果你限制了非常短的序列号,那么它可能不足以存储典型签名机制的结果,在这种情况下,通常只需使用某些变体的校验和。它的缺点是易于反向工程-它的安全性在于算法是“秘密”的,而不是任何加密属性。每个产品都有自己的算法,它们通常很快就被破解了。

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


16

获取公钥/私钥对。生成具有某些识别特征(例如可被10000整除的10000、20000、30000、40000等)的序列号。使用您的私钥加密该数字。使用某种人类可读的系统(32进制64进制)对该值进行编码,并将值分组以使人们更容易解析。与每个应用程序销售一起分发编码的序列号。

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

难点在于实现-将公钥隐藏在应用程序中,以便不易被替换。选择一些您可以轻松识别但不会耗尽值的序列。混淆应用程序,使某人无法轻松跳过整个检查等...


如果您能够解密它,那么这已经保证它是由您的私钥进行数字签名的,因此无论内容是什么,只要您的解密算法能够正确解密,就没有关系。 - Stefano Borini
2
大多数解密技术都可以让你通过解密算法运行任何值。对于大多数随机输入,你只会得到随机输出。对于许多算法来说,给定一块随机数据,存在一个密钥可以将该字符串解密为任何其他字符串。 - Eclipse

5

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

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

Guids包含16个字节,通常以十六进制数字序列的形式书写,例如:

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

大多数编程语言都可以使用现有的库生成GUID。

因为GUID不是“随机”生成的,所以我给你点了个踩。它们保证是唯一的 - 不是随机的,因此不适合用作序列号。 - ine
10
“随机”一词未出现在规范中,“串行”一词却有,而且它甚至是“随机”的相反。那么你为什么要投反对票呢? - mjn
在示例中,第三组中的第一个数字(例如“1”)表示所使用的算法。版本1将包含生成实体的MAC地址,而版本4则基于伪随机数。 - sisve
2
这有什么关系吗?毕竟,一个唯一的数字和一个随机的数字一样好。OP没有指定随机的。 - Ben McIntyre

3
您可以使用随机数生成器并将输出存储在数据库中。在激活请求时,只需检查序列号是否在数据库中,并将序列号标记为“已使用”。
当然,这需要互联网连接,但它能够有效防止“一次购买,多次使用”的方法,并且在支持电话时,您可以重新激活该序列号以进行另一次重新安装。
稍后编辑:您还必须使用加密和认证连接(如HTTPS)进行互联网验证。


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