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

我想知道序列号生成器和validation器是如何工作的。 我的目标是生成一个只有数字和字母组成的序列号。

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

任何提示,经验或书面algorithm表示赞赏。

Brandon Staggs写了一篇关于实施部分序列号validation系统的好文章。 这些示例用Delphi编写,但可以转换成其他语言。

那么,传统的序列号是序列号。 所以生产线上的第一个例子是0001,那么下一个是0002,下一个是0003.我想大多数人可以算出这个algorithm。

我想你实际上是在询问有关产品密钥的问题,它们使用与公钥消息签名类似的机制 – 产品密钥是encryption的值,程序有一个公钥,它允许validation密钥是否有效,但只有软件供应商拥有“签名”产品密钥的秘密密钥。 维基百科关于数字签名的文章有一般的机制; 唯一的限制是,对于用户input的密钥,它必须比PGP更短一些。

如果限制在一个非常短的序列号上,那么存储一个典型的签名机制的结果是不太可能的,在这种情况下,通常只使用一些校验和的变体。 这有一个容易反向工程的缺点 – 它的安全性是因为algorithm是“秘密的”,而不是由于任何encryption属性。 每个产品都有自己的algorithm,通常很快就会破解。

如果你有5个字符的块,你有36 ^ 25的组合,大于2 ^ 128,所以可以使用标准的数字签名algorithm之一产生一个128位,然后将该值转换为基数36。

得到一个公/私钥对 。 生成序列号 (10000,20000,30000,40000,…),它们具有一些识别特征(例如可以被10000整除)。 使用您的私钥encryption该号码。 使用某些人类可读的系统( 基本32或64 )对该值进行编码,并将这些值分成组,以便人们更容易进行分析。 分配编码的序列号与您的每个应用程序的销售。

在应用程序的某个地方,您将公钥隐藏起来。 当用户input编码的序列号时,首先将其解码为二进制。 使用公钥解密。 检查它可以被10000整除。

困难的部分是在实施 – 隐藏在应用程序中的公钥,使其不能轻易更换。 select一些你可以很容易地识别的序列,但是不能耗尽价值。 混淆应用程序,以便有人不能轻易地跳过整个检查。 等等…

您可以使用随机数生成器并将输出存储在数据库中。 在激活请求的情况下,您只需检查串行是否在数据库中,并将串行标记为“已使用”。

当然,这需要一个互联网连接,但是对于“买一次,多次使用”的方法很好,而且在支持呼叫的情况下,你可以重新激活那个串口重新安装。

稍后编辑:您还必须使用encryption和身份validation连接(如HTTPS)来进行Internetvalidation。

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

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

Guids包含16个字节,最常用的是hex数字序列,如:

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

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