首页 > 数据库 >openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

时间:2023-11-12 19:01:03浏览次数:39  
标签:调用 int 数据库 密态 Connection openGauss pstmt

openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

121.1 连接密态数据库

连接密态数据库需要使用驱动包gsjdbc4.jar,具体JDBC连接参数参考基于JDBC开发章节介绍。JDBC支持密态数据库相关操作,需要设置enable_ce=1,示例如下。

public static Connection getConnect(String username, String passwd)
    {
        //驱动类。
        String driver = "org.opengauss.Driver";
        //数据库连接描述符。
        String sourceURL = "jdbc:opengauss://10.10.0.13:8000/postgres?enable_ce=1";
        Connection conn = null;
        
        try
        {
            //加载驱动。
            Class.forName(driver);
        }
        catch( Exception e )
        {
            e.printStackTrace();
            return null;
        }
        
        try
        {
             //创建连接。
            conn = DriverManager.getConnection(sourceURL, username, passwd);
            System.out.println("Connection succeed!");
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
        
        return conn;
    };

img 说明:

  • 【建议】使用JDBC操作密态数据库时,一个数据库连接对象对应一个线程,否则,不同线程变更可能导致冲突。
  • 【建议】使用JDBC操作密态数据库时,不同connection对密态配置数据有变更,由客户端调用isvalid方法保证connection能够持有变更后的密态配置数据,此时需要保证参数refreshClientEncryption为1(默认值为1),在单客户端操作密态数据场景下,refreshClientEncryption参数可以设置为0。

121.2 调用isValid方法刷新缓存示例

// 创建客户端主密钥
Connection conn1 = DriverManager.getConnection("url","user","password");

// conn1通过调用isValid刷新缓存
try {
 if (!conn1.getConnection().isValid(60)) {
  conn1.getFileWriter().writeLine("isValid Failed for connection 1");
 }
} catch (SQLException e) {
 conn1.getFileWriter().writeLine("isValid Failed with error");
 e.printStackTrace();
}

121.3 执行密态等值查询相关的创建密钥语句

// 创建客户端主密钥
Connection conn = DriverManager.getConnection("url","user","password");
Statement stmt = conn.createStatement();
int rc = stmt.executeUpdate("CREATE CLIENT MASTER KEY ImgCMK1 WITH ( KEY_STORE = localkms, KEY_PATH = \"key_path_value\" , ALGORITHM = RSA_2048));

img 说明: 创建密钥之前需要使用gs_ktool工具提前生成密钥,才能创建CMK成功。

// 创建列加密密钥
int rc2 = stmt.executeUpdate("CREATE COLUMN ENCRYPTION KEY ImgCEK1 WITH VALUES (CLIENT_MASTER_KEY = ImgCMK1, ALGORITHM  = AEAD_AES_256_CBC_HMAC_SHA256);");

121.4 执行密态等值查询相关的创建加密表的语句

int rc3 = stmt.executeUpdate("CREATE TABLE creditcard_info (id_number    int, name  varchar(50) encrypted with (column_encryption_key = ImgCEK1, encryption_type = DETERMINISTIC),credit_card  varchar(19) encrypted with (column_encryption_key = ImgCEK1, encryption_type = DETERMINISTIC));");
// 插入数据
int rc4 = stmt.executeUpdate("INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');");
// 查询加密表
ResultSet rs = null;
rs = stmt.executeQuery("select * from creditcard_info where name = 'joe';");
// 关闭语句对象
stmt.close();

121.5 执行加密表的预编译SQL语句

// 调用Connection的prepareStatement方法创建预编译语句对象。
PreparedStatement pstmt = con.prepareStatement("INSERT INTO creditcard_info VALUES (?, ?, ?);");
// 调用PreparedStatement的setShort设置参数。
pstmt.setInt(1, 2);
pstmt.setString(2, "joy");
pstmt.setString(3, "6219985678349800033");
// 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。
int rowcount = pstmt.executeUpdate();
// 调用PreparedStatement的close方法关闭预编译语句对象。
pstmt.close();

121.6 执行加密表的批处理操作

// 调用Connection的prepareStatement方法创建预编译语句对象。
Connection conn = DriverManager.getConnection("url","user","password");
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO batch_table (id, name, address) VALUES (?,?,?)");
// 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。
int loopCount = 20;
 for (int i = 1; i < loopCount + 1; ++i) {
      pstmt.setInt(1, i);
      pstmt.setString(2, "Name " + i);
      pstmt.setString(3, "Address " + i);
      // Add row to the batch.
      pstmt.addBatch();
}
// 调用PreparedStatement的executeBatch方法执行批处理。
int[] rowcount = pstmt.executeBatch();
// 调用PreparedStatement的close方法关闭预编译语句对象。
pstmt.close();

标签:调用,int,数据库,密态,Connection,openGauss,pstmt
From: https://blog.51cto.com/shuchaoyang/8330420

相关文章

  • 大型数据库实验四
    实验四--NOSQL和关系数据库的操作比较1、MYSQL数据库操作--新建一个Student表,并将数据录入进去:--SQL语句输出表中的所有记录:--查询zhangsan的computer成绩:--修改lisi的Math成绩,改为95:--使用Java客户端编程向Student表中添加一条数据:--使用java客户端编程查询Student......
  • 高斯数据库HCNA之数据控制
    四、数据控制1、事务控制事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位事务控制提供了事务的启动、提交、两阶段提交准备、回滚、设置隔离级别操作,并支持在事务中创建保存点GaussDB100没有提供显式定义事务开始的语句,第一个可执行SQL......
  • mysql ssh隧道连接数据库报错
    1.ssh隧道连接数据库报错:80070007:SSHTunnel:Serverdoesnotsupportdiffie-hellman-group1-sha1forkeyexchange①./etc/ssh/sshd_config最下面加入下面配置:KexAlgorithmsdiffie-hellman-group1-sha1,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp3......
  • Java基础、MySQL数据库、Web前端
    三、简答题(共10题,共30分)1、请写出CSS的6种选择器,并举例?l 标签选择器:a、li、div、table等等l 类选择器:.nav、.itemsl id选择器:#logo、#item1l 通配符选择器:*l 后代选择器:ulli、divaspan等l 并集选择器:li,div,h1l 交集选择器:li.item、input.username等2、将图片展示在网页......
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录
    使用ORDERBY进行排序使用ORDERBY语句按升序或降序对结果进行排序。ORDERBY关键字默认按升序排序。要按降序排序结果,使用DESC关键字。示例按名称按字母顺序排序结果:importmysql.connectormydb=mysql.connector.connect(host="localhost",user="yourusernam......
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录
    使用ORDERBY进行排序使用ORDERBY语句按升序或降序对结果进行排序。ORDERBY关键字默认按升序排序。要按降序排序结果,使用DESC关键字。示例按名称按字母顺序排序结果:importmysql.connectormydb=mysql.connector.connect(host="localhost",user="youruserna......
  • 数据库设计心得
     在设计一个数据库管理系统,涉及到多个关键表,如用户表、数据库表、日志表、反馈表、索引表和历史查询表.与其他项目不同的是,我们没设计一个表,就要实现相应的功能,所以表的设计和需求分析联系的更加紧密.用户表:用户表是系统的基础,要包含用户的基本信息;使用适当的加密算法来......
  • openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密
    openGauss学习笔记-120openGauss数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库120.1密态等值查询概述随着企业数据上云,数据的安全隐私保护面临越来越严重的挑战。密态数据库将解决数据整个生命周期中的隐私保护问题,涵盖网络传输、数据存储以及数据运行态;更进一步......
  • 高斯数据库HCNA之数据定义
    三、数据定义1、DDL分类DDL(DataDefinitionLanguage数据定义语言),用于定义或修改数据库中的对象,主要分为三种类型语句:CREATE、ALTER和DROPCREATE用来创建数据库对象ALTER用来修改数据库对象的属性DROP则是用来删除数据库对象2、数据库对象什么是数据库对象数据库对象是数据......
  • DM8数据库单机部署
    1.环境主备X86contos7 64位ulimit-adatasegsize          (kbytes,-d)unlimitedfilesize              (blocks,-f)unlimitedopenfiles                     (-n)65537virtualmemory         (kbytes,-v......