【GaussDB】全密态等值查询功能测试及全密态技术介绍

【GaussDB】全密态等值查询功能测试

一、引言

全密态要解决的问题重点在于,认为服务提供方是不可信的,即网络传输和数据库存储都可能存在数据泄露的风险,因此网络传输和数据库存储都要加密,且要求服务提供方无法自行解密,只有受信的客户端能解密。

由于常规的数据库设计,SQL执行层都是在数据库服务端,必然会涉及到对数据的访问和计算,因此最大的难点就在于如何在数据库自身无法解密数据的情况下还能对数据进行访问和计算。在这种限制下,就连最简单的等值查询都有技术挑战,除非使用确定性加密,但确定性加密,对于重复度高的数据,很容易破解,比如性别。

全密态的最终目标是全同态,即能支持任意类型的计算(比如 ,在不知道密钥的情况下,能计算出”1的密文加2的密文等于3的密文“)。虽然全同态至今已经发展了几十年,但现有的全同态方案效率仍然是极低,如果把全同态技术放在通用的数据库软件里,其性能的削减程度是无法接受的。

二、基本测试

创建用户

gaussdb=# CREATE USER alice PASSWORD 'Gaussdb@123';
CREATE ROLE
gaussdb=# \q

gsql全密态连接

连接时要加 -C ,如果是其他客户端,需要使用对应的全密态版本驱动或加载对应的动态库

