Wie kann ich die Zeit in Java nicht anfällig für Systemtakt Änderungen messen?

StackOverflow https://stackoverflow.com/questions/1937619

  •  20-09-2019
  •  | 
  •  

Frage

Ich möchte verstrichene Zeit in einem Java messen. Jedoch Unterschiede in System.currentTimeMillis() und (ich glaube) System.nanoTime() kann durch externe Änderungen zB jemand (oder das System) Änderung der Systemuhr geändert werden.

Mit Netzwerk Anrufen ist keine Option, da es möglich ist sehr häufige und schnelle Rückkehr angefordert werden.

Gibt es eine gemeinsame Lösung für das?

Bearbeiten

Sorry, ich sollte über den Grund erarbeitet haben. Es ist nicht böswilligen Benutzer zu stoppen -. Es Sachen wie Client initiiert logout für Ereignisse im Leerlauf und Routine-Client zu sein

War es hilfreich?

Lösung

Dies ist nicht wirklich Ihre Frage beantworten, aber Bug # 6458294 bedeutet, dass, wenn möglich, Sun-Implementierung von Nanotime () werden Mechanismen verwenden, die wirklich monotonen sind (CLOCK_MONOTONIC auf Linux, Queryperformance / Queryperformancecounter unter Windows). Nur wenn diese nicht verfügbar sind, wird es fallen zurück auf einen Mechanismus, der Systemuhr Änderungen anfällig ist.

Wenn Sie die Kontrolle haben (oder zumindest Wissen) der Hardware, die Sie auf ausführen, und kann dafür sorgen, dass diese Uhrwerke zur Verfügung stehen wird, haben Sie Glück sein könnte und Nanotime () wird gut tun.

Sie können wie auch lesen diese Blog-Post , die die Hotspot- diskutiert on-Windows Fall im Detail.

Andere Tipps

Ich glaube nicht, dass es eine Möglichkeit, dies zu tun.

Es gibt sicherlich keine Möglichkeit, dies zu tun, die nicht unterminiert werden können. Im Grunde sind Sie auf die Gnade des Betriebssystems und der JVM, was auf die Java-App als die aktuelle Zeit gemeldet wird. Eine oder beide dieser könnte gepatcht werden, damit die Java-Code landet einen falschen Zeitstempel-Wert zu bekommen. Sie könnten versuchen, gegen diese zu verteidigen, aber dann sind alle Hacker Bedürfnisse zu tun ist, Ihre App zu deaktivieren Lizenz vollständig Überprüfung patchen.

Für die Aufzeichnung dieser „Schwachstelle“ gilt, ob Sie Java verwenden.

Wenn Sie versuchen, die Menschen daran zu hindern, eine Lizenzregelung Grabung durch die Uhr zurück Einstellung, müssen Sie die höchste Zeit speichern, die Sie bisher in einer Art verschlüsselte und sichere Speicherung gesehen haben, und deaktivieren Sie dann das Programm, wenn entweder die Zeit vergeht weniger als die höchste Sie (mit einer gewissen Berücksichtigung NTP Uhr Anpassungen und Änderungen von DST natürlich) gesehen haben, oder wenn sie irgendwie zu manipulieren oder zu den sicheren Speicher löschen.

Ich weiß nicht, ob Nanotime (), wenn die Systemuhr ändert sich wahrscheinlich ändern, aber ich glaube, es ist möglich. Auch Nanotime () nicht korrekt sein.

Wenn Sie wirklich gegen Uhr Änderungen schützen müssen, können Sie die Uhr in einem Thread überwachen. Schlaf ist für 100 ms oder 1000 ms, dann rufen currentTimeMillis (). Wenn Uhr mehr als 1000 Advanced + x oder hat rückwärts verändert dann wahrscheinlich die Uhr weg (oder der Faden wurde auf etwas aufgehängt, was möglich ist).

Im Fall einer Disjunktion, könnte man tatsächlich das Netzwerk Anruf zu überprüfen. Natürlich ist es möglich, dass Netzwerkzeit könnte durch das Einfügen von Schaltsekunden ändern. Ich habe einmal gelesen, einen Slashdot Kommentar von einigen Wissenschaftlern, die astronomischen Daten aus vielen verschiedenen Quellen wurde zu koordinieren. Eine Schaltsekunde wurde bei seinem Versuch gegeben, und es es im Grunde ruiniert, weil einige Websites sie eingefügt und andere nicht.

Eine andere Möglichkeit könnte eine geringe native API zu verwenden, einige andere System-Timer zu erhalten. Wie System- oder Netzwerkverfügbarkeit der API zu kalibrieren. Windows verfügt über die GetTickCount () Funktion, die die Anzahl der Millisekunden seit Boot zurückgibt. Auf Unix-Systemen können Sie den Befehl uptime verwenden, um eine grobe Schätzung zu erhalten. Sie können in regelmäßigen Abständen diese Werte überprüfen, um zu sehen, ob die Systemuhr geändert hat.

Wenn Sie nichts dagegen haben ein bisschen von nativen Code in Ihre Java-Anwendung hinzufügen, verwenden Sie:

  • QueryPerformanceCounter() und QueryPerformanceFrequency() unter Windows; oder

  • POSIX clock_gettime() Funktion mit CLOCK_MONOTONIC Uhr ID.

Beachten Sie, dass die Verwendung der x86 TSC-Register ist entmutigt auf Multi-Prozessor-Systemen, so dass Sie besser den oben genannten APIs verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top