如何为您的软件生成( 和验证) CD 密钥






4.22/5 (30投票s)
一个如何实现和验证非个人 CD 密钥的示例(
警告 警告 警告:
此实现存在一个缺陷:请勿使用内置的 .Net Random 类,因为它可能会根据您安装的 .Net 版本而改变!请查找安全的第三方随机数生成器以获得更可靠的结果。
注意:Code(B)lock 是我构思的一个虚构的代号,任何对现有公司或产品的提及纯属巧合。

介绍
本文的目的是提供有关如何在您的软件中实现 CD 密钥系统的示例。我目前已全部用 VB.NET 完成,但稍后也会在此处提供 C# 示例。
举个例子,这是我的小生成器生成的六个密钥
VRW2Z-S4AUU-SNQN1-C2DYA-BFOML
2B49S-120SK-8AZR6-RH4SX-ALXDS
ON7R2-NAAN6-NMX5B-5FGO6-5FBQO
QS8ND-G0W76-BTSQO-WAAJA-6LCD3
KOPV3-400IV-AXQ46-BQBEJ-O1IQN
D8TVZ-80AGU-6T2QA-FCZJV-1GXFE
背景
反盗版是任何商业软件设计周期的重要组成部分。我不会讨论您应该做什么和不应该做什么(这在另一篇精彩的文章《盗版与非常规智慧》中已有介绍),而是演示一种不显眼但有效的系统,通过 CD 分发受保护的软件。请注意,如果您的用户正在下载应用程序,此系统不是最佳选择:在这种情况下,带有签名的 XML 许可证或基于激活的许可证是更好的选择。
理论
每个密钥都从 0 到 60466175 之间的随机数生成。这意味着有 60466176 个唯一代码!选择这个数字是因为它恰好是 36^5:如果您有五个字符,可以是 A-Z 或 0-9 中的任意一个,这是可能性最大的数字。在使用这个密钥后,我创建了一个基数 36 的转换系统(您可能知道它的近亲,十六进制(例如 #FFCC00)或八进制)。我在这里不讨论基数或我如何进行转换,但如果您有兴趣,可以查看演示源码。
生成的数字(从现在开始我称之为“密钥”)然后转换为基数 36(例如,14624617 变为“8PGFD”),然后作为序列代码的前五个字符。这样,如果我们知道开头的密钥,就可以验证和/或重建代码。
非随机随机数(整数)
如果您以前在应用程序中使用过随机数,您可能会像这样使用:
Dim Pickle as New Random
Dim rnd as Integer
rnd = Pickle.Next(0,9)
但您可能没有意识到,这相当于
Dim gherkin as New Random(TruelyRandomNumber)
Dim rnd as Integer
rnd = gherkin.Next(0,9)
你看,当你使用……
Dim r as new Random(Integer)
……它用一个种子对其进行初始化,这意味着如果您按照完全相同的顺序执行完全相同的步骤,您将得到**完全相同**(非随机)的结果。
因此,这就是我们确认和生成序列号的方法:我们获取密钥,用它来初始化随机数生成器,然后将其放入序列号(或检查时的正则表达式)中。然后,其余的序列号是使用从密钥生成的随机数以及我们接下来讨论的数组生成的。
数组与你
这些数组是此保护系统中最强大的部分之一。这个想法来自一种称为“部分密钥验证”的特定密钥验证方法。(它曾经有一个维基百科页面,但现在没有了)。部分密钥验证的理论是它只验证(正如您所料),密钥的一部分。例如,您可以使用正则表达式来验证密钥,如下所示
Code:
G9QT1-P31UN-K2MB9-J3DE5-2UCTO
Validating String:
G9QT1-P...N-.....-...E.-2....
Also termed as correct:
G9QT1-PLXMN-HAHAH-AHAES-2IEVE
您可能会觉得奇怪,并认为它像筛子一样工作,但最终都会奏效:例如,如果您验证五个字符,那么黑客仍然必须正确输入 10 个字符:前五个(密钥)和另外五个。这意味着他们有 1/36^10(1/3656158440062976)的机会输入一个有效的密钥。这有效地消除了暴力破解方法。而且,如果您让程序暂停大约两秒钟(甚至更好,每次尝试花费更长的时间),暴力破解尝试就会变成可笑的笑话。
但您可能仍然想知道它的真正意义。为什么只验证几个字符?
黑客(小偷)怎么想
黑客是如何盗版您的软件的?这取决于:如果您没有混淆/引导或以其他方式保护您的 .NET 应用程序,他们可以简单地反编译源代码并构建一个密钥生成器。糟糕。但如果您采取了这些预防措施,他们通常会被迫检查您程序的每一个字节(必要时在运行时)。糟糕!现在黑客不一定懒惰,但他们(通常)也不笨。如果构建一个有效的密钥生成器太难,他们会直接创建一个补丁来删除您的检查代码。不幸的是,**没有真正的方法可以防止这种情况**。如果您不相信我,请看看有多少针对各种 Windows 版本的补丁删除了激活。然而,在这种情况下(不是 Windows 的情况),他们必须为您的每个程序版本创建一个新补丁。这就是我们的目标。毕竟,正如我之前链接的那个页面所说,反盗版的目的是让购买您的程序比盗版更容易。
现在,将这一点与数组联系起来:假设一个黑客找到了您的检查代码并对其进行了逆向工程。太好了,他们现在有了一个密钥生成器。这是您最不希望发生的事情,因为它使盗版比购买更容易。那么,当这种情况发生时,我们会怎么做?答案是,我们循环或添加数组进行检查。如果您添加一个数组,生成有效密钥的机会现在变为 1/36。两个数组?1/1296。您明白了。所以,如果您添加两个数组,那么购买仍然比盗版更容易!黑客可能会去构建一个更晚期的密钥生成器,然后循环继续。希望,当您用完数组时(请记住为自己/您的网站保留 2 或 3 个!!!),您应该已经更新到另一个付费版本,该版本将使用不同的密钥。有道理吗?这就是部分密钥验证的本质。
Using the Code
如果您想使用此代码,只需获取演示项目的源码,然后复制,但请确保更改数组!
您还想尝试做一些不同的事情。例如
- 使用模运算 (Mod) 将您的“密钥”分成五个(五个字符的)块,使其不那么明显。
- 反转用作密钥的数字。
- 还有更多(我不会提及,这样它们对您的程序来说是独特的)
但主要思想是,它越独特,对您就越好。
关注点
您确实需要非常小心地使用此代码:在基数 36 系统下,您最终会(最终)生成以脏话开头的序列代码:您可能需要删除大约 200 个可能的代码。但这实际上不会有什么影响,因为它只会将最大值降低到大约 60465900 左右,这应该(希望)足够了。
历史
- 2009 年 4 月 5 日 - v1.0 - 第一版