全密态数据库等值查询
可获得性
本特性自V500R001C20版本开始引入。
特性简介
密态数据库意在解决数据全生命周期的隐私保护问题,使得系统无论在何种业务场景和环境下,数据在传输、运算以及存储的各个环节始终都处于密文状态。当数据拥有者在客户端完成数据加密并发送给服务端后,在攻击者借助系统脆弱点窃取用户数据的状态下仍然无法获得有效信息,从而起到保护数据隐私的能力。
客户价值
由于整个业务数据流在数据处理过程中都是以密文形态存在,通过全密态数据库,可以实现:
保护数据在云上全生命周期的隐私安全,无论数据处于何种状态,攻击者都无法从数据库服务端获取有效信息。
帮助云服务提供商获取第三方信任,无论是企业服务场景下的业务管理员、运维管理员,还是消费者云业务下的应用开发者,用户通过将密钥掌握在自己手上,使得高权限用户无法获取数据有效信息。
让云数据库服务借助全密态能力更好的遵守个人隐私保护方面的法律法规。
特性描述
在加解密阶段,为保证客户端能够自动化地对数据进行加解密,用户需在数据定义阶段定义加密方案。同时,GaussDB新增密钥管理语法,并支持第三方密钥管理工具,保证用户自主和灵活地选择加密方案。使用全密态数据库的整体流程分为如下四个阶段。
密钥实体管理阶段:通过独立的密钥管理工具/服务管理密钥实体。目前,GaussDB支持通过Huawei KMS对密钥进行独立管理。
Huawei KMS:由华为云提供的在线密钥管理服务,提供创建、删除、查询和备份密钥等功能,并支持在线使用密钥对数据进行加解密。
user_token:由用户提供的密码在客户端派生密钥,或者直接对接密钥。
third_kms:在加载第三方加密库后,由第三方加密库提供密钥管理服务。
NOTICE:
使用third_kms时,密钥由第三方加密库管理。第三方加密库并非华为提供,需要保证该动态库功能执行正常与安全。
如果第三方动态库异常或其他不可控因素,可能会导致数据库进程异常、进程崩溃、内存泄露等,需要联系第三方动态库进行解决,请谨慎使用。
密钥对象管理阶段:通过新增的密钥管理SQL语法管理密钥对象,新增语法如下。
CREATE COLUMN ENCRYPTION KEY:支持用户定义用于加密表中指定列的密钥对象,同时,该对象中存储了列加密密钥实体的密文。
CREATE CLIENT MASTER KEY:支持用户定义用于加密CEK的CMK对象,该CMK对象不存储CMK密钥实体,而是存储从独立密钥管理工具/服务中读取CMK密钥实体的方法。
数据定义阶段:新增对表中指定列进行加密定义的语法,新增语法如下。
CREATE TABLE … (column DATE_TYPE ENCRYPTED WITH …):支持用户指定CEK来加密指定的列。
数据加解密阶段:完成数据定义后,客户端便能够基于用户定义的加解密方案,自动地对表中数据进行加解密。
具体的语法可参考《开发者指南》中的“SQL参考 > SQL语法”章节。
特性增强
无。
特性约束
密钥实体管理约束。
仅支持使用密钥管理服务Huawei KMS管理CMK密钥实体。
密钥对象管理约束。
CREATE CLIENT MASTER语法中,KEY_PATH字段仅能指向外部密钥管理工具/服务中已存在的密钥;由Huawei KMS生成的密钥,仅能用于AES_256和SM4算法。
CREATE COLUMN ENCRYPTION KEY语法中,ALGORITHM仅支持AEAD_AES_256_CBC_HMAC_SHA256、AEAD_AES_128_CBC_HMAC_SHA256、AEAD_AES_256_CTR_HMAC_SHA256、AES_256_GCM和SM4_SM3。
如果使用由Huawei KMS生成CMK来加密CEK,在CREATE COLUMN ENCRYPTION KEY语法中,如果使用ENCRYPTED_VALUE字段,则该字段的长度需为16字节的整数倍。
数据以列级别进行加密,而无法按照行级别区分加密策略。
除Rename操作外,不支持通过Alter Table语法实现对加密表列的更改(包括加密列和非加密列之间的互转换),支持添加(Add)和删除(Drop)对应的加密列。
不支持对加密列设置大部分check限制性语法,但是支持check(column is not null)语法。
当support_extended_features = off时,不支持通过DISTRIBUTE BY子句指定加密列为分布列。当support_extended_features = on时,仅支持通过DISTRIBUTE BY子句指定确定性加密列为哈希分布列。
当support_extended_features = off时,不支持对加密列使用primary key、unique。当support_extended_features = on时,仅支持确定性加密列使用primary key、unique。
仅支持对加密列建btree索引以及ubtree索引,不支持建索引的时候使用加密列做过滤操作。
不支持不同数据类型之间的隐式转换。不支持转义字符。
不支持不同数据类型密文间的集合操作。
不支持加密列为数组类型。
不支持加密列创建分区。
加密列仅支持repeat和empty_blob()函数。
当前版本只支持gsql和JDBC(部署在linux操作系统)客户端,暂不支持ODBC等其他客户端实现密态等值查询。
只支持通过客户端执行copy from stdin的方式、\copy命令的方式以及insert into values(…)的方式往密态表中导入数据。
不支持从加密表到文件之间的copy操作。
不支持包括范围查询以及模糊查询等在内的除等值以外的各种密态查询。
支持部分函数存储过程密态语法,密态支持函数存储过程具体约束查看《开发者指南》的“设置密态等值查询 > 密态支持函数/存储过程”章节。
不支持通过insert into…select…,merge into语法将非加密表数据插入到加密表数据中。
仅JDBC客户端支持调用decryptData接口,将通过非密态连接、逻辑解码等其他方式获得的密文,对密文进行解密。调用方法查看《特性指南》中“设置密态等值查询 > 使用JDBC操作密态数据库 > 执行密态等值密文解密”。
对于处于连接状态的连接请求,只有触发更新缓存的操作(更改用户,解密加密列失败等)和重新建连后才能感知服务端CEK信息变更。
不支持在由随机加密算法加密的列上进行密态等值查询,仅支持简单插入语法及全表查询。
不支持不同精度、不同原始数据类型或使用不同列加密密钥加密的密文数据进行数据导入或等值比较。
密态等值查询不支持外表。
不支持针对包含加密列的密态表创建物化视图。
不支持针对包含加密列的密态表及基于密态表的视图、函数、存储过程创建同义词。
对于数据库服务侧配置变更(pg_settings系统表、权限、密钥和加密列等信息), 需要重新建立JDBC连接保证配置变更生效。
不支持多条SQL语句一起执行,insert into语句多批次执行场景不受此条约束限制。
密态数据库对长度为零的空字符串不进行加密。
确定性加密存在频率攻击的潜在风险,不建议在明文频率分布明显的场景下使用。
密态表不支持闪回drop,闪回查询和闪回表。
密态等值查询采用客户端默认精度,与服务端精度设置不相关。
COLLATE子句指定列的排序规则(该列必须是可排列的数据类型),加密列类型为非可排序的数据类型。
JDBC不支持加密列使用setBlob接口。
不支持使用prepare执行DDL操作。
当update语句有临时表时,where条件不支持加密列做查询条件。
创建预编译语句时,同一个参数请勿同时用于预编译语句中的加密列和非加密列参数。
使用密态数据库过程中,请勿将数据从一个加密列插入到另一个密钥加密的加密列中,如insert into t1 values(select * from t2),否则当该数据的密钥删除后,另一个密钥加密的加密列中有数据会获取不到该密钥。
当单事务中的加密字段多或者单次数据量过大,可能造成加密时间过长,产生超时等异常,建议拆分为子语句进行处理。
当使用third_kms时,密钥由第三方加解密库的KMS管理,数据库仅记录加解密所需密钥的ID。
当使用third_kms时,不支持密钥轮转语句轮转密钥。
原始类型为varchar、text、varchar2、clob、bytea的密文在数据导入时视为同一数据类型允许互相导入。
密态等值查询支持的数据类型包括:
数据类
类型
描述
整型
tinyint/tinyint(n)
微整数,同int1。
smallint
小整数,同int2。
int4
常用整数。
binary_integer
Oracle兼容类型,常用整数。
bigint/bigint(n)
大整数,同int8。
数值类型
numeric(p,s)
精度为p的准确数值类型。
number
Oracle兼容类型,等同numeric(p,s)。
浮点类型
float4
单精度浮点数。
float8
双精度浮点数。
double precision
双精度浮点数。
字符类型
char/char(n)
定长字符串,不足补空格,默认精度为1。
varchar(n)
变长字符串,n是指允许的最大字节长度。
text
文本类型。
varchar2(n)
Oracle兼容类型,等同varchar(n)。
clob
大文本类型。
二进制类型
bytea
变长的二进制字符串。
blob
二进制大对象。该类型按照字符串处理,不支持其他转换操作。
依赖关系
使用全密态相关特性建议更新至相同版本的libpq_ce客户端驱动及JDBC客户端。