通过加密保护软件



对于我们的软件,我们使用硬件加密狗来保护软件。没有保护是完美的,但这种商业解决方案是负担得起的,并且让诚实的人保持诚实(如另一个线程中所述)。优点是 128 位密钥存储在硬件加密狗上"不可读"。

我们想删除这个硬件加密狗并开始使用软件保护。基本上,我们可以使用商业产品,但另一方面,这也不是牢不可破的。我对加密了解不多,这就是我发布这篇文章的原因。如何在 Windows 计算机上存储无法使用反射器或其他东西读取的密钥?但是,我应该能够访问用于测试许可证代码的密钥。

我只是想要一个简单的解决方案,不能通过简单地使用反射器来破解。

还是我在问一个非常愚蠢的问题?


感谢大家非常快速和有用的回复。我不想通过互联网使用许可,因为应用程序并不总是在连接的计算机上运行。然后我可能会得到更多的问题,然后解决它们。我们现在很可能会寻求商业解决方案。看来保护并不是那么微不足道。

多谢!!

没有办法完全保护密钥。如果它可以被您的程序读取,那么它可以被另一个程序读取。

我经营着一家软件公司,已经处理了这个问题近20年。 作为开发人员和企业主,我想首先鼓励您拓宽目标。例如,将您的问题定义为"防止盗版"简直是错误的。 您的目标应该是最大化收入。

话虽如此,有些人根本不会购买您的软件,但他们可能会付出相当大的努力来免费获得它。 他们获得免费副本并不"公平",但投入大量资源来防止它在很大程度上是浪费时间。 事实上,这些人往往最终"合法化"只是为了进入我们的更新列表,获得支持,或者因为他们的业务发展到他们现在可以负担得起我们的许可证的程度。 在这些情况下,原始盗版最终增加了我们的收入。

那么,我们如何许可呢?

我们为每个新安装生成一个随机许可证编号(10K 到 99K 之间的数字做得很好)。 然后,我们有一个生成匹配数字的算法(任何非平凡的事情都可以)。顺便说一下,我们使用随机数,因此在另一台计算机上重新安装的任何尝试都会导致不同的许可证/匹配编号。

接下来,我们要求用户通过电话致电我们以获取其许可证的匹配号码(这很重要)。 该软件查看他们输入的匹配数字,并将其与用户端生成的匹配值进行比较。 如果匹配,则软件已完全激活。

我说让他们给我们打电话很重要,因为我们以此为契机与他们讨论他们的设置,回答任何问题,并让他们知道他们正在与真实的人打交道。很少有人有勇气尝试打电话和冒充另一家公司(我们查找他们并将他们的信息与我们的购买数据库进行比较)。 请注意,我们的套餐运行近$ 2K,因此电话是合理的。 如果您的包裹成本更低且体积更大,您可以通过电子邮件执行此操作。最后,我们使用呼入告诉用户如何使用新许可证获得升级和技术支持。

最后,我们将密钥存储在应用程序的数据库(本地安装的 MSDE/SQL Express 数据库)中,以便任何复制应用程序的尝试都将 A) 不平凡,并且 B) 带来大量特定于首次购买合法版本的组织的数据(使它们不太可能共享)。 许可密钥被加密并"拆分"为两个不同的密钥,保存在两个不同的表中。 因此,简单的"找到密钥并将其输入盗版"是行不通的。

底线?当您使整个软件包不仅仅是软件,构建一些基本的保护机制并引入人为因素时,您应该看到您不需要加密狗的费用和麻烦来最大化收入。

当然,绝对的答案是,一个坚定而熟练的攻击者可以破坏任何保护,但是,特别是对于需求或名气不高的软件,熟练和坚定的攻击者很少见,因此采取保护措施是有意义的。

要验证许可证,将

密钥发送到中央位置是最安全的方法,因为他们必须破解您的服务器(或协议,请注意)才能进行验证。这需要连接才能使用该软件,这可能是可行的,也可能是不可行的。您还可以将"许可证服务器"与软件一起分发,用于只需要本地网络访问的大型安装。如果不能并且必须仅在本地进行验证,则可以使用本机代码编写 dll,这将使逆向工程变得更加困难。

为了保护代码本身,并使其保护更难绕过,请混淆:

  • .NET 混淆工具/策略
  • (为什么)我应该使用混淆吗?
  • 我应该担心混淆我的 .NET 代码吗?
  • 什么是最物有所值的 单个开发人员的 C# 代码保护

总而言之,您可能会从打包解决方案中获得更好的价值。

