在软件分发过程中,授权密钥是验证用户合法性的重要手段。它通常包含产品信息、客户信息和版本信息等。本文将介绍如何设计和实现一个授权密钥生成程序,以及如何使用该程序来控制软件的功能。
授权密钥的生成方法多种多样,本文将展示其中一种方法。其他生成授权密钥的网站如SP extreme或Open License也提供了类似的服务。
授权密钥可以基于10进制或16进制整数数据集创建。大多数密钥都是基于16进制的数字。授权密钥模板是一个字符串,它定义了在创建和解码密钥时将执行的操作。有两种类型的模板:字节和位。字节用于不需要大量字段和数据编码的简单密钥。位用于将有更多字段且编码更难解读的情况。当前版本要求所有字段都在字节边界上,因此更容易解读结果。下一版本将不对齐字节边界,因此更难解读。密钥模板有两个默认定义的字符。'x'字符表示填充或随机数。'c'字符定义校验和字符。这两个字符是唯一保留的。
模板:xxxxxxxx-xx-xxxxxxxx-xx
生成的密钥:69658998-12-12031517-23
模板:xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx
生成的密钥:BC017-06777-14871-160C4
通过这个库,可以定义想要替换的标记,例如产品编号、版本号、序列号或用户计数。
生成一个没有标记、使用10进制数、使用字节定义模板的授权密钥:
GenerateKey gkey;
gkey = new GenerateKey();
gkey.LicenseTemplate = "xxxxxxxx-xxxx-xxxxxxxx-xxxx";
gkey.MaxTokens = 0;
gkey.UseBase10 = true;
gkey.UseBytes = true;
gkey.CreateKey();
finalkey = gkey.GetLicenseKey();
生成一个有两个标记的授权密钥,第一个标记设置版本为1,第二个标记设置产品为2。它还使用十六进制数和位定义模板:
GenerateKey gkey;
gkey = new GenerateKey();
gkey.LicenseTemplate =
"vvvvppppxxxxxxxxxxxx" +
"-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx" +
"-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx";
gkey.MaxTokens = 2;
gkey.AddToken(0, "v", LicenseKey.GenerateKey.TokenTypes.NUMBER, "1");
gkey.AddToken(1, "p", LicenseKey.GenerateKey.TokenTypes.NUMBER, "2");
gkey.UseBase10 = false;
gkey.UseBytes = false;
gkey.CreateKey();
finalkey = gkey.GetLicenseKey();
标记类型有NUMBER、CHARACTER和DATE。在NUnit中,NUMBER和CHARACTER类型被广泛使用。DATE类型尚未完成,但将在以后完成。目前还不确定是否需要DATE,因为NUMBER已经可用。最初认为DATE可能有价值是因为它可能比仅使用数字更紧凑。
为了支持授权密钥生成,不得不编写一些额外的类,包括随机数生成器、数据类型解析器、数字显示类和校验和类。
随机数类使用C#的Random类,但添加了一些额外的方法来支持需求。这些方法是:
校验和类使用基本的校验和算法。可以通过添加算法和枚举类型来简单地添加更先进的算法。这些方法是:
由于授权密钥可以有多种变体,使用NUnit进行了所有的单元测试。NUnit的另一个优势是,如果在某个区域进行了修复,也可以确保没有破坏其他区域。由于密钥使用随机数,在许多测试中迭代了三十次以确保数字匹配。作为测试的一部分,还解码了相同的密钥以确保编码的值与解码的值相同。
当打开解决方案时,会注意到有三个项目。一个是库,这样当它构建时任何人都可以使用它。第二个是交互式测试程序,这样就可以测试单个授权密钥和标记。第三个是NUnit项目,这样就可以添加、运行和调试单元测试。