如何生成软件许可证密钥?


361

许可证密钥是事实上的标准,可作为反盗版措施。坦白地说,这让我感到“ 通过隐秘获得安全性”,尽管我真的不知道如何生成许可证密钥。许可证密钥生成的一个好(安全)示例是什么?他们使用什么加密原语(如果有)?它是消息摘要吗?如果是这样,它们将对哪些数据进行哈希处理?开发人员采用什么方法使破解者难以构建自己的密钥生成器?密钥生成器是如何制成的?


8
+1有趣的问题,也许答题者可以发布指向该主题的一些良好资源的链接,以供进一步阅读?请:)
雅各布(Jacob)2010年

44
所有DRM方案本质上都是模糊方案,因为程序运行所需的所有代码和数据都已提供给用户。可以随意混淆该方案,以使修补变得困难,但是可以肯定的是,可以对代码进行修补以避免任何检查。
caf 2010年

5
CD密钥确实是通过掩盖来确保安全性。有几种方法可以构建它们,但是所有方法都必须依赖于在程序中嵌入一些密钥,以验证密钥。
尼克·约翰逊

4
它们现在被称为产品密钥或许可证密钥,因为大多数使用它们的软件比CD更有可能在线交付。
Joel Coehoorn 2010年

4
我想有一天要开发一个应用程序,我不得不担心这个童年的梦想。网络应用程序只是不切实际。
Znarkus

Answers:


268

对于老式CD密钥,只需要组成一种算法即可轻松生成和验证CD密钥(可以是任何字符串),但是有效CD密钥与无效CD的比率-keys太小,以至于随机猜测CD密钥不可能使您有效。

方式不正确:

《星际争霸》和《半条命》都使用相同的校验和,其中第13位数字验证了前12位数字。因此,您可以在前12位数字中输入任何内容,然后猜测第13位数字(只有10种可能性),从而臭名昭著。1234-56789-1234

验证算法是公共的,看起来像这样:

x = 3;
for(int i = 0; i < 12; i++)
{
    x += (2 * x) ^ digit[i];
}
lastDigit = x % 10;

正确的方法

Windows XP吸收了大量信息,对其进行加密,然后将字母/数字编码贴在标签上。这样,MS既可以验证密钥,可以同时获得产品类型(家庭,专业等)。此外,它需要在线激活。
完整算法相当复杂,但是在德国出版的这篇(完全合法!)论文中对此进行了很好的概述。

当然,无论您做什么,除非您提供在线服务(例如World of Warcraft),否则任何形式的版权保护都只是一个停顿:不幸的是,如果这是有价值的游戏,那么有人会破产(或至少是规避) )的CD密钥算法以及所有其他版权保护。

真正正确的方法:

对于在线服务,生活要简单一些,因为即使使用二进制文件,您也需要通过其服务器进行身份验证才能使用它(例如,拥有一个WoW帐户)。例如,在购买游戏时间卡时使用的《魔兽世界》的CD密钥算法可能看起来像这样:

  1. 生成一个非常大的密码安全随机数。
  2. 将其存储在我们的数据库中并将其打印在卡上。

    然后,当有人输入播放卡号时,请检查该号码是否在数据库中,如果是,则将该号码与当前用户相关联,以使其永远无法使用。

对于在线服务,没有理由使用上述方案;使用其他任何东西都会导致问题


47
Mathematica有一个有趣的过程。该产品带有唯一密钥,并且安装文件会生成第二个唯一密钥(基于您的硬件)。这两个密钥都必须与您的姓名和注册信息一起以在线形式输入,然后它们根据这两个密钥向您发送真实密钥,这两个密钥实际上可以解锁软件,但仅针对该特定产品密钥和您的特定硬件。

18
嘿,我从不知道1234-56789-1234Starcraft的按键,但是我记得,通过敲击键盘并重试仅用了五分钟的时间就“验证了”了验证程序。
fmark

18
我还记得过去有一些Microsoft产品允许您将111-1111111用作有效的cdkey(Visual Studio 6.0)
hannson 2010年

25
从不知道1234-56789-1234。相反,我们使用了十三分之三!3333333333333
ErikTJ 2010年