[gaussdb@01c3b6b51da2 data]$ gsql -d postgres -U alice -WGaussdb@123 -r -C
gsql ((GaussDB Kernel 506.0.0.SPC0100 build e324981f) compiled at 2025-04-27 14:27:52 last mr 23420 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

设置密钥

注意每次使用密态连接都要先设置密钥。当密钥类型为user_token时,表示不依赖外部服务或硬件,此时只需要设置密码;另外可选的有华为云在线的kms或者第三方加密卡的kms

gaussdb=> \key_info keyType=user_token,password=Gaussdb@123

注:openGauss的本地密钥和GaussDB的user_token不一样,openGauss的叫
localkms,以文件形式保存在服务端,无需密码;而GaussDB的user_token仅在客户端,服务端不进行存储也无法主动获知。

创建主密钥

在key_store里选择刚刚设置的类型

gaussdb=> CREATE CLIENT MASTER KEY alice_cmk WITH ( KEY_STORE = user_token , ALGORITHM = AES_256_GCM );
CREATE CLIENT MASTER KEY

创建列密钥

gaussdb=> CREATE COLUMN ENCRYPTION KEY cek1 WITH VALUES (CLIENT_MASTER_KEY = alice_cmk, ALGORITHM = AES_256_GCM);
CREATE COLUMN ENCRYPTION KEY

创建具有加密列的表,并插入数据

gaussdb=> CREATE TABLE creditcard_info (
gaussdb(>   id_number int,
gaussdb(>   name text encrypted with (column_encryption_key = cek1, encryption_type = DETERMINISTIC),
gaussdb(>   credit_card varchar(19) encrypted with (column_encryption_key = cek1, encryption_type = DETERMINISTIC));
CREATE TABLE
gaussdb=> INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');
INSERT 0 1
gaussdb=> INSERT INTO creditcard_info VALUES (2, 'joy','6219985678349800033');
INSERT 0 1

使用等值条件查询数据

能查询出明文数据

gaussdb=> select * from creditcard_info where name = 'joe';
 id_number | name |     credit_card   
-----------+------+---------------------
         1 | joe  | 6217986500001288393
(1 row)

更新数据

也能正常更新

gaussdb=> update creditcard_info set credit_card = '80000000011111111' where name = 'joy';
UPDATE 1

模糊查询

加密列无法模糊查询

gaussdb=> select * from creditcard_info where name like 'j%';
ERROR(CLIENT): operator is not allowed on datatype of this column

范围查询

加密列无法范围查询

gaussdb=> select * from creditcard_info where name >'a';
ERROR(CLIENT): operator is not allowed on datatype of this column
gaussdb=> \q

使用非密态连接

[gaussdb@01c3b6b51da2 data]$ gsql -d postgres -U alice -WGaussdb@123 -r 
gsql ((GaussDB Kernel 506.0.0.SPC0100 build e324981f) compiled at 2025-04-27 14:27:52 last mr 23420 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

对加密列进行等值查询

报错

gaussdb=> select * from creditcard_info where name = 'joe';
ERROR:  The entered syntax is not supported by the byteawithoutorderwithequalcol type.
LINE 1: select * from creditcard_info where name = 'joe';
                                                   ^

不带过滤条件进行查询

能看到加密列的数据都为密文,而且长度已经超过了定义的长度

 gaussdb=> select * from creditcard_info;  id_number |                 

> name                                        |                         
> credit_car d                                     
> -----------+------------------------------------------------------------------------------------+--------------------------------------------------------------
> ------------------------------------------------------
>          1 | 

\x01eaa587da4b8a0ed0d3ec32ce1284a6e1b82e69d4310000000d5762f944388244665aa54c12b31b

| \x01eaa587dab33533b2e2114abbd025a680f72cf95231000000cedfd5255
e15ade775ec81d734c2dc4ea4277aad3d70bad0eb38e3121bac45
2 | \x01eaa587da331c34df8a04c86ae4d1ed3102d0738631000000102d852e9ce5d5c388c21ab793463e
| \x01eaa587da8e633482090e8b78f79598d11ec27486310000007cd9ea54c
fc38269b6a2a14f1bb5e814774b45bbd317188b6b7eb176ce (2 rows)

表结构显示

虽然字段类型显示为varchar,但实际上已经已经变成了二进制类型

gaussdb=> \dS+ creditcard_info
                            Table "alice.creditcard_info"
   Column    |       Type        | Modifiers  | Storage  | Stats target | Description 
-------------+-------------------+------------+----------+--------------+-------------
 id_number   | integer           |            | plain    |              | 
 name        | text              |  encrypted | extended |              | 
 credit_card | character varying |  encrypted | extended |              | 
Has OIDs: no
Options: orientation=row, compression=no, storage_type=USTORE, segment=off, toast.storage_type=USTORE, toast.toast_storage_type=enhanced_toast

gaussdb=>

三、内存解密逃生通道

内存解密作为密态等值查询的一个逃生通道使用。在该逃生通道中,会将密钥传输到数据库内存中,对数据进行解密,以实现密文字段的特殊计算或查询功能,包括范围查询、排序;其他涉及密文操作、隐式或显式类型转换时,进行自动加解密。

逃生连接

加-C3进行连接

[gaussdb@01c3b6b51da2 data]$ gsql -d postgres -U alice -WGaussdb@123 -r -C3
gsql ((GaussDB Kernel 506.0.0.SPC0100 build e324981f) compiled at 2025-04-27 14:27:52 last mr 23420 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

设置密钥信息

gaussdb=> \key_info keyType=user_token,password=Gaussdb@123

默认情况,非等值查询报错

gaussdb=> select * from creditcard_info where name like 'j%';
ERROR:  The entered syntax is not supported by the byteawithoutorderwithequalcol type.
LINE 1: select * from creditcard_info where name like 'j%';
                                                      ^

传输密钥后再使用非等值查询,不报错

gaussdb=> \st
Token cache enabled in Trusted Domain.
gaussdb=> select * from creditcard_info where name like 'j%';
 id_number | name |     credit_card   
-----------+------+---------------------
         1 | joe  | 6217986500001288393
         2 | joy  | 80000000011111111
(2 rows)

四、FAQ

透明加密和全密态有什么区别?
答:透明加密和全密态都可以加密数据,但这是两种不同的加密模式,具体区别如下:

加密位置不同:透明加密在数据库存储模块后加密,全密态在数据库驱动中加密。
加密对象不同:透明加密数据页中的全部数据,全密态加密SQL语句中的某几列数据。
加密性能不同:透明加密一次可以处理8k的数据页,全密态一次仅可以处理SQL语句中的一条数据,透明加密性能高于全密态。
安全性不同:全密态安全性高于透明加密。

五、总结

GaussDB的全密态等值查询功能测试基本符合预期,但是用户必须要清楚其使用场景。使用全密态的副作用并不仅仅是性能下降那么简单,其原理上就限制了非常多的使用场景是无法支持的。
不过如果期望的效果是数据库服务器最高权限被黑,网络被黑,涉密数据也不会明文泄露,那么全密态可能是唯一的选择了。

<think>好的,我现在需要帮助用户了解全密态数据库的特点,特别是加、数据处理和安全性方面。根据用户提供的引用资料,我需要先仔细分析每个引用中的信息,然后整合出相关的特点。 首先,引用[2]提到全密态数据库的核心任务是保护数据全生命周期的安全,并且支持基于文的检索计算。这说明加覆盖了整个生命周期,包括存储、传输和处理,同时加后的数据还能进行运算,这一点很关键。 接下来,引用[3]强调数据在传输、运算和存储各个环节都保持文状,即使在客户端加后,攻击者也无法获取有效信息。这里需要突出全生命周期的加和客户端的自主控制,以及文处理的能力。 然后,引用[4]指出全密态数据库在云环境中保护数据隐私,即使高权限用户也无法访问明文数据,这涉及到钥管理和合规性。需要说明钥由用户掌握,内部人员无法解,以及符合隐私法规的特点。 关于安全性,引用[2]和[4]都提到即使数据库被攻击或内部人员有高权限,数据仍安全,这得益于强加算法和钥隔离。需要强调加算法的强度和钥的独立管理。 数据处理方面,引用[2]和[4]提到支持文状下的等值查询和计算,这不同于传统加后无法操作数据的情况,是重要特点。 现在需要将这些信息组织成清晰的结构,分为加范围、数据处理、安全性三个部分,每个部分下详细说明特点,并正确引用对应的来源。同时确保使用中文,符合格式要求,如数学表达式用$...$,独立公式用$$...$$,但当前内容可能较少涉及数学公式,但如果有相关表达式需要处理的话要注意格式。最后生成相关问题,确保问题与内容相关,并基于引用资料。 需要检查是否有遗漏的信息,比如引用[1]提到数据安全在存储、传输和使用中的完整性,但用户的问题主要是全密态数据库,所以可能引用[1]相关度较低,但如果有相关内容需要整合。不过根据用户给出的引用,主要信息集中在引用2、3、4,所以应该以这些为主。 最后确保回答结构清晰,分点说明特点,并在每个特点后添加正确的引用标识,例如[^2],[^3]等。然后生成三个相关问题,确保问题与全密态数据库的特点、加方式、应用场景等相关。</think>### 全密态数据库的特点分析 全密态数据库通过创新的加技术和数据处理机制,实现了数据全生命周期的隐私保护。以下是其核心特点的详细说明: --- #### 一、**加范围覆盖数据全生命周期** 1. **端到端加** 数据在客户端完成加后传输至服务端,存储、传输、计算等所有环节均保持文状。攻击者即使窃取数据库内容或监听传输过程,也无法解析有效信息。 $$ \text{客户端加}(K, D) \rightarrow C \quad (\text{钥}K, \text{明文}D, \text{文}C) $$ 2. **全状** 数据在存储(静)、传输(动)、运算(使用中)三种状下均以文形式存在,确保任何环节的数据隐私[^4]。 --- #### 二、**支持文数据处理** 1. **等值查询** 在无需解的情况下,可直接对加数据执行等值比较操作(如`WHERE column = value`),突破了传统加技术无法支持数据计算的限制。 (示例:查询`SELECT * FROM table WHERE encrypted_id = 'x1y2z3'`) 2. **安全计算能力** 通过结合同、可信执行环境(TEE)等技术,支持有限范围的文运算(如统计、聚合),同时保证运算结果的安全性。 --- #### 三、**多层安全防护机制** 1. **钥与数据隔离** 加钥由用户自主管理,与数据库服务端完全分离。即使云服务商或内部管理员拥有高权限,也无法获取钥或解数据。 $$ \text{安全模型:} \quad \text{攻击者} \cap (\text{文数据} + \text{无钥}) = \text{无效信息} $$ 2. **抵御内部威胁** 通过权限分离设计,避免DBA、运维人员等角色直接接触明文数据,降低内部泄露风险。 3. **符合隐私法规** 满足GDPR等数据隐私法规的要求,特别适用于金融、医疗等敏感领域的数据上云场景。 --- ### 总结 全密态数据库通过**全生命周期加**、**文计算能力**和**钥自主控制**三大核心特点,解决了传统加技术无法兼顾数据安全与可用性的问题。其技术实现依赖于客户端加、同算法和严格的权限隔离机制,最终达到“数据可用不可见”的目标[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值