许可证方案、欺骗安全和撤销功能

Posted

技术标签:

【中文标题】许可证方案、欺骗安全和撤销功能【英文标题】:License scheme, spoof-safe and revoke capabilities 【发布时间】:2011-03-26 08:06:43 【问题描述】:

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

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

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

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

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

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

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

暂时结束……

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

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

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

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

感谢您的所有反馈

没必要

【问题讨论】:

如果应用程序只是简单地“比较”密钥,破解者可以简单地插入一条 JMP 指令来绕过比较,或者返回“VERIFIED”。他们所要做的就是给应用程序断点并比较给定好的密钥和坏密钥的执行情况。这很难防范,因为代码必须运行才能完成其工作,并且您可以在它运行的同时观看它。 这是真的,但是如果破解者设法将 jz 更改为 jnz 或反之亦然,他仍然需要获取正确的代码才能使软件正常运行。顺便说一句好评论! 嗯。这是否意味着每个客户的数据文件都是唯一的? 他们可能是,但在这种状态下他们不会。由于注册过程同时使用注册密钥和激活密钥,激活密钥可以保存有关如何解密数据文件的额外信息。但是由于在破解的应用程序中使用错误的密钥会很好地发挥作用,除非解密的数据文件将被破坏,因此应用程序将无法运行......无论如何都不像预期的那样。 【参考方案1】:

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

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

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

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

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

【讨论】:

我在问题中添加了一些附加信息。出于某种原因,我没有介绍调试器/反编译器……我有一些东西可以防止这些攻击。不是很强大,但无论如何。【参考方案2】:

注册码也是激活码。

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

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

【讨论】:

好的,如果这个客户把注册码给别人怎么办?由于所有软件都应该可以离线注册,因此我无法仅验证注册码的有效性。这就是为什么注册过程现在是一个两步过程,用户输入注册码,然后从我生成的这两个信息中获取我收到的安装 ID(通过 tcp/ip、电话等...)现在绑定到该设备的激活密钥。 @Daniel:由于您需要激活,因此无需单独注册步骤,也无需离线注册。这只会使一切复杂化。把事情简单化。提供一个代码以同时向您注册和激活。如果客户在注册/激活后将代码提供给其他人,则新用户无法使用相同的代码注册/激活,因为您已经知道它属于第一个客户。例如,产品、用户或程序附带的代码 A1B2C3 向您发送代码以注册/激活(连同名称/地址/MAC/您想要捕获的任何其他内容)。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

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

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

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

【讨论】:

以上是关于许可证方案、欺骗安全和撤销功能的主要内容,如果未能解决你的问题,请参考以下文章

sh 撤销用户的Postgres许可

在 PHP 中加密和解密许可证密钥

TC (Teamcenter) 许可证解决方案

TC (Teamcenter) 许可证解决方案

为java项目生成许可证密钥[重复]

在单独的表格上验证许可证密钥?