2009-08-16 10 views
5

Was ist der beste Weg, um Daten zwischen Programmläufen in Java zu speichern? Ich weiß bereits, dass Sie eine Textdatei verwenden und die Informationen auf diese Weise speichern können, aber ich frage mich, ob es eine bessere Möglichkeit gibt, die Informationen zu speichern, die vom Programm zwischen den Programmdurchläufen generiert werden.Beste Art, Daten zwischen Programmläufen in Java zu speichern?

Gibt es auch einen Weg dies zu tun, um die Informationen sicher zu halten? Insbesondere möchte ich verhindern, dass der Endbenutzer darauf zugreifen kann.

Antwort

5

ich mich gefragt, ob es eine Möglichkeit war andere Platzierung der Informationen, die durch das Programm zwischen den Läufen des Programms genereated ist?

Verwenden Sie einfach einen ObjectOutputStream in eine Datei zu serialisiert und ein ObjectInputStream es zurück zu bekommen.

Gibt es auch einen Weg, es als zu tun, um die Informationen sicher zu halten? von der Endbenutzer kann darauf zugreifen?

Wenn der Code läuft auf dem System des Endbenutzers dann nicht, gibt es keine Möglichkeit, sie zu verhindern, dass die Daten zu erhalten - es ist nicht einmal wert Ihre Zeit versuchen, es irgendwie zu kodieren, da es einfach, einen Debugger zu befestigen und Überprüfen Sie den Status des Programms, während es ausgeführt wird. Als Binärformat verhindert die Java-Serialisierung, dass nicht-technische Benutzer sie entschlüsseln können, und das ist eigentlich das Beste, auf das Sie hoffen können.

+0

Es gibt natürlich nichts, was ihn davon abhält, zu einem Stream zu kompilieren, der Komprimierung und/oder Verschlüsselung unterliegt. Es wird niemals unzerstörbar sein, aber könnte unzerstörbar sein. Wenn es das wert ist? Wahrscheinlich nicht in den meisten Fällen. – Fredrik

+1

Nein. Wenn die Anwendung, die den Stream verschlüsselt, auf dem Computer des Endbenutzers läuft, ist jede Art von Verschlüsselung eine absolute Zeitverschwendung, da es, wie ich geschrieben habe, sehr einfach ist, es im Debug-Modus auszuführen und die Daten vorher zu schnappen es wird verschlüsselt (abgesehen davon, dass die App den Verschlüsselungsschlüssel enthalten müsste). –

1

Kryptographie auf Dateien oder lokale Datenbank mit Passwort.

2

Sie können Properties zum Speichern von Informationen verwenden. Wenn Sie es sicher machen wollen, führen Sie es durch eine Art von encryption stream.

+0

Und wenn Sie es übertreiben möchten, rollen Sie Ihr eigenes Binärformat und verschlüsseln Sie das. – Esko

1

Sie könnten db4o verwenden, um die Daten zu speichern. Es ist eine Objektdatenbank und unterstützt Verschlüsselung.

0

Am besten verwenden Sie zu Beginn von Java einen ObjectOutputStream oder eine Textdatei. Sobald Sie mehr Erfahrung haben, können Sie Datenbanken verwenden.

0

Wie wäre es mit der Serialisierung?

Es kann nicht vom Benutzer gelesen werden und es ist relativ einfach.

0

Wie andere gesagt haben, gibt es eine Vielzahl von Möglichkeiten, Daten zu serialisieren. Sie können etwas Leichtes wie SQLite oder einfach Serialisierung verwenden. Stellen Sie nur fest, dass alle Versuche, die Sie zum Verschlüsseln der Daten unternommen haben, insbesondere im Fall von Java-Code vereitelt werden können, da sie leicht rückgängig gemacht werden können.

Wenn jedoch der Großteil Ihrer Benutzer nicht technisch genug ist, um die Komplexität des Reverse Engineering ein Java-Programm zu verstehen, um herauszufinden, wie Sie Ihre Daten entschlüsseln, sollten Sie in der Lage sein mit einigen grundlegenden Verschlüsselungsmethoden wie dem was war in einer anderen Antwort erwähnt und gut sein. Stellen Sie einfach fest, dass, wann immer sich etwas auf einer Maschine befindet, die Sie nicht kontrollieren, es keine Möglichkeit gibt, die hartnäckigsten Benutzer daran zu hindern, herauszufinden, wie man sie knackt.

Ich würde vorschlagen sqlite zu verwenden und eine einfache Verschlüsselung für die Daten, die Sie in die Felder einfügen, wenn jemand schlau genug ist, um mit der lokalen DB-Datei verbinden zu können, müssen sie Ihren Kryptoalgorithmus in einigen umgekehrt Weise. 99,9% der normalen Benutzer werden sich nicht mit dieser Untersuchung beschäftigen.

+0

Auch 92,3% der Statistiken werden vor Ort gemacht! – MattC

+0

@MattC: Du hast alles falsch verstanden, es ist 97% :-D – Fredrik

1

Einige Leute haben vorgeschlagen, Serialisierung zu verwenden. Beachten Sie, dass die Serialisierung mit einigen Nachteilen verbunden ist.

  • Das Versionierungsproblem. Wenn Sie etwas in den serialisierten Klassen ändern, können serialisierte Dateien, die mit der alten Version Ihres Programms geschrieben wurden, nicht mehr problemlos gelesen werden.
  • Sie kennen das genaue Dateiformat nicht. Es wird sehr schwierig sein, wenn Sie später ein anderes Programm schreiben möchten, möglicherweise in einer anderen Programmiersprache, die die Datei lesen muss.

Serialisierung ist nicht gut geeignet für Langzeitspeicherung.

Ich würde vorschlagen, stattdessen eine kleine, eingebettete Datenbank zu verwenden. (Eine eingebettete Datenbank ist eine Datenbank, die im selben Prozess wie Ihr Programm ausgeführt wird). Beachten Sie, dass Sun Java Java DB enthält, eine Version von Apache Derby. Es gibt auch HSQLDB, eine weitere kleine und reine Java-Datenbank, die als eingebettete Datenbank verwendet werden kann.

0

XML als Serialisierungstechnik ist widerstandsfähiger gegenüber zukünftigen Änderungen in Ihrem Programm, die den Speicher anpassen als binäre Formate wie Objektserialisierung. Dies würde es jedoch für die meisten Benutzer sehr lesbar und veränderbar machen.

Eine sehr einfache Komprimierung/Dekomprimierung würde fast alle Benutzer daran hindern, den tatsächlichen Inhalt der Daten zu erreichen. Die Verwendung von GZipInputStream/GZipOutputStream um Ihren aktuellen Schreibstrom herum erledigt die Aufgabe. Je ausgeklügelter Ihre Verteidigung gegen das Aufspüren ist, desto mehr wird es sich auf die Benutzer Ihrer Software auswirken.