实现需要访问机密数据的Java桌面应用程序

时间:2012-02-02 11:18:26

标签: java design-patterns

我有一个Java桌面应用程序(一个可运行的jar),可供CD中的客户端使用。然后“autorun.inf”自动启动jar,应用程序从CD运行(因此在只读环境中运行)。

此应用程序需要访问某些已知数据并以某种方式使用它。由于应用程序是独立的,因此应将此数据与应用程序一起分发到某种文件中。

现在出现了具有挑战性的目标:

  • 此数据只是数字列,类似于数据库表导出。访问它的最方便的方法就是如果它是一个数据库表,可以对这些文件进行SQL查询。

  • 此数据应对用户客户端保密。虽然数据必须随应用程序一起分发,但对用户来说并不易读。因此,必须以某种方式对数据进行加密或混淆。

所以我请求你的帮助,主要是向我指出一些有助于我理解和讨论的想法,这是实现这些功能的最佳方式。

非常感谢您提前, Alves的

编辑#1: 使用嵌入式数据库引擎是一个好主意,可以同时解决这两个问题。但它为我提出了一些问题:

  • 数据库引擎是否需要在某处写文件?我已经用HSQLDB做了一些测试,我认为确实如此。这是一个问题,因为应用程序是从CD运行的。

  • 如果确实需要这样的文件,我是否也可以使用该应用程序发布它们,而不是动态创建?

  • 只是为了确认,如果我使用加密数据库,我必须在应用程序的某处放置一个秘密密钥,它会让我解密它,对吗?

4 个答案:

答案 0 :(得分:2)

一种可能性是使用加密的SQLite数据库。 SQLite是一个关系数据库管理系统,数据库是文件。

对于SQLite中的加密,请在此处查看:http://www.hwaci.com/sw/sqlite/see.html

答案 1 :(得分:2)

你的目标是绝对不可能的,而且显而易见的原因是:你的应用程序显然需要读取加密数据(否则为什么要包括它),因此必须对其进行解密,因此必须将密钥存储在某处。

那么你就是:你发送了加密数据和密钥来解密它给客户端 - 什么阻止他们做你的应用程序做同样的事情?

是的,它可能会阻止某些人获取您的数据,但对于那些对发生的事情略有了解的人来说,这是无法安全的

答案 2 :(得分:1)

您可以将SQLiteSQLite Encryption Extension一起使用。 可以在应用程序的第一次启动时创建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");

}

答案 3 :(得分:1)

H2 Database也支持加密。尽管我喜欢SQLIte,但对于Java应用程序,我会选择H2。