6

这是我的第一个问题,所以请温柔...

我正在开发一个我想使用某种许可方案来保护的软件。一个基本方案是为用户生成一些“唯一”密钥。用户在想要注册软件并收到激活码时发送此密钥和注册码。

当应用程序运行时,它通过比较“唯一”密钥和通过解密激活码接收到的数据块来验证激活码。

这是公平且实现起来非常简单的,可以选择不同的加密算法等。但是该方案缺少两个属性:

  1. 如果用户设法欺骗硬件签名等以在另一台计算机上生成相同的“唯一”密钥,他可以使用相同的许可证数据。
  2. 如果用户决定卸载应用程序并希望将其移至另一台计算机,则没有什么可以阻止他在旧计算机上再次使用旧许可证数据并仍然为新安装获取新许可证数据。

您对如何解决这些问题有什么建议吗?

我的一个想法是向“唯一”键添加一些随机数据,这些随机数据将以一种模糊的方式存储,如果用户卸载应用程序,这个随机数据将被删除,并且与之前的随机数据进行某种散列将生成数据和许可证数据,可以将其发送给我以验证他是否确实已卸载应用程序,并确保他将无法再次使用以前的许可证数据,因为随机数据已更改。

一遍又一遍,现在...

编辑:我目前有一个可行的方案,我应该提到最常见的产品安装在嵌入式环境中,硬件更改非常罕见,如果出现硬件故障,那么很可能机器坏了。但我可以修改硬件密钥方案以考虑并允许进行一些更改。

也正因为如此,该软件很可能不会在 VM 内运行,不过这很好,我没有考虑过。

应用程序不会定期调用,如果网络连接可用,用户可以选择进行更自动的注册,否则他/她会获得注册密钥,将其输入软件并获得提供给我的安装 ID ,注册码 + 安装 ID 生成用户从我这里获得的激活密钥,然后解锁软件。

我正在寻找的是对 2 点好的/可行的解决方案。硬件欺骗,撤销许可证密钥,即确保用户不能使用相同的 regcode+activationcode。

感谢您的所有反馈

没有必要

4

5 回答 5

3

首先,您应该明确您要保护的内容。显然,您希望确保每次购买您的应用程序时,只有一台计算机可以安装和运行该应用程序。

您建议使用硬件签名作为每个用户唯一密钥的一部分。如果我的硬件出现故障(例如我的硬盘坏了)会怎样?如果在出现硬件问题后我无法继续使用您的应用程序,我当然不会购买它,因此您至少必须准备好处理关键更改请求。您最好快速响应,因为如果您的应用程序很重要,我想尽量减少停机时间。而且我不会邀请您检查我的硬件是否出现故障,因此您必须相信我的话。这意味着任何用户都可以不时以硬件故障为借口获得免费许可证。

虚拟机呢?检测所有当前存在的虚拟机配置可能是可行的,但有时会有一些误报的风险。如果你禁止虚拟机,你如何向用户证明这一点?如果允许使用虚拟机,如何防止用户制作整个 VM 的多个副本?(即使在物理机器上,也可能在休眠状态下发生这种情况)。

应用程序每次启动时都会回拨给您吗?我想是的,从你的卸载计划。这是带宽和可用性成本,也会推迟一些用户——不是每个人都在线,尤其是在敏感环境中。但是你不需要这么复杂的方案:你的服务器可以跟踪有多少应用程序正在运行,尽管你必须处理应用程序由于任何原因没有完全终止的情况(应用程序崩溃,操作系统崩溃、电源故障、连接中断...)。

您没有在问题中讨论这一点,但您必须保护应用程序可执行文件,以便有人无法使用调试器绕过许可证检查。

于 2010-08-06T20:01:12.957 回答
1

将您的软件放入设备硬件并在硬件上放上挂锁。将设备运送给客户。

如果您认为客户会用钢锯打开设备以获取您的代码,请考虑对存储介质进行加密......然后他们必须钢锯盒子并找到密钥。TPM 芯片或安全 USB 令牌可能有助于后者。

于 2010-08-09T21:11:26.837 回答
1

作为一名共享软件作者和ASP的长期成员, 我认为您的解决方案正朝着错误的方向发展。使这个可行的唯一方法是使用已经建议的硬件设备。如果您想确定您的产品非常好并且没有竞争对手,您的客户仍然会使用它,那么这种或持续的在线激活是唯一的方法。

但是我们(有组织的小型 ISV)从实践中学到的是,您不应该做您想做的事情。不要将其绑定到硬件。每人出售一份许可证,而不是每台计算机出售一份许可证。最后,由于放宽了许可证,您将获得更多销售。

只要做足够的事情让诚实的人保持诚实。所以限制试用版本(我决定在一小时后终止应用程序)并让最终版本没有任何东西。为付费客户提供单独的下载,仅此而已。做一家不错的公司,而不是受法律限制的贪婪利润最大化的公司。

我首先使用了一些更好的 Windows 保护程序,但它们的代码都存在严重问题。他们称迟早会被破解。所以我放弃了所有这些。

PS:我在 Windows 上使用硬件指纹模式,我不限制程序,只是为了让人们远离每 30 天获得新的试用密钥。连同一个唠叨的屏幕,它似乎工作。指纹是用户名、windows 安装时间、系统文件修改时间戳和硬盘序列号的异或。

于 2010-08-16T16:08:50.043 回答
0

我认为解决您的问题的唯一方法是加密硬件加密狗。通常它是一个基于 USB 的防篡改挑战响应加密狗,可以在计算机之间轻松传输。

这些器件的大批量成本不到 1 美元,极小批量的成本不超过 10 美元。好的那些很难伪造,很容易嵌入到您的应用程序中,并且通常提供免费的 EXE 加密器,其中还包含反调试和反逆向工程功能。

于 2010-08-16T15:46:58.073 回答
0

让注册码也成为激活码。

您在销售点生成唯一的注册码,或与产品打包在一起。客户使用该单一代码在一个步骤中向您(或您的服务器)注册/激活/停用。客户的硬件不必生成任何密钥。

重新注册/重新激活仍需要与您联系,因此您知道重新安装尝试。

于 2010-08-09T21:02:20.857 回答