Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现需要访问机密数据的Java桌面应用程序_Java_Design Patterns - Fatal编程技术网

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

实现需要访问机密数据的Java桌面应用程序,java,design-patterns,Java,Design Patterns,我有一个Java桌面应用程序(一个可运行的jar),它可以在CD中提供给客户端。然后“autorun.inf”自动启动jar,应用程序从CD运行(因此在只读环境中运行) 此应用程序需要访问一些已知数据并以某种方式使用它们。因为应用程序是独立的,所以这些数据应该以某种文件的形式随应用程序一起分发 现在是具有挑战性的目标: 这些数据只是数字列,类似于数据库表导出。访问它最方便的方式就是,如果它是一个数据库表,可以在其中对这些文件执行SQL查询 这些数据应该对用户客户保密。尽管数据必须随应用程序一起

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

此应用程序需要访问一些已知数据并以某种方式使用它们。因为应用程序是独立的,所以这些数据应该以某种文件的形式随应用程序一起分发

现在是具有挑战性的目标:

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

  • 这些数据应该对用户客户保密。尽管数据必须随应用程序一起分发,但用户无法阅读。因此,必须以某种方式对数据进行加密或模糊处理

因此,我恳请您的帮助,主要是为我指出一些想法,帮助我理解并与您讨论实现这些功能的最佳方式

事先非常感谢, 阿尔维斯

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

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

  • 如果它真的需要这样的文件,我是否可以将它们与应用程序一起发布,而不是动态创建

  • 只是确认一下,如果我使用加密的数据库,我必须在应用程序的某个地方放一个密钥,让我解密它,对吗


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

      有关SQLite中的加密,请参见此处:

      您可以使用。 SQLite数据库文件可以在应用程序的第一次启动时创建。 您只需测试SQLite数据库文件是否已存在:

      if (!new File(database_filename).exists()) {
          createNewDatabase();
      }
      
      SQLite数据库的路径存储在
      database\u filename
      变量中。 如果文件不存在,您可以将文件保存在用户的home dir中

      我在我的一个应用程序中使用以下代码创建带有外部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");
      
      }
      

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

      您的目标是绝对不可能的,原因很明显:您的应用程序显然需要读取加密数据(否则为什么要费心包括它),因此必须对其进行解密,因此必须将密钥存储在某个地方

      好了,你就是这样:你把加密的数据和解密它的密钥发送给客户机——怎样才能阻止他们做与你的应用程序相同的事情呢


      是的,它可能会阻止一些人获取您的数据,但对于那些甚至对正在发生的事情稍有了解的人来说,这是不安全的

      当然,必须包含数据库解密的关键,因此它不是完全“安全的”。我想知道是否有其他方法可以避免这个问题。我理解你的观点。如果我以某种方式加密我的数据文件,那么我必须在用户端解密它们,因此也给出了解决方案。这是否也说明了加密数据库引擎,如上面例举的那样?@alves Yep确实如此。保存加密数据的唯一方法是对密钥保密()。这意味着在任何情况下都不能将密钥发送给用户-如果您这样做,希望就破灭了。这也是软件中实现的每个DRM解决方案的基本问题。因此,对于我的情况,您建议如何使密钥可用?@alves您无法在客户端解密数据。您可以通过网络从安全服务器发送解密数据。但是:现在应用程序需要某种方式从服务器请求数据,我们又遇到了同样的问题。基本上,如果你想使用用户客户端上的一些数据,他们可以访问所有这些数据——没有什么可以绕过的。数十亿美元已经投入到“安全”的数字版权管理中,你可以看到它是如何运作的