使用公钥证书激活产品



我需要一些想法如何创建一个激活算法。例如,我有演示证书。提供应用程序在演示模式下运行。当提供完整版本证书时,应用程序将以完整模式运行。这是可能的吗?创造这个系统的好方法是什么?

一个简单的是,我认为只是有一个2加密的字符串,现在当解密是成功的演示公钥证书,然后应用程序将运行在演示模式等。

你可以这样做:

  1. 生成公私钥对
  2. 作为私钥的所有者,您可以签署这些"激活证书"(从现在起称为AC)
  3. 在你的应用中,使用公钥,你可以检查符号是否正确

正如Overbose所提到的——你无法阻止逆向工程。一般来说,有人可以将功能放在自己的应用程序中,从而消除任何可能的激活算法。因此,您只能假设(或使)这足够困难,不值得付出努力(这与密码学相同——当您使破解消息的成本大于获得消息的利润时,您可以说它是很安全的)。

所以你可以:

  1. 使可执行文件自验证(由您签名,基于硬编码公钥的自检(有一点:自检时必须跳过此值))
  2. 用指针做一些技巧(指向激活函数,到第7位,根据另一个指针的值改变它的值;在一些奇怪的地方,将硬编码的值更改为基于在代码的其他地方出现的一些位的值;通常——使它比简单地用十六进制编辑器改变可执行文件中的位更难以破坏)
  3. 试着做一些协议,你的服务器将使用询问有关应用程序的问题("给我你自己的293字节的值"),并检查答案。
  4. 发挥想象力,想出一些以前没人用过的奇怪的自检方法:)
如前所述,如果切断身份验证部分,这些都是不安全的。但没有什么是正确的,这可能会让黑客更难得逞。

背景:我已经部署了一个基于第三方许可系统的激活系统,即服务器,数据库,电子商务集成。我还单独编写了一个使用RSA密钥的c#激活系统,但从未部署过。

Product Activation通常意味着软件必须在给定的机器上被激活。我猜你是这个意思。如果你想做的只是有两个字符串,分别表示"demo"one_answers"purchase",那么它们将在数小时内被解密并分发出去(假设你的产品很有价值)。没有意义。

。假设您想要"激活",那么当用户购买您的软件时,需要执行以下过程:

  1. 订单履行软件告诉服务器生成"购买密钥"并发送给用户
  2. 用户在软件中输入"购买密钥"
  3. 软件发送购买密钥和唯一机器ID到服务器。
  4. 服务器将购买密钥和机器ID组合成一个字符串,并使用其证书签名并返回给用户。
  5. 软件使用服务器公钥检查签名是否有效。
  6. 软件可以在很多地方检查:在很多地方加载签名,在其他地方检查。

在生成Purchase key时,服务器不仅可以存储所购买的产品,还可以存储所购买的产品级别。你也可以有时间限制的"免费"产品,这样用户就可以在30天内试用软件的完整版本。

你正在使用c#,所以确保你混淆了二进制文件,使用dotfuscator或等效的。然而,即使有了这些,你也无法对付一个顽固的黑客。我认为,你的目标是迫使非付费用户要么自己成为黑客,要么冒险使用破解版本:孩子们不会在意,企业可能会。YMMV .

执行检查的代码需要位于需要保护的每个程序集中,否则攻击者可以通过替换执行检查的程序集轻松地删除保护。如果有必要,可以剪切和粘贴代码。

或者干脆买点东西。

另一种选择是让服务器预生成"购买密钥"并将其提供给订单履行服务,但随后您无法将密钥链接到客户详细信息(至少在他们注册之前)。最好是让电子商务服务器在用户完成购买时访问你的服务器,并让你的服务器将其发送出去。

困难的部分不是激活密钥的生成,而是创建服务器、数据库和与电子商务软件的集成,最重要的是,人为问题:您是否允许每个购买密钥无限安装?只有1 ?如果只有1,那么您必须有客户支持,并允许用户在新机器上安装它。这只是一个问题。各种各样的乐趣。

这个家伙写了一篇关于类似想法的博客文章,解释了他是如何使用他们自己的商业软件的。还写了一个关于最明显的破解技术的建议列表。希望能有所帮助。

一个简单的是,我想只是有一个2加密字符串,现在当解密成功时使用演示公共密钥证书,然后应用程序将运行在演示模式等。

可能是一个简单的解决方案。但是,这样您就不会阻止有人对您的二进制文件进行反向工程,并使执行跳转到正确的行。每个人都有你的程序,都有它的完整版本,所以唯一的问题是找到如何打破这个简单的机制。

也许更好的解决方案是加密使用完整应用程序版本所需的二进制文件的一部分,而不是一个简单的字符串。这种方式执行应用程序的完整版本,有人需要解密这些二进制文件才能执行它们。

请考虑到即使那个解决方案也是不够的。还有其他问题:

  1. 所有版本的工具将共享相同的加密密钥吗?打破其中一个打破所有…
  2. 即使您为每个发布的二进制应用程序使用不同的密钥,加密的二进制是否相同?一旦破解了一个,您就可以在所有分布式应用程序中重用未加密的二进制文件。

如何解决这些问题?没有简单的解决办法。大多数更重要的商业软件,甚至有复杂的保护系统,在发布几个小时或几天后就被破坏了。

产品激活不是非对称加密可以解决的问题。非对称密码学就是不让对手知道你的秘密。问题是,你不能把秘密存储在你的对手的机器上,这将是安全的,虽然晦涩。

产品激活的正确方法。生成存储在服务器上的数据库中的加密Nonce。当顾客购买产品时,你给他们这个Nonce,然后他们在网上激活它。这个激活过程可以下载新的材料,这将使攻击者更难以修改他们必须"解锁"新功能的副本。

但是即使DRM系统要求您在使用产品时在线。就像在《From Dust》等新游戏中发现的漏洞在发行后的几个小时内就被破坏了。

公钥加密的好处之一是您可以验证给定数据片段的来源。因此,如果您将公钥存储在您的程序集中,然后对给定的数据块(例如授权码或序列号)进行签名,那么您的程序集可以可验证地确定您是创建该数据的人,而不是黑客。实际数据本身并不那么重要——它可以是一个简单的通过/失败值。

这实际上在。net中很容易做到。您可以使用x509证书,或者像我们在deployx中使用的RSACryptoServiceProvider许可。

我强烈建议购买一个商业产品(哪个并不重要,尽管DeployLX很出色),而不是自己做这个,原因有两个

  1. 即使你是一个伟大的开发人员,你也可能第一次就犯错误。如果你从这个错误中恢复过来,你可能会享受到的任何积蓄都将付之东流。
  2. 你会花更多的时间在你自己的系统上——这些时间你应该花在让你的产品变得更好。

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

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

最新更新