许可证密钥是事实上的标准,可作为反盗版措施。坦白地说,这让我感到“ 通过隐秘获得安全性”,尽管我真的不知道如何生成许可证密钥。许可证密钥生成的一个好(安全)示例是什么?他们使用什么加密原语(如果有)?它是消息摘要吗?如果是这样,它们将对哪些数据进行哈希处理?开发人员采用什么方法使破解者难以构建自己的密钥生成器?密钥生成器是如何制成的?
许可证密钥是事实上的标准,可作为反盗版措施。坦白地说,这让我感到“ 通过隐秘获得安全性”,尽管我真的不知道如何生成许可证密钥。许可证密钥生成的一个好(安全)示例是什么?他们使用什么加密原语(如果有)?它是消息摘要吗?如果是这样,它们将对哪些数据进行哈希处理?开发人员采用什么方法使破解者难以构建自己的密钥生成器?密钥生成器是如何制成的?
Answers:
对于老式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密钥算法可能看起来像这样:
- 生成一个非常大的密码安全随机数。
- 将其存储在我们的数据库中并将其打印在卡上。
然后,当有人输入播放卡号时,请检查该号码是否在数据库中,如果是,则将该号码与当前用户相关联,以使其永远无法使用。
对于在线服务,没有理由不使用上述方案;使用其他任何东西都会导致问题。
1234-56789-1234
Starcraft的按键,但是我记得,通过敲击键盘并重试仅用了五分钟的时间就“验证了”了验证程序。
当我最初编写此答案时,它是基于这样一个假设,即问题与许可证密钥的“脱机”验证有关。其他大多数答案都是针对在线验证的,在线验证明显更容易处理(大多数逻辑可以在服务器端完成)。
使用脱机验证,最困难的事情是确保您可以生成大量唯一的许可证密钥,并且仍然维护一个不容易受到破坏的强大算法(例如简单的校验位)
我对数学不是很精通,但是让我吃惊的是,做到这一点的一种方法是使用绘制图的数学函数
绘制的线可以具有(如果使用足够好的频率)数千个唯一点,因此可以通过在该图上选择随机点并以某种方式编码值来生成键
例如,我们将绘制此图,选择四个点并将其编码为字符串“ 0,-500; 100,-300; 200,-100; 100,600”
我们将使用一个已知且固定的密钥(极其脆弱,但有其用途)对字符串进行加密,然后通过Base32转换结果字节以生成最终密钥
然后,应用程序可以逆转此过程(将base32转换为实数,解密,解码点),然后检查这些点是否在我们的秘密图中。
它的代码量很少,因此可以生成大量唯一有效的密钥
但是,由于晦涩难懂,因此非常安全。任何花时间分解代码的人都可以找到图形功能和加密密钥,然后模拟一个密钥生成器,但是它对于减缓偶然盗版可能很有用。
查看有关部分密钥验证的文章,其中涉及以下要求:
许可证密钥必须足够容易键入。
如果发生退款或使用信用卡被盗的情况,我们必须能够将许可密钥列入黑名单(撤销)。
无需“打电话回家”来测试按键。尽管这种做法正变得越来越普遍,但作为用户我还是不满意它,因此不会要求我的用户接受它。
饼干应该不可能拆卸我们发布的应用程序并从中产生有效的“密钥生成器”。这意味着我们的应用程序将无法完全测试密钥进行验证。仅其中一些密钥需要测试。此外,该应用程序的每个发行版都应测试该键的不同部分,以使基于较早发行版的假音键无法在我们的软件的较新发行版上运行。
重要提示:合法用户不可能偶然输入无效的密钥,该密钥看起来可以使用,但由于印刷错误而无法在以后的版本中使用。
我对人们实际生成CD密钥的工作没有任何经验,但是(假设您不想走在线激活之路)这里有一些方法可以制作密钥:
要求数字可以被(例如)17整除。如果您可以访问许多键,但是大多数潜在的字符串将无效,这很容易猜测。类似的要求密钥的校验和与已知值匹配。
要求将键的前半部分与已知值连接时,将其散列到键的后半部分。更好,但是该程序仍然包含生成密钥以及验证密钥所需的所有信息。
通过加密(使用私钥)已知值+随机数来生成密钥。这可以通过使用相应的公共密钥解密并验证已知值来验证。该程序现在具有足够的信息来验证密钥而又无法生成密钥。
这些仍然很容易受到攻击:程序仍然存在,可以对其进行修补以绕过检查。聪明的方法可能是使用第三个方法中的已知值来加密程序的一部分,而不是将值存储在程序中。这样,您必须先找到密钥的副本,然后才能对程序进行解密,但是一旦解密,它仍然很容易被复制,并且很容易让一个人获得其合法副本并使用它来使其他所有人都可以访问该软件。
CD-Key对于任何非联网的东西都不是很安全,因此从技术上讲,不需要安全地生成它们。如果您使用的是.net,则几乎可以使用Guid.NewGuid()。
如今,它们的主要用途是用于Multiplayer组件,服务器可以在其中验证CD密钥。为此,生成它的安全性并不重要,因为它归结为“查找传入的内容并检查是否有人正在使用它”。
话虽如此,您可能想使用一种算法来实现两个目标:
话虽这么说,您仍然想要一个大的分布范围和某种随机性,以避免盗版者仅仅猜测一个有效的密钥(该密钥在您的数据库中有效,但仍在商店货架上的盒子中),并拧紧一个正巧购买该盒子的合法客户。
如果您并不特别关心密钥的长度,则可以使用公钥和私钥加密来进行尝试,这是一种真正可行的方法。
本质上具有某种随机数和固定签名。
例如:0001-123456789
其中0001是您的现时,123456789是您的固定签名。
然后使用私钥对此进行加密,以获取CD密钥,例如:ABCDEF9876543210
然后将公共密钥与您的应用程序一起分发。公用密钥可用于解密CD密钥“ ABCDEF9876543210”,然后验证该密钥的固定签名部分。
然后,这可以防止某人猜测Nonce 0002的CD密钥,因为他们没有私钥。
唯一的主要缺点是,使用大小为1024位的私钥/公钥时,您的CD密钥会很长。您还需要选择一个足够长时间的随机数,这样就不会对少量信息进行加密。
有利的一面是,该方法无需“激活”即可使用,您可以将电子邮件地址或被许可方名称之类的内容用作随机数。
密钥系统必须具有几个属性:
一种应该为您提供这些解决方案的方法是使用公共密钥签名方案。从“系统散列”开始(例如,在任何已分类的NIC上获取macs,将CPU-ID信息以及其他内容组合在一起,并把结果合并为MD5(您确实不希望成为处理您的个人身份信息(如果不需要)))附加CD的序列号并拒绝启动,除非某些注册表项(或某些数据文件)具有该Blob的有效签名。用户通过将Blob发送给您来激活程序,然后您将签名发回。
潜在的问题包括您提供几乎任何内容的签名,因此您需要假设有人将运行选定的纯文本和/或选定的密文攻击。可以通过检查提供的序列号并拒绝处理来自无效序列号的请求以及拒绝在一定间隔(例如每年2次)中拒绝处理来自给定s / n的给定数量的查询来缓解这种情况。
我应该指出一些事情:首先,熟练而果断的攻击者将能够绕过他们无限制访问的部分(即 CD上的所有内容)的所有安全性,您可以做的最好的事情是使得获得非法访问权比获得合法访问权更加困难。第二,我不是专家,因此该提议的方案可能存在严重的缺陷。
所有CD仅有的复制保护算法使诚实的用户感到不便,同时也没有提供任何防止盗版的保护。
“海盗”只需要访问一个合法的CD及其访问代码,他就可以制作n个副本并将其分发。
编写代码的密码安全性无关紧要,您需要以纯文本格式将其提供给CD,否则合法用户无法激活该软件。
大多数安全方案涉及用户向软件供应商提供将运行该软件的计算机的某些详细信息(cpu序列号,mac地址,ip地址等),或者要求在线访问以在供应商网站上注册该软件,以及作为回报,获得激活令牌。第一个选项需要大量的手动管理,并且仅对于非常有价值的软件而言才值得,第二个选项可能会被欺骗,并且如果您的网络访问受限或被防火墙挡住,那肯定会令人发指。
总体而言,与客户建立信任关系要容易得多!
您可以使用(https://www.nuget.org/packages/SystemSoulLicense/)在您的软件项目中非常轻松地使用和实现安全许可API ,(您需要下载桌面应用程序才能从中创建安全许可 https:/ /www.systemsoulsoftwares.com/) 1.基于系统硬件(CPU,主板,硬盘驱动器)为客户端软件创建唯一的UID(UID充当该唯一系统的私钥)2.允许非常轻松地将加密的许可证字符串发送到客户端系统,并验证许可证字符串并且仅在该特定系统3上工作。此方法允许软件开发人员或公司存储有关软件/开发人员/发行者服务/功能/客户端4的更多信息。它提供了锁定和解锁客户端软件功能的控制权,从而节省了开发人员的时间为具有相同功能的同一软件提供更多版本5.可以在任何天数之内处理试用版6.通过在注册过程中在线检查DateTime来保护许可证时间轴7.将所有硬件信息解锁给开发人员8。它具有所有预构建和自定义功能,开发人员可以在许可的每个过程中访问它们,以制作更复杂的安全代码