使用公钥证书激活产品

时间:2011-08-12 12:14:04

标签: c# security certificate activation

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

一个简单的问题是我认为只有2个加密的字符串,现在当解密对于演示公钥证书很有用时,应用程序将以演示模式运行等等。

编辑:使用C#和Windows 7

7 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

  1. 生成公钥/私钥对
  2. 作为私钥的所有者,您可以签署这些“激活证书”(从现在开始称为AC)
  3. 在您的应用中,使用公钥,您可以检查标志是否正确
  4. 正如Overbose所说 - 你无法阻止逆向工程。一般来说,有人可以将功​​能放在他/她自己的应用程序中,从而消除任何可能的激活算法。所以你只能假设(或者说)这很难以不值得努力(这与加密相同 - 当你把破坏信息的成本提高到获得它的利润时你可以说它是安全得好。

    所以你可以:

    1. 进行可执行的自我验证(由您签名,基于硬编码的公钥进行自检(一件事:您必须在自检时跳过此值)。)
    2. 使用指针做一些技巧(指向激活函数,转到第7位并根据另一个指针的值更改某些内容的值;在某些奇怪的地方,将硬编码值更改为基于某些位的出现的值在代码的其他地方;通常 - 让它更难以打破,而不是简单地用十六进制编辑器更改可执行文件中的位)
    3. 尝试制作一些服务器会用来提出有关应用程序的问题的协议(“给自己293字节的价值”)并检查答案。
    4. 使用想象力并想到以前没有人使用的一些奇怪的自我检查方法:)
    5. 如前所述 - 这一切都不能确保关闭认证部分。但事实并非如此,这可能会让饼干更难。

答案 1 :(得分:5)

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

产品激活通常意味着必须在给定的计算机上激活软件。我认为这就是你的意思。如果您想要做的只有两个字符串,意思是“演示”和“购买”,那么它们将在几小时内解密和分发(假设您的产品很有价值)。没有意义。

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

  1. 订单履行软件告诉服务器生成“购买密钥”并发送给用户
  2. 用户在软件中输入“购买密钥”
  3. 软件将购买密钥和唯一的机器ID发送给服务器。
  4. 服务器将购买密钥和计算机ID组合成一个字符串,并使用其证书对其进行签名并将其返回给用户。
  5. 软件使用服务器公钥检查签名是否有效。
  6. 软件可以检查很多地方:在很多地方加载信号,在其他地方检查。
  7. 生成购买密钥时,服务器不仅可以存储购买的产品,还可以存储什么级别的产品。您还可以使用时间有限的“免费”产品,因此用户可以在30天内试用该软件的完整版本。

    您正在使用C#,因此请确保使用dotfuscator或同等程序对二进制文件进行模糊处理。然而,即便如此,你也无法对付坚定的黑客。我认为,你的目标是迫使非付费用户自己成为黑客,或者不得不冒险使用破解版本:孩子们不会关心,公司可能。 YMMV。

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

    或者只是买点东西。

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

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

答案 2 :(得分:2)

这家伙写了a blog post关于类似的想法,解释他用自己的商业软件做了什么。还写了a list of recommendations关于最明显的破解技术。希望它有所帮助。

答案 3 :(得分:1)

  

一个简单的问题是,我认为只有2加密   字符串,现在当解密对于演示公共时很有用   密钥证书然后应用程序将在演示模式等运行..

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

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

请注意即使这个解决方案还不够。还有其他问题:

  1. 您工具的所有版本是否都会共享相同的加密密钥?打破其中一个打破所有..
  2. 即使您为每个发布的二进制应用程序使用不同的密钥,加密的二进制文件是否相同?一旦破解,您就可以为所有分布式应用程序重用未加密的二进制文件。
  3. 如何解决这些问题?没有简单的解决方案。大多数具有复杂保护系统的更重要的商业软件在发布后几小时或几天就会被打破。

答案 4 :(得分:1)

产品激活不是非对称加密可以解决的问题。非对称密码学是关于保护对手的秘密。问题是你不能保守存储在你的对手机器上的秘密,那就是security though obscurity

The correct way to do product activation。是生成存储在服务器上的数据库中的Cryptographic Nonce。您在购买产品时将此Nonce提供给客户,然后在线激活它。此激活过程可能会下载新材料,这会使攻击者更难以modify the copy they have“解锁”新功能。

但即使DRM系统在使用该产品时require you to be online。就像“从尘埃”这样的新游戏中发现的那些在发布后的几小时内就会still broken

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

这实际上很容易用.NET做。您可以使用我们在DeployLX Licensing RSACryptoServiceProvider

中使用的x509证书

我强烈推荐购买商业产品(虽然DeployLX非常出色但并不重要)并且由于两个原因而没有自己这样做

  1. 即使你是一个优秀的开发者,你也可能第一次弄错了。你可能通过滚动自己所享受的任何积蓄都会因为从那个错误中恢复而失去。
  2. 您将花费更多时间在自己的系统上工作 - 这是您应该花费精力制作产品的时间。
  3. 保护软件的第二个阶段是确保它以您创建它的方式运行 - 并且未被黑客修改。如果黑客可以检查if( licensed )if( true ),您使用的加密方式无关紧要。