25

我有一个很大的问题。那就是“如何为我的软件创建许可证”。

好的,认为这是我的许可证密钥 - 12345YW

当用户输入此许可证密钥时,该软件应允许他使用该软件。好吧,一旦用户输入许可密钥,我的软件必须记住他输入了有效密钥,对吗?(因为从下一次开始,它不必提示许可对话框)我的问题是,我怎样才能使我的软件要记住用户已输入的许可证吗?在基于 Windows 的应用程序中,他们大多数人所做的就是在 Windows 注册表中输入一个条目。我可以这样做吗?(那么 Ubuntu 和 Mac 呢?)

我想写一个 .txt 文件,以便 m 软件可以读取它并查找是否输入了许可证。然而,这是我能想到的最不安全的系统。

那么,如果我输入了上面的许可证密钥,我怎样才能让我的软件记住它呢?如果您也可以给我一个代码示例,我真的很高兴(即:我不知道如何编辑注册表,以防 Windows 注册表等)。请帮我...

4

2 回答 2

26

许可软件尚未解决 - 或者至少,安全地这样做,不会给您的用户带来不便,并且没有投资于主要的基础设施并没有得到解决。

您存储许可证状态的位置/机制大多无关紧要 - 注册表并不比文本文件更安全 - 访问内容需要几秒钟,并且在注册表的某些远程死水中“隐藏”条目不会帮助不大。

据推测,您的软件有某种持久性(数据库?文件系统?);您可以使用相同的持久性机制来存储注册状态。

当然,您的软件可以读/写的任何内容都可以被试图未经授权访问您的软件的人访问。因此,您可以加密记录;那么你有管理该加密机制的密钥的问题;afaik,目前没有强大的解决方案。

那么,您可能在互联网上有一个“许可证服务器”;您的软件可能会读取您机器的唯一标识符(例如 MAC 地址),将其发送到您的许可证服务器,并让服务器返回许可证状态。同样,这很容易绕过,现在您要求您的用户在线使用您的软件。

如果您的软件对用户具有远程吸引力,黑客将在几天内破坏许可证密钥保护,并在互联网上发布详细说明。Apple 竭尽全力保护 Iphone/Ipad 上的软件,但越狱应用程序却将它们解锁。

在我看来,除非您的软件价值数千万美元,否则您应该让用户的生活尽可能轻松,并且不要太担心安全方面 - 使用现成的东西(如 @bunting 推荐的) ,或满足于文本文件。

具体来说,我会:

  • 在应用程序启动时检查是否存在有效的许可证文件
  • 如果许可证文件不存在,要求用户输入许可证密钥
  • 将该密钥与您的许可证密钥进行比较
  • 将“有效”文件写入应用程序目录中的文件系统;或者,修改现有的配置文件。

这很容易破解;所以你可以更进一步。

首先,Java 应用程序很容易反编译,攻击者可以轻松读取您的“许可证”常量。您应该使用混淆器来使这变得困难(尽管并非不可能)。

其次,您可以加密本地许可证数据;这也会使完全随意的黑客变得更加困难。您可以在加密方案中包含一些本地数据,这样黑客就不能只使用有效的许可证密钥重新分发您的应用程序(例如,通过将许可证密钥乘以机器的 MAC 地址)。

在这两种情况下,您都将许可证“硬连线”到应用程序中;有黑客在公告板上发布应用程序的许可证密钥,您只能通过使用新密钥发布新版本的应用程序来做出回应。

于 2012-05-11T09:33:01.383 回答
9

我很惊讶有一种可能性被忽略了。保护数据免受不可信客户侵害的最简单方法是永远不要让客户拥有它。几种应用程序架构允许这样做:Web 应用程序、桌面客户端 RPC'ing 到远程服务器,或高性能瘦客户端连接到远程服务器上的虚拟化桌面。由于在安装、数据备份和维护方面的优势,Web 应用程序已经很受欢迎。

因此,与其试图通过制作对邪恶客户执行公司安全策略的软件来获得荣誉 Comp Sci 博士...

(极不可能)

...您只需将知识产权放在受信任的服务器上,客户端就只有用户界面(和非机密逻辑)。这个策略有它自己的陷阱。不过,它的跟踪记录比客户端复制保护要好得多。

注意:额外的好处是,您可以通过为客户“管理”软件而获得稳定的收入流。

于 2013-04-13T19:12:18.783 回答