33
在线激活的问题在于,如果/当发布商倒闭时,我们全都被搞砸了。请不要这样做。发生这种情况,甚至将来有可能发生在微软身上。
Brad 2010年

56

当我最初编写此答案时,它是基于这样一个假设,即问题与许可证密钥的“脱机”验证有关。其他大多数答案都是针对在线验证的,在线验证明显更容易处理(大多数逻辑可以在服务器端完成)。

使用脱机验证,最困难的事情是确保您可以生成大量唯一的许可证密钥,并且仍然维护一个不容易受到破坏的强大算法(例如简单的校验位)

我对数学不是很精通,但是让我吃惊的是,做到这一点的一种方法是使用绘制图的数学函数

绘制的线可以具有(如果使用足够好的频率)数千个唯一点,因此可以通过在该图上选择随机点并以某种方式编码值来生成键

在此处输入图片说明

例如,我们将绘制此图,选择四个点并将其编码为字符串“ 0,-500; 100,-300; 200,-100; 100,600”

我们将使用一个已知且固定的密钥(极其脆弱,但有其用途)对字符串进行加密,然后通过Base32转换结果字节以生成最终密钥

然后,应用程序可以逆转此过程(将base32转换为实数,解密,解码点),然后检查这些点是否在我们的秘密图中。

它的代码量很少,因此可以生成大量唯一有效的密钥

但是,由于晦涩难懂,因此非常安全。任何花时间分解代码的人都可以找到图形功能和加密密钥,然后模拟一个密钥生成器,但是它对于减缓偶然盗版可能很有用。


6
不,Erik不会。X是整数,Y是函数的下限。
约书亚

这与GPS之前的卫星导航的旧版本没有什么不同! youtube.com/watch?v=BBOsQBuCJfs
Brad

34

查看有关部分密钥验证的文章,其中涉及以下要求:

  • 许可证密钥必须足够容易键入。

  • 如果发生退款或使用信用卡被盗的情况,我们必须能够将许可密钥列入黑名单(撤销)。

  • 无需“打电话回家”来测试按键。尽管这种做法正变得越来越普遍,但作为用户我还是不满意它,因此不会要求我的用户接受它。

  • 饼干应该不可能拆卸我们发布的应用程序并从中产生有效的“密钥生成器”。这意味着我们的应用程序将无法完全测试密钥进行验证。仅其中一些密钥需要测试。此外,该应用程序的每个发行版都应测试该键的不同部分,以使基于较早发行版的假音键无法在我们的软件的较新发行版上运行。

  • 重要提示:合法用户不可能偶然输入无效的密钥,该密钥看起来可以使用,但由于印刷错误而无法在以后的版本中使用。


21

我对人们实际生成CD密钥的工作没有任何经验,但是(假设您不想走在线激活之路)这里有一些方法可以制作密钥:

  • 要求数字可以被(例如)17整除。如果您可以访问许多键,但是大多数潜在的字符串将无效,这很容易猜测。类似的要求密钥的校验和与已知值匹配。

  • 要求将键的前半部分与已知值连接时,将其散列到键的后半部分。更好,但是该程序仍然包含生成密钥以及验证密钥所需的所有信息。

  • 通过加密(使用私钥)已知值+随机数来生成密钥。这可以通过使用相应的公共密钥解密并验证已知值来验证。该程序现在具有足够的信息来验证密钥而又无法生成密钥。

这些仍然很容易受到攻击:程序仍然存在,可以对其进行修补以绕过检查。聪明的方法可能是使用第三个方法中的已知值来加密程序的一部分,而不是将值存储在程序中。这样,您必须先找到密钥的副本,然后才能对程序进行解密,但是一旦解密,它仍然很容易被复制,并且很容易让一个人获得其合法副本并使用它来使其他所有人都可以访问该软件。


9
我真的希望谁想出了“一次性使用数字”的人都不会选择Nonce作为名称,因为含糊不清的负面含义使我每次有人建议对一个数字加密时都会咯咯笑。
Ed James

