在客户端加密文件
本文关键字:文件 加密 客户端 | 更新日期: 2023-09-27 18:17:16
我将创建一个将在客户端计算机上运行的应用程序。该程序将允许客户使用该软件N次,然后客户可以再次使用该软件,他/她需要购买X次使用该软件。这就像买一个许可证或代币(我不知道它们是否相同,因为我的英语不是那么好)。
我正在考虑创建一个。lic或。txt或其他任何东西,它将被加密,当更新为新的。lic或。txt等时,它将改变客户端能够使用该软件的次数。
问题是,我不认为这种方法是非常可靠的,因为,即使加密,客户端可能以某种方式能够破解和理解这个文件。
有谁能帮我想出解决这个问题的办法吗?PS:软件不能通过互联网验证,客户端必须能够离线使用软件,如果不是,我会通过互联网验证软件的使用,不会有这个问题。
首先,我必须同意简单地说,这将不安全的注释。即使他们是正确的,开发者也可以很容易地解决这个问题,但仍然存在防止其他99%人口的有效需求/愿望。这与DRM所面临的战斗是一样的,总是有1%的人愿意花时间去破译你在做什么并解决它。但是,让我们继续讨论如何实现这一点……
第1步 -你需要一个"计数器"来知道你的应用程序已经运行了多少次。不幸的是,这只会对用户造成混淆,因为您的应用程序必须能够读取此值。通常,这种混淆是通过在注册表和文件系统中的几个位置隐藏值来实现的。有时候你会发现这些信息是"加密"的(实际上是被加密算法模糊了),使用主机上可用的信息,bios, cpu类型,硬盘id等。
最终,执行计数器的存储和混淆是你的"秘密武器",唯一使它难以逆转的是将你正在做的事情严格保密(因为大多数形式的混淆依赖于保密)。由于这一点,没有真正的价值,我可以提供给你一个解决方案,一旦张贴在这里,它不再是一个秘密:)
第2步—一旦您使此计数器工作,您将需要向用户提供"许可证"。这实际上是简单的部分,PKI加密可以很好地为您服务。您想要的是一个仅由您控制的私钥,而您的客户端软件将公钥硬编码在某个地方。然后,您可以使用您的私钥为客户端"数字签名"许可文件。当您的客户端加载许可证文件时,它会验证签名,以确保该许可证文件是由相关的私钥签名的,从理论上讲,因为只有您有权访问此密钥,这意味着您授权了该许可证。
第3步—现在您需要提供一种方法来验证该计数器没有超过许可的使用次数。这应该是直接的。
问题与解决方案
-
对这种解决方案最明显的攻击将是对代码进行逆向工程。你需要使用。net混淆库或编写非托管代码来解决这个问题。
-
下一个最可能的攻击是使用调试器跳过此验证。有很多反调试的文章。我发现最完整的是题为"反逆向工程指南"。
-
另一个应该考虑的攻击是修改你的可执行文件。为你的可执行文件签名并验证它的签名,就像你为许可证所做的那样,以防止代码被直接编辑。
-
您存储的执行计数器将是一个明显的目标,确保您将其存储在多个地方,如果其中任何一个已被篡改,您可以采取适当的行动。
最后,所有这些都不足以阻止一个有决心的人成功地击败您的许可策略。现在就接受这一点,根据普通用户的计算机能力水平以及损失的收益与实施成本的对比,只执行您认为必要的内容。换句话说,你实现了一些非常愚蠢和基本的东西,并期望20%的用户能够理解它。基于你的客户,你认为在那20%的用户中,只有不到四分之一的人会绕过你的DRM,而不是为许可付费。你预计损失5%的收入,假设你一年赚100万,这意味着你损失了5万。现在问问你自己,如果我花X美元的时间让别人更难规避,在什么时候它会变成负回报?当然,在预计损失5万美元的情况下,你不会想花一年的时间在DRM上。
老实说,我认为大多数采用DRM的应用程序可以节省很多工作。如果你的应用定价合理,人们就会为它付费。对于那些绕过DRM的人来说,他们可能不会购买您的应用程序,因此您并没有真正失去任何东西。如果我告诉你,我会留出一个固定的时间来解决这个问题,(一个星期?),并且在这个时间限制内只做你能做的事情。