12

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

我们想移除这个硬件加密狗并开始使用软件保护。基本上我们可以使用商业产品,但另一方面也不是牢不可破的。我对加密知之甚少,这就是我发布此内容的原因。如何在 Windows 计算机上存储无法通过 Reflector 或其他方式读取的密钥?但是,我应该能够访问用于测试许可证代码的密钥。

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

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


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

非常感谢!!

4

14 回答 14

17

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

于 2008-10-22T20:12:10.573 回答
14

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

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

那么,我们如何授权?

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

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

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

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

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

于 2008-10-22T21:12:53.290 回答
10

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

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

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

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

于 2008-10-22T20:26:41.417 回答
4

我通过一个有趣的演示阅读了有关Skype 如何通过加密来保护软件的任务。

于 2008-11-02T17:51:39.920 回答
3

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

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

于 2008-10-22T20:20:19.217 回答
1

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

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

于 2008-10-22T20:20:36.407 回答
1

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

如果这不是一个选项,那么一定要找外部供应商。除其他外,您将寻找一些关键功能(不是双关语):

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

这些都不是万无一失的。底线是开发者与盗版斗争已久,当盗版者足够坚定时,我们总是输。如果您的主要目标是让诚实的人保持诚实,那么一个体面的商业软件保护包可能会为您做到这一点。

于 2008-10-22T20:24:32.280 回答
0

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

不过老实说,购买解决方案可能会让您不那么头痛。

于 2008-10-22T20:19:59.233 回答
0

这些数据只是商业资料还是您与工人分享的东西等等?

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

不知道这是否会帮助你。

于 2008-10-22T20:28:44.643 回答
0

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

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

于 2008-10-22T20:31:41.737 回答
0

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

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

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

这显然不是一个很强的保护。

于 2008-10-22T20:37:27.310 回答
0

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

于 2008-10-22T21:08:37.620 回答
0

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

尽管如此,经验告诉我们,没有唯一的软件保护系统是牢不可破的,黑客破解它们所花费的时间与受保护内容的价值成正比。无论使用了多么先进的保护系统来防止流行游戏的盗版副本,破解都在等待几个月。

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

于 2008-10-22T21:12:33.417 回答
0

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

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