2
请注意,第三个选项不适用于对称密钥密码,因为攻击者可以对纯文本进行逆向工程测试,生成可以通过的内容,然后使用(已知)密钥和(已知)密码对其进行加密。使用家用酿造密码不是解决方案,因为如果您可以自己做,那么您应该在NSA找到一份工作。
BCS 2010年

@BCS:对不起,我应该更清楚地使用公钥加密。
Andrew Aylett

对于公共密钥版本,请使用签名方案,而不是加密方案。(RSA签名看上去有点像“使用公钥加密”,但并非完全相同。还有其他没有关联加密方案的签名方案,例如DSA。)
PaŭloEbermann 2011年

公钥加密的问题是密钥(以及序列号)必须很长。如今,不难破解512位RSA密钥对。用的WinXP的键(5组,每组5个字母数字字符),其具有仅128熵的比特,但仍疼痛到输入进行比较。
finnw

17

CD-Key对于任何非联网的东西都不是很安全,因此从技术上讲,不需要安全地生成它们。如果您使用的是.net,则几乎可以使用Guid.NewGuid()。

如今,它们的主要用途是用于Multiplayer组件,服务器可以在其中验证CD密钥。为此,生成它的安全性并不重要,因为它归结为“查找传入的内容并检查是否有人正在使用它”。

