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

时间:2012-05-11 09:05:37

标签: java security licensing registry

我遇到了一个非常大的问题。那就是“如何为我的软件创建许可证”。

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

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

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

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

3 个答案:

答案 0 :(得分:22)

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

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

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

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

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

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

在我看来,除非你的软件价值数千万美元,否则你应该让用户尽可能轻松生活,不要过于担心安全问题 - 使用现成的东西(比如@)彩旗推荐),或解决文本文件。

具体来说,我会:

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

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

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

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

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

答案 1 :(得分:6)

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

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

(极不可能)

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

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

答案 2 :(得分:3)

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