HSQLDB .script файл - PullRequest
       4

HSQLDB .script файл

3 голосов
/ 08 февраля 2012

Я запускаю HSQLDB в файловом режиме.Работает очень хорошо.Когда мой Java-код заканчивается, я элегантно закрываю HSQLDB, выдавая SHUTDOWN.Это удаляет временные файлы, которые были созданы, такие как .lck и .log, и т. Д.

Однако, даже после ОТКЛЮЧЕНИЯ всегда присутствуют два файла - .script и .properties.

Я знаю.скрипт используется, если мы хотим перезапустить HSQLDB и подключиться к уже существующей базе данных.Это хорошо.Но этот файл содержит необработанные данные и, следовательно, может быть легко изменен.Это может быть проблемой безопасности.

Может ли кто-нибудь предложить лучший реальный способ справиться с этим?Должен ли я кодировать файл .script?Я бы все же предпочел подключиться к уже созданной базе данных на более позднем этапе, потому что это единственная причина, по которой я использую файловый режим вместо режима в памяти.Я не хочу использовать режим сервера (в памяти).

Я использую JDK 1.7.0_02 и HSQLDB 2.2.5 в Windows7.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Если вы боитесь, что кто-то увидит содержимое файла .script напрямую, вы можете зашифровать его:

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

Это помешает пользователю увидеть реальные данные в файле.

Но это не мешает пользователям изменять файл.Если у пользователя есть физический доступ к файлу, вы не сможете предотвратить это.

1 голос
/ 07 апреля 2016

Используя этот пример здесь -> http://www.hsqldb.org/doc/1.8/guide/apb.html

Я внес небольшое изменение в код, который зашифрует файл *.script с помощью ключа AES.

Код

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

Взгляните на метод main, который имеет следующие строки

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

Когда сервер работает, HSQLDB создаст файл с расширением .lck, который будет существовать до завершения работы сервера.

Для генерации ключа AES вы можете использовать https://asecuritysite.com/encryption/keygen или CALL CRYPT_KEY('cypher_text', null);

Это должно сработать.

...