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