使用公钥证书进行产品激活

10

我需要一些关于如何创建激活算法的想法。例如,我有一个演示证书。假设应用程序在演示模式下运行。提供完整版本证书后,则应用程序以完整模式运行。 这是否可能,如何创建这个系统呢?

我想到了一个简单的方法,就是有两个加密字符串。现在当使用演示公钥证书解密成功后,应用程序将在演示模式下运行等等。


让我想起了之前回答过的一个问题:https://dev59.com/m3A75IYBdhLWcg3w-OVA#3081342 - userx
那么使用场景是什么?它保护的是哪种软件,有多大的容量,价格是多少? - jamie
@Jamie,请查看您回答下面的评论。 - hs2d
7个回答

9
你可以这样做:
  1. 生成公私钥对
  2. 作为私钥的所有者,您可以签署这些“激活证书”(从现在起称为AC)
  3. 在您的应用程序中,使用公钥,您可以检查签名是否正确
正如Overbose所提到的--你无法阻止反向工程。一般来说,有人可以将功能带入自己的应用程序中,从而消除任何可能的激活算法。因此,您只能假设(或使其)足够困难,不值得付出努力(这与加密相同--当您使破解消息的成本大于获得它的利润时,您可以说它是安全的)。
所以你可以:
  1. 使可执行文件自我验证(由您签名,基于硬编码的公钥进行自我检查(一个注意点:在自我检查时必须跳过此值))。
  2. 使用指针进行一些技巧(指向激活函数,转到第7位并更改另一个指针的值基于其值;在某些奇怪的地方将硬编码值更改为基于代码其他位置中某些位的出现的值;通常 - 使它比仅通过十六进制编辑器更难被破解)
  3. 尝试制定一些协议,您的服务器将使用该协议询问有关应用程序的问题(“给我自己的第293个字节的值”)并检查答案。
  4. 发挥想象力,想出一些奇怪的自我检查方法,以前没有人使用过 :)
正如所提到的--这些都无法防止身份验证部分被削减。但是,这可能会使破解者更加困难。

5
背景:我部署了一个基于第三方许可证系统的激活系统,包括服务器、数据库和电子商务集成。我还单独编写了一个使用RSA密钥的C#激活系统,但从未部署过。
产品激活通常意味着软件必须在给定的机器上激活。我认为这就是你的意思。如果你只想要两个意思为“演示”和“已购买”的字符串,那么它们将在几小时内被解密并分发(假设你的产品有价值)。这没有任何意义。
所以,假设你想要“激活”,那么当用户购买你的软件时,需要执行以下过程:
1. 订单履行软件告诉服务器生成“购买密钥”并发送给用户 2. 用户将“购买密钥”输入到软件中 3. 软件将购买密钥和唯一的机器ID发送到服务器。 4. 服务器将购买密钥和机器ID组合成一个字符串,并使用其证书对其进行签名,然后将其返回给用户。 5. 软件使用服务器的公钥检查签名是否有效。 6. 软件可以在许多地方检查:在许多地方加载sig,在其他地方检查它。
在生成购买密钥时,服务器可以存储不仅购买了什么产品,还购买了什么级别的产品。您还可以拥有“免费”产品,这些产品有时间限制,因此用户可以在30天内尝试软件的完整版本。
您正在使用C#,因此请确保使用dotfuscator或等效工具混淆二进制文件。但是,即使这样,您也无法对抗决心的黑客。我认为您的目标是强制非付费用户成为黑客,或者冒着使用破解版本的风险:孩子们不在意,公司可能会在意。您的情况可能会有所不同。
进行检查的代码需要在需要保护的每个程序集中,否则攻击者可以轻松地通过替换执行检查的程序集来移除保护。如果必须,可以将代码复制并粘贴。
或者只需购买某些东西。
另一个选择是让服务器预先生成“购买密钥”并将其提供给订单履行服务,但是这样你就无法将密钥与客户详细信息关联(至少在他们注册之前无法关联)。最好在购买完成后让电子商务服务器访问您的服务器,并将其发送出去。
困难的部分不是激活密钥的生成,而是服务器、数据库的创建以及与电子商务软件的集成,最重要的是人员问题:您是否允许每个购买密钥进行无限次安装?只能安装1次吗?如果只能安装1次,则必须拥有客户支持和一种允许用户在新机器上安装它的方法。这只是一个问题。各种有趣的事情。

这是一个很好的答案,但基于服务器的激活对我来说并不是一个选项。我应该在原帖中提到这一点... - hs2d
在这种情况下,预计会有一个密钥泄漏的问题。如果这是个问题,那么您可以监控盗版网站,并在每个新版本的软件中包含一份被封锁的密钥列表。使用公钥加密很好,因为这意味着攻击者无法创建 keygen 软件(除非他们黑客入侵您的计算机并获取密钥,在这种情况下所有的赌注都取消)。顺便说一句,如果您想疯狂一点,您可以使用允许撤销的验证证书。 - jamie
只是为了得到更多的想法,我在这里提到这个应用程序不会用于公众使用,它仅在非常紧密的公司团体中使用,其他任何人都无法使用。 - hs2d
你确定他们会接受定制解决方案吗?我们曾经有过几个客户(财富50强),他们需要浮动的FlexLM许可证。如果你没有这个,他们的IT人员就不会支持它,所以部门无法购买。 - jamie
1
是的,我相信他们会接受我们要实施的任何解决方案。更重要的是,在应用程序使用的环境中没有互联网连接,因此无法使用服务器进行激活。 - hs2d