话虽如此,您可能想使用一种算法来实现两个目标:

  • 有某种校验和。这样一来,您的安装程序就可以显示“密钥似乎无效”消息,仅用于检测输入错误(在安装程序中添加此类检查实际上意味着编写密钥生成器是微不足道的,因为黑客拥有了他所需的所有代码。检查并仅依靠服务器端验证会禁用该检查,这有可能惹恼您的合法客户,这些客户不知道为什么服务器不接受CD密钥,因为他们不知道错字。
  • 使用有限的字符子集。尝试键入CD密钥并猜测“这是8还是B?是1还是I?是Q还是O或0?” -通过使用非歧义字符/数字的子集,可以消除这种混乱。

话虽这么说,您仍然想要一个大的分布范围和某种随机性,以避免盗版者仅仅猜测一个有效的密钥(该密钥在您的数据库中有效,但仍在商店货架上的盒子中),并拧紧一个正巧购买该盒子的合法客户。


良好的客户服务即可轻松解决-包装箱+购买证明=锁定非法用户,授予第二用户访问权限。
alexanderpas


10

如果您并不特别关心密钥的长度,则可以使用公钥和私钥加密来进行尝试,这是一种真正可行的方法。

本质上具有某种随机数和固定签名。

例如:0001-123456789

其中0001是您的现时,123456789是您的固定签名。

然后使用私钥对此进行加密,以获取CD密钥,例如:ABCDEF9876543210

然后将公共密钥与您的应用程序一起分发。公用密钥可用于解密CD密钥“ ABCDEF9876543210”,然后验证该密钥的固定签名部分。

然后,这可以防止某人猜测Nonce 0002的CD密钥,因为他们没有私钥。

唯一的主要缺点是,使用大小为1024位的私钥/公钥时,您的CD密钥会很长。您还需要选择一个足够长时间的随机数,这样就不会对少量信息进行加密。

有利的一面是,该方法无需“激活”即可使用,您可以将电子邮件地址或被许可方名称之类的内容用作随机数。


1
请注意,我的示例严重低估了密钥的长度。这些方案通常需要base64编码和复制/粘贴部署,但几乎无法猜测与计算机无关且不需要激活的密钥(对许多类型的客户来说这很重要)
userx

3
除了使用RSA,还可以使用椭圆曲线。它们使用较短的密钥,并且块长度较小。阅读维基,似乎256位ECC是安全的,因为AES 128
萨那托斯

请注意,数字签名和“私钥加密”不是一回事。在RSA中,它们看起来很相似(尽管由于填充方案不同而不同),其他签名方案甚至都没有相应的加密方案。
圣保罗Ebermann

@ xanatos,256位仍然太长,无法手动输入。考虑WinXP使用的25个字符的密钥-它们只有128位的熵。
finnw 2012年

1
@Mark-签名通常只是加密的哈希。您可以使用加密或签名,我的方法也一样。您只是在尝试创建一个许可证密钥,如果没有私钥就很难生成许可证密钥,并且可以通过公钥进行验证。这可以是加密的整个邮件(可以验证其内容的一部分是否与某些魔术匹配),也可以只是签名的邮件(可以验证签名是否有效)。这取决于您的实现。
userx 2014年

9

密钥系统必须具有几个属性:

  • 很少的键必须是有效的
  • 即使给出了用户拥有的所有内容,也不能衍生出有效的密钥。
  • 一个系统上的有效密钥不是另一个系统上的有效密钥。
  • 其他

一种应该为您提供这些解决方案的方法是使用公共密钥签名方案。从“系统散列”开始(例如,在任何已分类的NIC上获取macs,将CPU-ID信息以及其他内容组合在一起,并把结果合并为MD5(您确实不希望成为处理您的个人身份信息(如果不需要)))附加CD的序列号并拒绝启动,除非某些注册表项(或某些数据文件)具有该Blob的有效签名。用户通过将Blob发送给您来激活程序,然后您将签名发回。

潜在的问题包括您提供几乎任何内容的签名,因此您需要假设有人将运行选定的纯文本和/或选定的密文攻击。可以通过检查提供的序列号并拒绝处理来自无效序列号的请求以及拒绝在一定间隔(例如每年2次)中拒绝处理来自给定s / n的给定数量的查询来缓解这种情况。

我应该指出一些事情:首先,熟练而果断的攻击者将能够绕过他们无限制访问的部分( CD上的所有内容)的所有安全性,您可以做的最好的事情是使得获得非法访问权比获得合法访问权更加困难。第二,我不是专家,因此该提议的方案可能存在严重的缺陷。


1

也有DRM行为将多个步骤合并到流程中。最著名的示例之一是Adobe用来验证其Creative Suite安装的方法之一。使用此处讨论的传统CD Key方法,然后调用Adobe的支持热线。CD密钥已提供给Adobe代表,它们会返回一个供用户使用的激活号。

但是,尽管分解为多个步骤,但仍与正常过程中使用的裂化方法相同。很快发现了用于创建对照原始CD密钥进行检查的激活密钥的过程,并制造了包含两个密钥的生成器。

但是,这种方法仍然存在,它是没有Internet连接的用户验证产品的一种方法。展望未来,很容易看到随着互联网的普及,这些方法将被淘汰。


1

所有CD仅有的复制保护算法使诚实的用户感到不便,同时也没有提供任何防止盗版的保护。

“海盗”只需要访问一个合法的CD及其访问代码,他就可以制作n个副本并将其分发。

编写代码的密码安全性无关紧要,您需要以纯文本格式将其提供给CD,否则合法用户无法激活该软件。

大多数安全方案涉及用户向软件供应商提供将运行该软件的计算机的某些详细信息(cpu序列号,mac地址,ip地址等),或者要求在线访问以在供应商网站上注册该软件,以及作为回报,获得激活令牌。第一个选项需要大量的手动管理,并且仅对于非常有价值的软件而言才值得,第二个选项可能会被欺骗,并且如果您的网络访问受限或被防火墙挡住,那肯定会令人发指。

总体而言,与客户建立信任关系要容易得多!


0

您可以使用(https://www.nuget.org/packages/SystemSoulLicense/)在您的软件项目中非常轻松地使用和实现安全许可API ,(您需要下载桌面应用程序才能从中创建安全许可 https:/ /www.systemsoulsoftwares.com/ 1.基于系统硬件(CPU,主板,硬盘驱动器)为客户端软件创建唯一的UID(UID充当该唯一系统的私钥)2.允许非常轻松地将加密的许可证字符串发送到客户端系统,并验证许可证字符串并且仅在该特定系统3上工作。此方法允许软件开发人员或公司存储有关软件/开发人员/发行者服务/功能/客户端4的更多信息。它提供了锁定和解锁客户端软件功能的控制权,从而节省了开发人员的时间为具有相同功能的同一软件提供更多版本5.可以在任何天数之内处理试用版6.通过在注册过程中在线检查DateTime来保护许可证时间轴7.将所有硬件信息解锁给开发人员8。它具有所有预构建和自定义功能,开发人员可以在许可的每个过程中访问它们,以制作更复杂的安全代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.