2012-02-08 6 views
1

HSQLDBをファイルモードで起動します。それは非常にうまくいく。 Javaコードが終了すると、SHUTDOWNを発行してHSQLDBをエレガントに閉じます。これにより、.lckや.logなどの一時ファイルが削除されます。HSQLDB .scriptファイル

しかし、SHUTDOWNの後でも、常に2つのファイルが存在します。--scriptと.properties。

私は、HSQLDBを再起動し、すでに存在しているデータベースに接続する場合には、.scriptが使用されることを知っています。それは良い。しかし、このファイルには生データが含まれているため、簡単に変更することができます。これはセキュリティ上の懸念になる可能性があります。

誰かがこれを処理する最も現実的な方法を提案できますか? .scriptファイルをエンコードする必要がありますか?私はまだメモリ内のファイルモードではなくファイルモードを実行している唯一の理由で、後で作成したデータベースに接続することをお勧めします。私はサーバー(メモリ内)モードを使用したくありません。

Windows7でJDK 1.7.0_02とHSQLDB 2.2.5を使用しています。

ありがとうございました。誰かがコンテンツを見ることを恐れている場合

答えて

2

.scriptファイルが直接、あなたはそれを暗号化することができます。ユーザーを防ぐことができます

http://hsqldb.org/doc/2.0/guide/management-chapt.html#mtc_encrypted_database

は、ファイル内の実際のデータを参照してください。

ただし、ユーザーがファイルを変更することはできません。ユーザーがファイルに物理的にアクセスできる場合、そのファイルを防ぐ方法はありません。ここで、この例を使用して

+0

リンクありがとうございます。これは私が探していたものです。ただし、 1.暗号化は、一般に、暗号鍵にアクセスできるユーザーが信頼できる場合にのみ有効です。これは、鍵をユーザに開示しなければならないことを意味する。 2.複数のデータベースでは、単一キーは使用できません。 データベースが作成されたときに暗号化され、後でそのデータベースにアクセスするときに(ユーザーが認識していない内部コードによって)データベースを自動的に復号化することは可能ですか?ユーザーが複数のデータベースを作成した場合でも、キーを公開することは、覚えておく/維持することに大きな悩みです。 – ParagJ

+1

キーは、ユーザーに公開せずにアプリケーション内に隠すことができます。複数のデータベースに対して同じ事前生成キーを使用できます。 – fredt

1

- >http://www.hsqldb.org/doc/1.8/guide/apb.html

私は、AESキーを使用して*.scriptファイルを暗号化するコードに小さな変更を行いました。

コード

package com.gollahalli.main; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 
import org.hsqldb.Server; 

public class Testdb { 

    Connection conn;            //our connnection to the db - presist for life of program 

    // we dont want this garbage collected until we are done 
    public Testdb(String db_file_name_prefix) throws Exception { 

     Class.forName("org.hsqldb.jdbcDriver"); 

     conn = DriverManager.getConnection("jdbc:hsqldb:" 
       + db_file_name_prefix, // filenames 
       "sa", // username 
       "");      // password 
    } 

    public void shutdown() throws SQLException { 

     Statement st = conn.createStatement(); 

     st.execute("SHUTDOWN"); 
     conn.close(); // if there are no other open connection 
    } 

//use for SQL command SELECT 
    public synchronized void query(String expression) throws SQLException { 

     Statement st = null; 
     ResultSet rs = null; 

     st = conn.createStatement();   // statement objects can be reused with 

     rs = st.executeQuery(expression); // run the query 

     dump(rs); 
     st.close(); // NOTE!! if you close a statement the associated ResultSet is 

    } 

//use for SQL commands CREATE, DROP, INSERT and UPDATE 
    public synchronized void update(String expression) throws SQLException { 

     Statement st = null; 

     st = conn.createStatement(); // statements 

     int i = st.executeUpdate(expression); // run the query 

     if (i == -1) { 
      System.out.println("db error : " + expression); 
     } 

     st.close(); 
    } // void update() 

    public static void dump(ResultSet rs) throws SQLException { 

     ResultSetMetaData meta = rs.getMetaData(); 
     int colmax = meta.getColumnCount(); 
     int i; 
     Object o = null; 

     for (; rs.next();) { 
      for (i = 0; i < colmax; ++i) { 
       o = rs.getObject(i + 1); // Is SQL the first column is indexed 

       // with 1 not 0 
       System.out.print(o.toString() + " "); 
      } 

      System.out.println(" "); 
     } 
    }          //void dump(ResultSet rs) 

    public static void main(String[] args) { 

     Server server = new Server(); 
     server.setDatabasePath(0, "file:./RemindMe;crypt_key=604a6105889da65326bf35790a923932;crypt_type=AES"); 
     server.setDatabaseName(0, "RemindMe"); 
     server.start(); 

     Testdb db = null; 

     try { 
      db = new Testdb("RemindMe"); 
     } catch (Exception ex1) { 

      return;     // bye bye 
     } 

     try { 

      db.update(
        "CREATE TABLE sample_table (id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)"); 
     } catch (SQLException ex2) { 

     } 

     try { 

      db.update(
        "INSERT INTO sample_table(str_col,num_col) VALUES('Ford', 100)"); 
      db.update(
        "INSERT INTO sample_table(str_col,num_col) VALUES('Toyota', 200)"); 
      db.update(
        "INSERT INTO sample_table(str_col,num_col) VALUES('Honda', 300)"); 
      db.update(
        "INSERT INTO sample_table(str_col,num_col) VALUES('GM', 400)"); 

      // do a query 
      db.query("SELECT * FROM sample_table WHERE num_col < 250"); 

      // at end of program 
      db.shutdown(); 
     } catch (SQLException ex3) { 
     } 

     server.shutdown(); 
    } // main() 
} // class Testdb 

サーバはHSQLDBをされる、拡張子.lckを持つファイルが作成されます実行している場合は、これらの線

Server server = new Server(); 
server.setDatabasePath(0, "file:./RemindMe;crypt_key=604a6105889da65326bf35790a923932;crypt_type=AES"); 
server.setDatabaseName(0, "RemindMe"); 
server.start(); 
..... 
server.shutdown(); 

を持ってmain方法、を見てみましょうサーバーがシャットダウンするまで

あなたがhttps://asecuritysite.com/encryption/keygenを使用するか、これはトリックを行う必要がありますCALL CRYPT_KEY('cypher_text', null);

を使用することができますAESキーを生成します。