Реализовать настольное Java-приложение, которому необходим доступ к конфиденциальным данным. - PullRequest
4 голосов
/ 02 февраля 2012

У меня есть настольное приложение Java (исполняемый файл jar), которое доступно клиентам на компакт-диске. Затем «autorun.inf» автоматически запускает jar, и приложение запускается с компакт-диска (следовательно, работает в среде только для чтения).

Это приложение должно получить доступ к некоторым известным данным и как-то их использовать. Поскольку приложение является автономным, эти данные следует распространять вместе с приложением в виде файлов.

Теперь наступают сложные цели:

  • Эти данные представляют собой просто столбцы чисел, аналогичные экспорту таблицы базы данных. И наиболее удобный способ доступа к нему был бы в точности такой, как если бы это была таблица базы данных, где можно выполнять SQL-запросы к этим файлам.

  • Эти данные должны быть конфиденциальными для пользователей клиентов. Хотя данные должны распространяться вместе с приложением, они не могут быть разборчивы для пользователей. Таким образом, данные должны быть каким-то образом зашифрованы или запутаны.

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

Большое спасибо заранее, Alves

Редактировать # 1: Использование встроенного ядра базы данных - отличная идея, которая решит обе проблемы одновременно. Но это вызывает у меня некоторые вопросы:

  • Нужно ли ядру базы данных записывать файлы куда-нибудь? Я сделал несколько тестов с HSQLDB, и я думаю, что это делает. Это может быть проблемой, поскольку приложение запускается с компакт-диска.

  • Если такие файлы действительно нужны, могу ли я их выпустить вместе с приложением вместо создания на лету?

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

Ответы [ 4 ]

2 голосов
/ 02 февраля 2012

Ваша цель абсолютно невозможна, и вполне очевидно, почему: вашему приложению, очевидно, необходимо прочитать зашифрованные данные (в противном случае зачем их включать), следовательно, необходимо их расшифровать, следовательно, где-то необходимо хранить ключи.

Ну вот, пожалуйста: вы отправили зашифрованные данные И ключ для расшифровки их клиенту - что мешает им делать то же самое, что делает ваше приложение?

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

2 голосов
/ 02 февраля 2012

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

Для шифрования в SQLite смотрите здесь: http://www.hwaci.com/sw/sqlite/see.html

1 голос
/ 02 февраля 2012

База данных H2 также поддерживает шифрование.Как бы мне не нравился SQLIte, для приложения Java я бы выбрал H2.

1 голос
/ 02 февраля 2012

Вы можете использовать SQLite с Расширением шифрования SQLite .Файл базы данных SQLite может быть создан при первом запуске приложения.Вы можете просто проверить, существует ли файл базы данных SQLite:

if (!new File(database_filename).exists()) {
    createNewDatabase();
}

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

В одном из моих приложений я использую следующий код для создания базы данных с внешним файлом сценария SQL.

public final void createNewDatabase() {
    InputStream inputStream = getClass().getResourceAsStream("database_create_script.sql");
    String sqlCommand = new Scanner(inputStream).useDelimiter("\\A").next();

    try {
        Statement statement = connection.createStatement();
        statement.executeUpdate(sqlCommand);
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    System.out.println("Database created");

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...