在离线情况下,我需要检测PC的时钟是漂移还是在独立的Java应用程序中被操纵。我怎么能发现这个?
在拥挤的房间里,应用程序将由用户掌控至少3个小时,我不希望他们成为熟练的攻击者并能够设置黑客环境。 大多数情况下,我希望检测至少几秒钟的跳跃。
我需要找到一种技术来跟踪Java应用程序在独立工作站上的时间,该技术允许检测有意义的跳跃"在系统时钟中,但同时不会导致误报"在休闲的慢人中。
解决方案不一定能够抵抗熟练的源代码或系统时钟操作。该应用程序将安装在数千个工作站中,但是在非常有限的时间(小时)和公共场合。它只是一个基于计算机的测试软件。
过去,我们尝试使用System.nanoTime()设置内部时间测量,并计算重复定期System.nanoTime()调用所用的时间。 通过这种方式,我们可以完全忽略任何时钟修改或问题。 但这是一次失败,因为在某些机器(多核)上,API的后续请求从随机核返回值,使得该措施不可能。
所以,现在我们只是想检测一个突然的时间变化,因为有些工作站有错误的时钟重置自己(是的,它发生了),其他一些在测试期间做了doimain时钟更新(工作站不应该联网但是有人并没有听取我们的指示),也许有些候选人会试图改变系统时间。
答案 0 :(得分:0)
您可以使用Apache Commons Net's NTP client继续针对受信任的NTP服务器检查PC时钟。
更新1
工作站处于脱机状态。
然后,纯粹用Java解决这个问题。您可以使用GPS或无线电时钟硬件来实时检查PC时钟。
答案 1 :(得分:0)
您无法在应用程序,Java或其他 1 中可靠地执行此操作。
例如,如果您的应用程序使用外部NTP时间源,那么坏人可以阻止访问NTP服务器,或者偷偷地将您重定向到伪造的NTP服务器。
编辑:处于离线状态。
这使得它变得更加困难。您无法区分系统时钟的明显减速或加速与许多现代机器上自动发生的CPU时钟速率调整的影响。
1 - 我不是在谈论完全蹩脚的尝试......就像在应用程序运行时向后扭曲时钟一样。这很容易检测到。坏人很容易比这更微妙。总是假设坏人至少和你一样聪明。此外,假设他们可以反编译您的代码,并弄清楚您是如何尝试检测时钟干扰并试图打败它。或者只是禁用支票。
答案 2 :(得分:0)
没有100%的解决方案。但是你可以让操作时钟变得更加困难。
您可以检查计算机启动时创建的某些选定系统文件。他们永远不应该在未来。这至少需要在操作时钟时重新启动计算机。