3
这个人写了一篇关于类似想法的博客文章(链接),解释了他如何使用自己的商业软件。同时,他还写了一个推荐列表,列出了最常见的破解技术。希望能对您有所帮助。

1
他没有提到攻击,只需替换公钥。也许他没有提到它是因为它很容易实施,并且完全破坏了这种方法。 - rook

1
我想到的一个简单方法是使用两个加密字符串,当演示公钥证书解密成功后,应用程序将以演示模式运行等等。这可能是一个简单的解决方案。但是这样做并不能防止有人反向工程您的二进制文件,并使执行跳转到正确的行。每个人都拥有您的程序,都有完整的版本,所以只是找到如何打破这个简单机制的问题。
也许更好的解决方案是加密需要使用完整应用程序版本的二进制文件的一部分,而不是一个简单的字符串。这样,要执行应用程序的完整版本,某人需要解密这些二进制文件才能执行它们。
请注意,即使这种解决方案也不足够。还有其他问题:
1. 您的工具的所有版本是否共享相同的加密密钥?破解其中一个就可以破解所有版本。 2. 即使您为每个发布的二进制应用程序使用不同的密钥,加密的二进制文件是否相同?一旦破解了一个,您可以重复使用未加密的二进制文件来分发所有应用程序。
如何解决这些问题?没有简单的解决方案。大多数重要的商业软件即使具有复杂的保护系统,在发布几个小时或几天后也会被破解。

是的,你说得对,我知道这一点。问题是关于激活算法/系统,而不是防止它被反向工程。 - hs2d

1

产品激活不是非对称加密可以解决的问题。非对称加密只是用于防止对手获得您的秘密。问题在于,您不能保护存储在对手计算机上的秘密,那就是安全性差的做法

正确的产品激活方法是生成一个密码随机数并将其存储在服务器数据库中。客户购买产品后,您将此密码随机数交给他们,然后他们在在线激活。该激活过程可以下载新材料,这会使攻击者更难以修改其拥有的副本来“解锁”新功能。

但即使是使用需要在线验证的DRM系统,像是在新游戏《尘土》中发现的那样,也会在发布几个小时后就失效


如果有人要修改您的二进制文件,那么您是正确的(尽管下载内容很容易被捕获,因此虽然可能购买了1个许可证,但可以窃取更多)。如果没有人要修改您的二进制文件,则使用非对称加密来签名和验证产品许可证非常可靠(只要您的私钥保持机密,不分发即可)。 - userx
@userx 如果他们不打算破解您的软件,那么没人会在意它,因此这并不值得任何东西。但是如何尝试盗版软件即服务(SaaS)。破解魔兽世界并不容易,尽管甚至已经创建了盗版服务器。 - rook
抱歉,但我仍然看不懂你的观点。非对称加密在产品激活和许可方面有其作用。它能够防止所有盗版方法吗?不能。它能让你验证许可证来自于特定来源吗?可以。所有产品激活都是通过安全性保密实现的。我不同意“如果没有人破解你的软件,那么就没有人关心”的笼统说法。破解是非常行业特定的。游戏行业是一个问题,企业网络负载均衡则不是。 - userx
@userx 让我明确一点,这绝不是一个安全的系统。 - rook
@userx 问题在于商业模式依赖于完全不可能解决的事情。如果你认为你有解决方案,那么你就是个傻瓜。 - rook
显示剩余6条评论

0
公钥加密的好处之一是可以验证给定数据的来源。因此,如果您将公钥存储在程序集中,然后签署给定的数据(例如授权代码或序列号),您的程序集可以可靠地确定是您创建了该数据,而不是黑客。实际数据本身并不是非常重要-它可以是一个简单的通过/失败值。
这在.NET中实际上非常容易做到。您可以使用x509证书,或者像我们在DeployLX Licensing中使用的RSACryptoServiceProvider
我强烈建议购买商业产品(无论哪个都无所谓,尽管DeployLX非常出色),而不是自己进行此操作,原因有两个。
  1. 即使你是一位优秀的开发者,第一次可能会出错。而且,通过自己编写代码所节省的任何时间都将用于从错误中恢复过来。
  2. 你将花费更多的时间来处理自己的系统——这些时间本应该用于让你的产品更加出色。

保护软件的第二个阶段是确保它按照你创建的方式运行,并且没有被黑客修改。如果黑客可以检查 if( licensed )if( true ),那么使用什么加密都无关紧要。


-2

您可以使用AsProtect来解决这个问题。这是一个很好的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接