这就是为什么复制保护和"保持诚实的用户诚实"是一场失败的战斗。你不需要让诚实的用户诚实,他们已经是了。

如今,大多数有效的复制保护方案都围绕着对中央服务器进行偶尔的密钥检查。让应用程序每隔一段时间检查一下中央服务器的关键,您可以确定软件是否正确获得许可。显然,我过度简化了事情,但这是一种方法。

基本上,您将需要使用商业解决方案。这里的方法与加密狗不同,您不能指望简单地复制加密狗。

相反,主要的解决方案是使用某种密钥,该密钥部分是根据运行该软件的计算机的信息计算得出的。做同样事情的注册机可以由饼干制造,但它就是这样。他们本可以简单地修补您的软件,以免寻找加密狗。

我的建议是,如果它适合居住,请坚持使用加密狗。这些往往是最可行的方法。

如果这不是一种选择,那么一定要去外部提供商。除其他外,您将寻找一些关键功能(没有双关语):

  • 密钥的安全存储
  • 许可证检查
  • 编译时混淆(使反汇编应用更加困难)

这些都不是万无一失的。最重要的是,开发商长期以来一直在打击盗版,当盗版者足够坚定时,我们总是失败。如果您的主要目标是让诚实的人保持诚实,那么一个体面的商业软件保护包可能会为您做到这一点。

虽然没有什么是完美的,但如果你想自己做,请查看CryptProtectData API。

老实说,您购买解决方案可能会减少头痛。

这些数据只是商业的东西还是你与工人分享的东西?

如果是后者,也许你可以写一个快速的 c++ 程序来异或它。基本上,如果密钥长度等于文档的长度,则应该是"牢不可破的"。我在 c++ 中所做的是创建一个文档大小的随机字符缓冲区,然后对其进行 xor 处理,然后简单地将文档和密钥文件分开发送,然后其他人将它们 xor 在一起以取回文档。

不知道这是否会对你有所帮助。

如果您将密钥存储在用户的本地计算机上,无论您多么努力地阻止这种情况,破解者都将能够使用它。

为什么不远程存储密钥或复制保护代码的关键部分,然后远程处理它?

为密钥生成哈希(SHA1、MD5 等),并在应用程序中对哈希进行硬编码。将密钥分发给用户。在可执行文件中可以根据硬编码的哈希检查用户指定键的哈希:

bool CheckKey(string keyFromUser) 
   return SHA1(key) == "ABC2983CF293892CD298392FG";
}

这意味着可以从您的组织(或其他用户)获取密钥的任何人都可以运行该应用程序,实际上很难通过检查可执行文件来确定密钥。

这显然不是一个非常强大的保护。

通常,非联网机器上的软件可能会被破解。如果您的应用程序不够小众,盗版者可以出售它的破解副本,那么您将在那里看到它。我听说的一个显然是成功的解决方案是自修改代码。

您可以尝试PC游戏中常用的标准方法,例如:SafeDisc,StarForce,SecuROM或任何其他复制保护软件。这些系统是保护您的应用程序的最发达的软件系统之一。

尽管如此,经验告诉我们,没有软件保护系统是牢不可破的,黑客破坏它们所需的时间与受保护内容的价值成正比。无论使用多么先进的保护系统来防止流行游戏的盗版

,破解都等待着几个月。

您已经说过许可证服务器对您的系统来说是一个麻烦,但我不会立即放弃它。我认为许可证服务器,至少在第一次程序运行时颁发许可证(例如每个安装不同的解密密钥)是减少盗版的最佳威慑措施。不仅由于加密方法的强度,而且主要是因为自动注册系统。如果您让您的客户知道软件激活密钥对于每个安装/用户是唯一的,并且它被存储并与用户的配置文件匹配,他们会三思而后行。

请让我对您的问题添加一些想法:

  • 您的软件是否需要任何类型的互联网连接?
    • 如果答案为"是",则可以监视使用情况。(请告诉客户此功能!
    • 如果答案为"否",则在大多数情况下,您仍然可以监视使用情况,但无法强制连接到服务器以使产品正常工作。
  • 是否要为您的软件添加复制保护?这不是反问,因为
    • 某些软件必须由软件公司或其合作伙伴定制。如果有人制作软件的副本,必须由专家定制,这对他没有任何用处。
    • 例如,如果您的客户的员工想在家中将您的高端电路设计软件用于他的私人项目,并且您允许他这样做,那么您在您的客户网站上有人,他将在每次购买决定中投票支持您的产品。
    • 保护工作副本的努力可能高于未经授权的副本造成的损失。(请记住,您仍然可以将其包含在下一个版本中。

最新更新