我目前正在使用java开发许可证管理器,我将为我的应用程序指定开始日期和结束日期,以便我可以强制许可用户在一定时间后重新许可该程序。
但我面临的问题是,任何人都可以回滚他们的系统日期和时间,以保持许可证的有效性。在Java中是否有任何方法可以检测系统日期和时间是否已更改。我已经尝试过网络时间协议来从时间服务器获取当前日期和时间。
答案 0 :(得分:7)
您可能正在系统上存储许可证文件。 a)包括软件在许可文件中注册的时间,b)对文件进行数字签名。
数字签名将告诉您许可证文件是否被篡改。如果没有,时间将告诉您软件何时注册;如果“当前时间”小于注册时间,您的许可证管理员会知道一些有趣的事情正在发生并且可以响应(拒绝运行,删除许可证,...
如果您真的想要强制执行日期范围,请将每个程序执行的当前时间写入单独的数字签名文件,验证时间总是单调上升。
您还可以根据应用程序写入的任何文件检查上次记录的时间。这样一个日期晚于上次记录时间的文件表示某种许可文件回滚。
这些不会阻止用户将时钟设置回来,但这将使他很难以有组织的方式做到这一点。
答案 1 :(得分:6)
基本上不可能做任何事情。用户可以“恢复”他的整个计算机,以便软件认为它在任何特定日期运行。
你可以通过让程序问一些时间服务器来让它变得更难。 (尽管如此,如果有人真的想使用旧许可证,他可以将任何此类流量重新路由到本地时间服务器。)
相关问题/答案:
答案 2 :(得分:4)
正如@aioobe所说,应用程序无法控制它们运行的环境。
您可以做的事情(如果您的程序还维护对您的用户重要的数据)是记录它所知道的日期/时间和时间的流逝。例如,您可以在检查到它没有回滚后定期存储当前时间(当检测到回滚时,输出带有加密代码的消息以传递给您进行重新许可,以便您知道发生了这种情况)。 p>
您还可以保留一个“计数器”,该计数器在您的程序运行时每小时递增一次,为您提供另一种估算许可证使用情况的方法。
使用这三个许可证将在一年后,滚动或x小时运行时耗尽。
答案 3 :(得分:4)
你有几种情况要打击:
您可以应用多种级别的安全性,如果这是一个主要问题,那么您可能希望使用所有这些级别。
最安全的是检查外部参考的时间,例如你的服务器。如果没有网络访问权限,则可以使用上述本地方法,使用本地(隐藏)文件跟踪系统上的时间,以便检测回滚。通过在多个位置使用多个这样的文件,并让它们相互交叉检查,您可以在不检测的情况下随意进行回滚(并且您可以始终保持定期尝试连接到外部服务器)。
答案 4 :(得分:-2)
对您的应用进行编码,向您发送包含用户会话使用情况的电子邮件,并检查到达时间。自动化电子邮件监控!否则你将成为你成功的奴隶。
豪尔赫