Лучший способ хранить данные между запусками программы в Java?

Каков наилучший способ хранения данных между запусками программы на Java? Я уже знаю, что вы можете использовать текстовый файл и хранить информацию таким образом, но мне было интересно, есть ли лучший способ для хранения информации, которая генерируется программой между запусками программы.

Кроме того, есть ли способ сделать это, чтобы сохранить информацию в безопасности? В частности, я хочу, чтобы конечный пользователь не мог получить к нему доступ.

11 ответов

Решение

Мне было интересно, есть ли другой способ размещения информации, которая генерируется программой между запусками программы?

Просто используйте ObjectOutputStream сериализовать его в файл и ObjectInputStream чтобы вернуть это.

Также есть ли способ сделать это, чтобы сохранить информацию в безопасности? у конечного пользователя есть возможность получить к нему доступ?

Если код выполняется в системе конечного пользователя, то нет, нет никакого способа помешать им получить данные - даже попытка как-то его кодировать не стоит, поскольку подключить отладчик и проверить состояние программы легко, пока Бег. Будучи двоичным форматом, сериализация Java предотвратит его расшифровку не техническими пользователями, и это лучшее, на что вы можете надеяться.

Я никогда не использовал его сам, но я думаю, что именно для этого изначально был разработан java.util.prefs.Preferences JDK.

Вы можете использовать свойства для хранения информации. Если вы хотите сделать его безопасным, запустите его через поток шифрования.

Криптография на файлах или локальная база данных с паролем.

Некоторые люди предложили использовать сериализацию. Помните, что сериализация имеет ряд недостатков.

  • Проблема с версиями. Если вы что-то измените в сериализуемых классах, то сериализованные файлы, написанные со старой версией вашей программы, больше не будут легко читаться.
  • Вы не знаете точный формат файла. Будет очень трудно, если вы захотите написать другую программу позже, возможно, на другом языке программирования, для которого нужно прочитать файл.

Сериализация не подходит для длительного хранения.

Я бы предложил использовать небольшую встроенную базу данных. (Встроенная база данных - это база данных, которая выполняется в том же процессе, что и ваша программа). Обратите внимание, что Sun Java включает в себя Java DB, которая является версией Apache Derby. Существует также HSQLDB, еще одна небольшая и чистая база данных Java, которую можно использовать в качестве встроенной базы данных.

Вы можете использовать db4o для хранения данных. Это объектная база данных и поддерживает шифрование.

Возможно, вас заинтересует Quick'n'dirty персистентность для Java.

XML как метод сериализации более устойчив к будущим изменениям в вашей программе, которые будут регулировать хранилище, чем двоичные форматы, такие как объектная сериализация. Однако это сделало бы его очень читабельным и изменчивым для большинства пользователей.

Очень простое сжатие / распаковка остановит практически всех пользователей от получения реального содержимого данных. Использование GZipInputStream/GZipOutputStream вокруг вашего текущего потока записи сделает эту работу. Чем более тщательно вы защитите себя от посторонних, тем больше это повлияет на пользователей вашего программного обеспечения.

Лучше всего использовать в начале Java использование ObjectOutputStream или текстового файла. Если у вас есть больше опыта, вы можете использовать базы данных.

Как уже говорили другие, существует множество способов сериализации данных. Вы можете использовать что-то более легкое, например SQLite, или просто сериализацию. Просто поймите, что любые ваши попытки зашифровать данные могут быть побеждены, особенно в случае кода Java, поскольку его можно легко перевернуть.

Однако, если большинство ваших пользователей недостаточно технически, чтобы понять сложности обратного инжиниринга Java-программы, чтобы выяснить, как расшифровать ваши данные, вы должны быть в состоянии обойтись без некоторых основных методов шифрования, таких как упомянутый в другом ответе. и будь хорошим. Просто поймите, что всякий раз, когда что-то находится на машине, которую вы не контролируете, нет никакого способа удержать наиболее настойчивых пользователей от того, чтобы понять, как их взломать.

Лично я бы предложил использовать sqlite и использовать простое шифрование данных, которые вы вводите в поля, поэтому, если кто-то достаточно умен, чтобы иметь возможность подключиться к локальному файлу БД, ему все равно придется каким-то образом обратить ваш криптоалгоритм. 99,9% постоянных пользователей не будут беспокоиться об этом уровне расследования.

Как насчет сериализации?

Это не может быть прочитано пользователем, и это относительно легко.

Другие вопросы по тегам