我有一个Java桌面应用程序(一个可运行的jar),可供CD中的客户端使用。然后“autorun.inf”自动启动jar,应用程序从CD运行(因此在只读环境中运行)。
此应用程序需要访问某些已知数据并以某种方式使用它。由于应用程序是独立的,因此应将此数据与应用程序一起分发到某种文件中。
现在出现了具有挑战性的目标:
此数据只是数字列,类似于数据库表导出。访问它的最方便的方法就是如果它是一个数据库表,可以对这些文件进行SQL查询。
此数据应对用户客户端保密。虽然数据必须随应用程序一起分发,但对用户来说并不易读。因此,必须以某种方式对数据进行加密或混淆。
所以我请求你的帮助,主要是向我指出一些有助于我理解和讨论的想法,这是实现这些功能的最佳方式。
非常感谢您提前, Alves的
编辑#1: 使用嵌入式数据库引擎是一个好主意,可以同时解决这两个问题。但它为我提出了一些问题:
数据库引擎是否需要在某处写文件?我已经用HSQLDB做了一些测试,我认为确实如此。这是一个问题,因为应用程序是从CD运行的。
如果确实需要这样的文件,我是否也可以使用该应用程序发布它们,而不是动态创建?
只是为了确认,如果我使用加密数据库,我必须在应用程序的某处放置一个秘密密钥,它会让我解密它,对吗?
答案 0 :(得分:2)
一种可能性是使用加密的SQLite数据库。 SQLite是一个关系数据库管理系统,数据库是文件。
对于SQLite中的加密,请在此处查看:http://www.hwaci.com/sw/sqlite/see.html
答案 1 :(得分:2)
你的目标是绝对不可能的,而且显而易见的原因是:你的应用程序显然需要读取加密数据(否则为什么要包括它),因此必须对其进行解密,因此必须将密钥存储在某处。
那么你就是:你发送了加密数据和密钥来解密它给客户端 - 什么阻止他们做你的应用程序做同样的事情?
是的,它可能会阻止某些人获取您的数据,但对于那些对发生的事情略有了解的人来说,这是无法安全的
答案 2 :(得分:1)
您可以将SQLite与SQLite 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。