使用公钥证书激活产品

Posted

技术标签:

【中文标题】使用公钥证书激活产品【英文标题】:Product activation with public key certificate 【发布时间】:2011-10-25 18:38:43 【问题描述】:

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

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

编辑:使用 C# 和 Windows 7

【问题讨论】:

让我想起了我对上一个问题的回答之一:***.com/questions/3002067/… 那么用例是什么?它保护什么样的软件,什么样的体积,什么样的价格? @jamie,请参阅您的答案下方的评论。 【参考方案1】:

你可以这样做:

    生成公钥/私钥对 作为私钥的所有者,您可以签署那些“激活证书”(从现在起称为 AC) 在您的应用中,使用公钥,您可以检查签名是否正确

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

所以你可以:

    使可执行的自我验证(由您签名,基于硬编码的公钥进行自我检查(一件事:自我检查时必须跳过此值))。 用指针做一些技巧(指向激活函数,转到第 7 位并根据另一个指针的值更改它的值;在一些奇怪的地方将硬编码值更改为基于某些位出现的值在代码的其他地方;通常——比使用十六进制编辑器简单地更改可执行文件中的位更难破解) 尝试制定一些协议,供您的服务器用来询问有关应用程序的问题(“给你 293 字节的值”)并检查答案。 发挥想象力,想想一些以前没人用过的奇怪的自检方法:)

如前所述 - 切断身份验证部分没有任何安全性。但什么都不是,这可能会让饼干更难。

【讨论】:

【参考方案2】:

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

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

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

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

在生成购买密钥时,服务器不仅可以存储购买的产品,还可以存储产品的级别。您还可以拥有有时间限制的“免费”产品,因此用户可以试用该软件的完整版 30 天。

您使用的是 C#,因此请确保使用 dotfuscator 或等效工具对二进制文件进行模糊处理。但是,即使这样,您也无法对抗坚定的黑客。我认为,您的目标是迫使非付费用户自己成为黑客,或者不得不冒险使用破解版:孩子们不会在意,公司可能会。 YMMV。

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

或者只是买点东西。

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

难点与其说是激活密钥的生成,不如说是创建服务器、数据库以及与电子商务软件的集成,最重要的是人为问题:您是否允许每次安装无限次?购买钥匙?只有1个?如果只有 1 个,那么您必须拥有客户支持和一种允许用户将其安装在新机器上的方法。这只是一个问题。各种好玩。

【讨论】:

这是一个很好的答案,但创建基于服务器的激活对我来说不是一个选项。我应该在我原来的帖子中提到这一点...... 那么在这种情况下,预计密钥会被泄露。如果这是一个问题,那么您可以监控warez 站点并在每个新版本的软件中包含一个被阻止密钥的列表。使用 pubkey 加密很好,因为这意味着攻击者无法创建 keygen 软件(除非他们破解您的计算机并获取密钥,在这种情况下,所有赌注都没有了)。关于这一点,如果你想发疯,你可以使用允许撤销的经过验证的证书。 只是为了获得更多想法,我在这里提到这个应用程序不会供公众使用,它用于非常紧密的公司集团,其他任何人都不会与它有任何关系。 您是否检查过他们是否会采用自定义解决方案?我们有几个客户(财富 50 强)需要浮动 FlexLM 许可证。如果你没有,他们的 IT 人员不会支持它,因此部门无法购买。 是的,我相信他们会接受我们将要实施的任何解决方案。更值得一提的是,在使用应用程序的环境中没有互联网连接,因此无法使用服务器激活..【参考方案3】:

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

【讨论】:

他没有提到你只是替换公钥的攻击。也许他没有提到它,因为它执行起来很简单,并且完全打破了这种方法。 我没想到。谢谢。【参考方案4】:

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

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

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

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

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

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

【讨论】:

是的,你是对的,我知道这一点。问题是关于激活算法/系统而不是防止它被逆向工程。【参考方案5】:

产品激活不是非对称密码学可以解决的问题。非对称密码学是关于保守对手的秘密。问题是您无法保留存储在您的对手机器上的秘密,即security though obscurity。

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

但即使是使用该产品时require you to be online 的 DRM 系统。就像在“From Dust”等新游戏中发现的一样,它们在发布后的几个小时内就会still broken。

【讨论】:

如果有人要修改您的二进制文件,您是对的(尽管下载的内容很容易被捕获,因此虽然可能会购买 1 个许可证,但可能会被盗更多)。如果有人不打算使用非对称加密来修改您的二进制文件来签署和验证产品许可证,那是非常安全的(只要您的未分发的私钥保持秘密) @userx 如果他们不打算破解你的软件,那么没有人会关心它,因为它一文不值。但是,如何尝试盗版软件即服务 (SaaS)。破解《魔兽世界》并不是那么容易,虽然盗版服务器也被创建出来了。 对不起,我还是没明白你的意思。非对称加密在产品激活和许可中占有一席之地。它是否可以防止所有盗版方法,不。它是否允许您验证许可证是否来自给定来源,是的。所有产品激活都是通过默默无闻的安全性。我不同意笼统的说法,即“如果没有人破解你的软件,那么就没有人在乎”。裂解是非常特定于行业的。游戏,是的,这是一个问题。企业网络负载平衡,不是那么多。 @userx 让我明确一点,这绝不是一个安全系统。 您声称该秘密“存储在您的对手机器上”,但私钥(您用来签署许可证的)仍然是内部的。公开密钥(用于验证许可证的)是公开的。当然,如果您破解了软件并在内部用不同的证书替换了公共证书,那么您是对的。但这与有人破解您的二进制文件并绕过您的许可机制没有什么不同。问题不在于保护 SaaS 或基于令牌的 DRM。这是关于产品激活的。使用签名密钥激活产品如何无法合理地做到这一点?【参考方案6】:

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

这实际上用 .NET 很容易做到。您可以使用 x509 证书或像我们在DeployLX Licensing 中使用的RSACryptoServiceProvider。

我强烈建议购买商业产品(尽管 DeployLX 非常出色,但并不重要)并且不要自己这样做,原因有两个

    即使您是一位出色的开发人员,您也可能第一次就搞错了。并且您可能通过自己滚动获得的任何节省都将因从该错误中恢复而失去。 您将花费更多时间在自己的系统上工作——这些时间应该用于让您的产品变得更好。

保护软件的第二个阶段是确保它以您创建它的方式运行 - 并且未被黑客修改。如果黑客可以检查if( licensed )if( true ),那么你使用什么加密并不重要。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于使用公钥证书激活产品的主要内容,如果未能解决你的问题,请参考以下文章

公钥、私钥、签名、证书之间傻傻分不清

SSL中,公钥,私钥,证书的后缀名都是些什么

当服务器有多个证书时,哪个证书具有公钥?

使用 Godaddy 颁发的证书时“公钥证书和私钥不匹配”[关闭]

仅使用公钥的 CER 证书

如何利用keytool工具生成数字证书