Ich schreibe ein Java-Programm, das vertrauliche Daten (Passwort und private Schlüssel) im Speicher speichert. Es wird frei auf jedem Betriebssystem bereitgestellt. Ich weiß, dass ein Benutzer ein Speicherabbild manuell auf fast jedem System erstellen kann, aber ich mache mir Sorgen, dass ein Abbild von der Betriebssystem- oder JVM-Implementierung erstellt wird (einschließlich, aber nicht beschränkt auf einige Segfault der JVM selbst), die die Privatsphäre beeinträchtigen würde der sensiblen Daten.
Gibt es irgendwelche Schritte, um diese Risiken zu reduzieren? Diese Frage ist POSIX spezifisch aber gibt mir eine Antwort für diese Plattformen. Ich hatte eine nicht plattformspezifische Idee, die das Setzen von UncaughtExceptionHandler
( wie folgt ) zu einer Klasse, die sensible Daten überschreibt. Aber was ist, wenn Speicher ausgelagert wird? Was passiert, wenn die JVM aufgrund eines JVM / JNI-Fehlers abstürzt (z. B. Segmentierungsfehler)? Ich weiß, dass Linux verhindern kann, dass Daten auf die Festplatte ausgelagert werden, aber gibt es einen Java-Code, um dies plattformübergreifend zu tun? Meistens mache ich mir Sorgen über das Potenzial für die Wiederherstellung von Daten auf magnetischen Speichergeräten, so dass jede Hilfe geschätzt wird.
Wenn Sie versuchen, gelegentliche Benutzer zu stoppen, müssen Sie wirklich nichts tun. Wenn Sie versuchen, sachkundige / bestimmte Benutzer zu stoppen, und Sie den Code auf ihrem Computer ausführen, können Sie nichts tun.
Wenn das einzige, worüber Sie sich Sorgen machen, das Programm ist, das "versehentlich" auf die Festplatte schreibt, dann gibt es nicht viel mehr. Java-Programme generieren keine Heap-Dumps, es sei denn, Sie sagen dies ausdrücklich. Alle Stack-Traces, die von einer nicht abgefangenen Exception ausgegeben werden, enthalten höchstwahrscheinlich keine sensiblen Elemente. die Datei, die geschrieben wird, wenn ein jvm-Segment in einer kontrollierten Weise segelt, wird wahrscheinlich auch nichts Empfindliches darin haben. Die einzige potentiell problematische Sache wäre ein Core-Dump auf einer Variante eines Unix-Systems. und leider glaube ich nicht, dass du das auf der Programmebene kontrollieren kannst, nur auf der System / Benutzer-Konfigurationsebene (die in der ersten Frage erwähnt wurde, mit der du verlinkt hast).
Wenn Sie keine Kontrolle über das Betriebssystem haben, können Sie dem Benutzer grundsätzlich nicht verbieten, auf das zuzugreifen, was Sie im Speicher haben.
Daher müssen Sie die Menge der sensiblen Daten, die Sie aufbewahren, auf ein absolutes Minimum beschränken. Stellen Sie sich vor, dass der sachkundige Benutzer einen Debugger anhängt, Ihr Programm stoppt und in Ihre Datenstrukturen hineinschnüffelt, was immer sie wissen müssen.
Wenn Sie also Passwörter verwenden, setzen Sie alle Referenzen auf null. Wenn Sie die Schlüssel verwenden, legen Sie ihre Referenzen auf null fest. Beachten Sie, dass dies für den ermittelten sachkundigen Benutzer nicht hilfreich ist, aber die Gefahr einer versehentlichen Entdeckung zumindest minimiert wird.