2012-02-08 5 views
1

Je démarre HSQLDB en mode fichier. Ça fonctionne très bien. Lorsque mon code Java se termine, je ferme élégamment le HSQLDB en émettant SHUTDOWN. Cela supprime les fichiers temporaires qui ont été créés tels que .lck et .log, etc.HSQLDB .script file

Cependant, même après SHUTDOWN, deux fichiers sont toujours présents: .script et .properties.

Je sais que .script est utilisé si nous voulons redémarrer le HSQLDB et nous connecter à la base de données existante. C'est bon. Mais ce fichier contient les données brutes et peut donc être facilement modifié. Cela pourrait être un problème de sécurité. Est-ce que quelqu'un peut suggérer la meilleure façon possible de gérer cela? Dois-je encoder le fichier .script? Je préférerais toujours me connecter à la base de données déjà créée à un stade ultérieur, car c'est la seule raison pour laquelle je cours en mode fichier au lieu du mode en mémoire. Je ne veux pas utiliser le mode serveur (en mémoire). J'utilise JDK 1.7.0_02 et HSQLDB 2.2.5 sous Windows 7.

Merci.

Répondre

2

Si vous avez peur que quelqu'un voit le contenu du fichier directement .script vous pouvez chiffrer:

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

qui empêchera l'utilisateur de voir les données réelles dans le fichier.

Mais cela n'empêche pas les utilisateurs de modifier le fichier. Si l'utilisateur a un accès physique au fichier, vous ne pouvez pas l'empêcher.

+0

Merci pour le lien. C'est ce que je cherchais. Cependant, 1. Le cryptage est généralement efficace uniquement lorsque les utilisateurs qui ont accès à la clé de cryptage sont approuvés. Cela signifie que la clé DOIT être divulguée à l'utilisateur. 2. Une clé unique ne peut pas être utilisée pour plusieurs bases de données. Est-il possible que la base de données soit cryptée lorsqu'elle est créée et décryptée automatiquement (via un code interne dont l'utilisateur n'est pas au courant) lorsqu'elle y accède ultérieurement. Exposer des clés est toujours un gros casse-tête à retenir/maintenir si l'utilisateur crée plusieurs bases de données. – ParagJ

+1

La clé peut être cachée dans votre application sans la divulguer à l'utilisateur.Vous pouvez utiliser la même clé pré-générée pour plusieurs bases de données. – fredt

1

En utilisant cet exemple ici ->http://www.hsqldb.org/doc/1.8/guide/apb.html

J'ai fait un petit changement au code, qui crypter le fichier *.script en utilisant la clé AES.

code

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 

Jetez un oeil à la méthode main, qui a ces lignes

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

Lorsque le serveur est en cours d'exécution HSQLDB va créer un fichier avec l'extension .lck, qui sera là jusqu'à ce que le serveur est arrêté.

Pour générer une clé AES, vous pouvez utiliser https://asecuritysite.com/encryption/keygen ou utiliser CALL CRYPT_KEY('cypher_text', null);

Cela devrait faire l'affaire.