如何为我的Java软件创建许可证?

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

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

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

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

因此,如果我输入上述许可证密钥,我该如何让我的软件记住它? 我很高兴你能给我一个代码示例(即:我不知道如何编辑注册表,如果是Windows注册表等)。 请帮帮我…

许可软件尚未解决问题 – 或者至少安全地执行此操作,不会给用户带来不便,并且无需投资主要基础架构也无法解决。

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

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

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

那么,你可能在互联网上有一个“许可证服务器”; 您的软件可能会读取您机器的唯一标识符(例如MAC地址 ),将其发送到许可证服务器,并让服务器返回许可证状态。 再次,这是非常微不足道的,现在你要求你的用户在线使用你的软件。

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

在我看来,除非你的软件值得收入数千万美元,否则你应该为用户尽可能简单地生活,而不要过于担心安全方面 – 使用现成的东西(比如@bunting推荐) ,或解决文本文件。

具体来说,我会:

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

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

首先,Java应用程序易于反编译,攻击者可以轻松读取您的“许可证”常量。 你应该使用混淆器来解决这个问题(虽然并非不可能)。

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

在这两种情况下,您都将许可证“硬连线”到应用程序中; 有黑客可以为应用程序发布许可证密钥的公告板,除了通过使用新密钥发布新版本的应用程序之外,您将无法做出响应。

我很惊讶一种可能性被忽视了。 从不值得信任的客户端保护数据的最简单方法是永远不要让客户拥有它。 一些应用程序体系结构允许这样做:Web应用程序,RPC到远程服务器的桌面客户端,或连接到远程服务器上的虚拟桌面的高性能瘦客户端。 Web应用程序因其在安装,数据备份和维护方面的优势而广受欢迎。

所以,不要试图通过制作一个对邪恶客户强制实施公司安全政策的软件来获得荣誉Comp Sci Ph.D ……

(极不可能)

…您只需将知识产权放在受信任的服务器上,客户端就只有用户界面(和非机密逻辑)。 这个策略有自己的问题。 不过,它的跟踪记录比客户端拷贝保护更好。

注意:奖励是您可以获得稳定的收入来“管理”您的客户的软件。

您似乎正在尝试在您的软件中构建许可。 您是否考虑过使用库而不是手工操作? 也许看看True License ,它应该做你需要的。