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.
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
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