许可软件尚未解决 - 或者至少,安全地这样做,不会给您的用户带来不便,并且没有投资于主要的基础设施并没有得到解决。
您存储许可证状态的位置/机制大多无关紧要 - 注册表并不比文本文件更安全 - 访问内容需要几秒钟,并且在注册表的某些远程死水中“隐藏”条目不会帮助不大。
据推测,您的软件有某种持久性(数据库?文件系统?);您可以使用相同的持久性机制来存储注册状态。
当然,您的软件可以读/写的任何内容都可以被试图未经授权访问您的软件的人访问。因此,您可以加密记录;那么你有管理该加密机制的密钥的问题;afaik,目前没有强大的解决方案。
那么,您可能在互联网上有一个“许可证服务器”;您的软件可能会读取您机器的唯一标识符(例如 MAC 地址),将其发送到您的许可证服务器,并让服务器返回许可证状态。同样,这很容易绕过,现在您要求您的用户在线使用您的软件。
如果您的软件对用户具有远程吸引力,黑客将在几天内破坏许可证密钥保护,并在互联网上发布详细说明。Apple 竭尽全力保护 Iphone/Ipad 上的软件,但越狱应用程序却将它们解锁。
在我看来,除非您的软件价值数千万美元,否则您应该让用户的生活尽可能轻松,并且不要太担心安全方面 - 使用现成的东西(如 @bunting 推荐的) ,或满足于文本文件。
具体来说,我会:
- 在应用程序启动时检查是否存在有效的许可证文件
- 如果许可证文件不存在,要求用户输入许可证密钥
- 将该密钥与您的许可证密钥进行比较
- 将“有效”文件写入应用程序目录中的文件系统;或者,修改现有的配置文件。
这很容易破解;所以你可以更进一步。
首先,Java 应用程序很容易反编译,攻击者可以轻松读取您的“许可证”常量。您应该使用混淆器来使这变得困难(尽管并非不可能)。
其次,您可以加密本地许可证数据;这也会使完全随意的黑客变得更加困难。您可以在加密方案中包含一些本地数据,这样黑客就不能只使用有效的许可证密钥重新分发您的应用程序(例如,通过将许可证密钥乘以机器的 MAC 地址)。
在这两种情况下,您都将许可证“硬连线”到应用程序中;有黑客在公告板上发布应用程序的许可证密钥,您只能通过使用新密钥发布新版本的应用程序来做出回应。