首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HSQLDB .script文件

HSQLDB .script文件
EN

Stack Overflow用户
提问于 2012-02-08 18:26:47
回答 2查看 5.7K关注 0票数 3

我以文件模式启动HSQLDB。它运行得很好。当我的Java代码结束时,我通过发出SHUTDOWN命令优雅地关闭了HSQLDB。这将删除创建的临时文件,如.lck和.log等。

但是,即使在关机之后,也始终存在两个文件- .script和.properties。

我知道如果我们想要重新启动HSQLDB并连接到已经存在的数据库,就需要使用.script。那很好。但是这个文件包含原始数据,因此可以很容易地进行修改。这可能是一个安全问题。

有人能建议最好的可行方法来处理这个问题吗?我应该对.script文件进行编码吗?我仍然倾向于在以后的阶段连接到已经创建的数据库,因为这是我运行文件模式而不是内存模式的唯一原因。我不想使用服务器(内存中)模式。

我在Windows7上使用JDK 1.7.0_02和HSQLDB2.2.5。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-02-08 18:32:42

如果你害怕有人直接看到.script文件的内容,你可以对其进行加密:

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

这将阻止用户看到文件中的真实数据。

但这并不能阻止用户更改文件。如果用户具有对文件的物理访问权限,则无法阻止这种情况。

票数 3
EN

Stack Overflow用户

发布于 2016-04-07 14:49:27

在此处使用此示例-> http://www.hsqldb.org/doc/1.8/guide/apb.html

我对代码做了很小的修改,它将使用AES密钥加密*.script文件。

代码

代码语言:javascript
复制
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方法,它有以下几行代码

代码语言:javascript
复制
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/keygenCALL CRYPT_KEY('cypher_text', null);

这应该能起到作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9191484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档