数据库密态等值查询概述及操作

一、密态等值查询概述

随着企业数据上云,数据的安全隐私保护面临越来越严重的挑战。密态数据库将解决数据整个生命周期中的隐私保护问题,涵盖网络传输、数据存储以及数据运行态;更进一步,密态数据库可以实现云化场景下的数据隐私权限分离,即实现数据拥有者和实际数据管理者的数据读取能力分离。密态等值查询将优先解决密文数据的等值类查询问题。密态等值查询目前支持客户端工具 gsql 和 JDBC。接下来分别介绍如何使用客户端工具执行密态等值查询的相关操作。

二、使用 gsql 操作密态数据库

操作步骤

以操作系统用户 omm 登录主节点。

执行以下命令打开密态开关,连接密态数据库。

gsql-pPORTpostgres-r-C

这里,PORT需要替换为实际值。

创建客户端主密钥 CMK 和列加密密钥 CEK。

--创建客户端加密主密钥(CMK)
openGauss=# CREATECLIENTMASTERKEYImgCMK1WITH (KEY_STORE=localkms, KEY_PATH="key_path_value1", ALGORITHM=RSA_2048);
openGauss=# CREATECLIENTMASTERKEYImgCMKWITH (KEY_STORE=localkms, KEY_PATH="key_path_value2", ALGORITHM=RSA_2048);
openGauss=# CREATECOLUMNENCRYPTIONKEYImgCEK1WITHVALUES (CLIENT_MASTER_KEY=ImgCMK1, ALGORITHM=AEAD_AES_256_CBC_HMAC_SHA256);
CREATECOLUMNENCRYPTIONKEY
openGauss=# CREATECOLUMNENCRYPTIONKEYImgCEKWITHVALUES (CLIENT_MASTER_KEY=ImgCMK, ALGORITHM=AEAD_AES_256_CBC_HMAC_SHA256);
CREATECOLUMNENCRYPTIONKEY

查询存储密钥信息的系统表结果如下:

openGauss=# SELECT*FROMgs_client_global_keys;
global_key_name|key_namespace|key_owner|key_acl|create_date
-----------------+---------------+-----------+---------+----------------------------
imgcmk1|2200|10||2021-04-2111:04:00.656617
imgcmk|2200|10||2021-04-2111:04:05.389746
(2rows)
openGauss=# SELECTcolumn_key_name,column_key_distributed_id ,global_key_id,key_ownerFROMgs_column_keys;
column_key_name|column_key_distributed_id|global_key_id|key_owner
-----------------+---------------------------+---------------+-----------
imgcek1|760411027|16392|10
imgcek|3618369306|16398|10
(2rows)

创建加密表:

openGauss=# CREATETABLEcreditcard_info (id_numberint, nametextencryptedwith (column_encryption_key=ImgCEK, encryption_type=DETERMINISTIC),
credit_cardvarchar(19) encryptedwith (column_encryption_key=ImgCEK1, encryption_type=DETERMINISTIC));
NOTICE: The'DISTRIBUTE BY'clauseisnotspecified. Using'id_number'asthedistributioncolumnbydefault.
HINT: Pleaseuse'DISTRIBUTE BY'clausetospecifysuitabledatadistributioncolumn.
CREATETABLE

查询表的详细信息如下,Modifiers 值为 encrypted 则表示该列是加密列。

openGauss=# \dcreditcard_info
Table"public.creditcard_info"
Column|Type|Modifiers
-------------+-------------------+------------
id_number|integer|
name|text|encrypted
credit_card|charactervarying|encrypted

向加密表插入数据并进行等值查询。

openGauss=# INSERTINTOcreditcard_infoVALUES (1,'joe','6217986500001288393');
INSERT01
openGauss=# INSERTINTOcreditcard_infoVALUES (2, 'joy','6219985678349800033');
INSERT01
openGauss=# select*fromcreditcard_infowherename='joe';
id_number|name|credit_card
-----------+------+---------------------
1|joe|6217986500001288393
(1row)
注意:使用非密态客户端查看该加密表数据时是密文
openGauss=# selectid_number,namefromcreditcard_info;
id_number|name
-----------+------------------------------------------------------------------------------------------------------------------------------------------------------
1| \x011aefabd754ded0a536a96664790622487c4d366d313aecd5839e410a46d29cba96a60e4831000000ee79056a114c9a6c041bb552b78052e912a8b730609142074c63791abebd0d38
2| \x011aefabd76853108eb406c0f90e7c773b71648fa6e2b8028cf634b49aec65b4fcfb376f3531000000f7471c8686682de215d09aa87113f6fb03884be2031ef4dd967afc6f7901646b
(2rows)

(可选)对加密表进行 alter 和 update 操作。

openGauss=# ALTERTABLEcreditcard_infoADDCOLUMNageintENCRYPTEDWITH (COLUMN_ENCRYPTION_KEY=ImgCEK, ENCRYPTION_TYPE=DETERMINISTIC);
ALTERTABLE
openGauss=# \dcreditcard_info
Table"public.creditcard_info"
Column|Type|Modifiers
-------------+-------------------+------------
id_number|integer|
name|text|encrypted
credit_card|charactervarying|encrypted
age|integer|encrypted
openGauss=# ALTERTABLEcreditcard_infoDROPCOLUMNage;
ALTERTABLE
openGauss=# updatecreditcard_infosetcredit_card='80000000011111111'wherename='joy';
UPDATE1
openGauss=# select*fromcreditcard_infowherename='joy';
id_number|name|credit_card
-----------+------+-------------------
2|joy|80000000011111111
(1row)

三、使用 JDBC 操作密态数据库

连接密态数据库

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

enable_ce=1,示例如下:

publicstaticConnectiongetConnect(Stringusername, Stringpasswd)
{
//驱动类。
Stringdriver="org.postgresql.Driver";
//数据库连接描述符。
StringsourceURL="jdbc:postgresql://10.10.0.13:8000/postgres?enable_ce=1";
Connectionconn=null;

try
{
//加载驱动。
Class.forName(driver);
}
catch( Exceptione )
{
e.printStackTrace();
returnnull;
}

try
{
//创建连接。
conn=DriverManager.getConnection(sourceURL, username, passwd);
System.out.println("Connection succeed!");
}
catch(Exceptione)
{
e.printStackTrace();
returnnull;
}

returnconn;
};

说明:

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

调用 isValid 方法刷新缓存示例

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

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

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

// 创建客户端主密钥
Connectionconn=DriverManager.getConnection("url","user","password");
Statementstmt=conn.createStatement();
intrc=stmt.executeUpdate("CREATE CLIENT MASTER KEY ImgCMK1 WITH ( KEY_STORE = gs_ktool, KEY_PATH = \"gs_ktool/1\", ALGORITHM = AES_256_CBC;");
intrc=stmt.executeUpdate("CREATE CLIENT MASTER KEY ImgCMK1 WITH ( KEY_STORE = localkms, KEY_PATH = \"key_path_value\" , ALGORITHM = RSA_2048);

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

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

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

intrc3=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));");
// 插入数据
intrc4=stmt.executeUpdate("INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');");
// 查询加密表
ResultSetrs=null;
rs=stmt.executeQuery("select * from creditcard_info where name = 'joe';");
// 关闭语句对象
stmt.close();

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

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

执行加密表的批处理操作

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

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/239953.html<

(0)
管理的头像管理
上一篇2025-04-23 15:44
下一篇 2025-04-23 15:46

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注