本文介绍全密态数据库的功能支持情况。
前提条件
本文介绍的全密态数据库支持的功能,支持的PolarDB PostgreSQL版(兼容Oracle)的版本如下:
Oracle 2.0(内核小版本2.0.14.14.0及以上)
您可通过如下语句查看PolarDB PostgreSQL版(兼容Oracle)的内核小版本的版本号:
SHOW polar_version;
功能限制
暂不支持明文列与密文列混合运算,例如:
SELECT * FROM table_name WHERE plaintext_col < ciphertext_col;
。说明示例中
table_name
表示表名,plaintext_col
表示明文列,ciphertext_col
表示密文列。全密态数据库不提供用户主密钥的生成和备份服务,您需要自行生成用户主密钥。一旦您丢失密钥,将无法再访问已有的数据。因此我们建议您妥善备份用户主密钥。
支持的数据类型和相关算子
全密态数据库定义并新增了以下数据类型,这些数据类型及其相应算子的范围内,支持SQL查询与事务,兼容标准SQL语法。
数据类型 | 说明 | 支持密文计算 |
enc_int4 | 加密后的整型数,对应的明文数据为4字节整型数。 | +、-、*、/、%、>、=、<、>=、<=、!= |
enc_int8 | 加密后的整型数,对应的明文数据为8字节整型数。 | |
enc_float4 | 加密后的浮点数,对应的明文数据为4字节单精度浮点数。 | +、-、*、/、>、=、<、>=、<=、!= |
enc_float8 | 加密后的浮点数,对应的明文数据为8字节双精度浮点数。 | +、-、*、/、>、=、<、>=、<=、!=、pow |
enc_decimal | 加密后的十进制数,对应的明文数据类型为decimal。 | +、-、*、/、>、=、<、>=、<=、!=、pow、% |
enc_text | 加密后的可变长度字符串,对应的明文数据类型为text,编码为UTF-8。 | substr/substring、||、like、~~、!~~、>、=、<、>=、<=、!= |
enc_timestamp | 加密后的时间戳记,对应的明文数据类型为timestamp without time zone。 | extract year、>、=、<、>=、<=、!= |
det_type | 加密后的任意数据,相同的明文数据加密得到相同的密文数据。 | = |
rnd_type | 加密后的任意数据,相同的明文数据加密得到不同的密文数据。 | NA(仅支持密文存储,不支持密文计算) |
ore_int8 | 保序加密后的整型数,对应的明文数据为8字节整型数。不依赖可信硬件。 | >、=、<、>=、<=、!= |
ore_float8 | 保序加密后的浮点数,对应的明文数据为8字节双精度浮点数。不依赖可信硬件。 | >、=、<、>=、<=、!= |
示例SQL:
CREATE TABLE example (
account enc_int4, -- 账户号码,对应明文的integer类型
name enc_text, -- 姓名,对应明文的text类型
balance enc_float4, -- 账户余额,对应明文的real类型
credit enc_float4, -- 信用额度,对应明文的real类型
quota real, -- 明文列
address enc_text, -- 地址,对应明文的text类型
remark text, -- 备注
PRIMARY KEY (account) -- 以account为主键
);
查询子句
全密态数据库支持如下常见数据库查询所需的子句。
示例中table_name
表示表名,col
表示列名,ciphertext_col
表示密文列。
子句 | 示例 |
WHERE |
|
ORDER BY | |
GROUP BY |
|
HAVING | |
INTERSECT |
|
EXCEPT | |
UNION | |
LIMIT | |
OFFSET |
索引加速
全密态数据库支持在加密列建立索引,以加速各类查询操作。例如:
CREATE INDEX IF NOT EXISTS name_index_btree on table_name USING btree (name);
CREATE INDEX IF NOT EXISTS name_index_hash on table_name USING hash (name);
多用户授权
在全密态数据库中,不同用户之间天然存在密文数据隔离,可以通过签发BCL(Behavior Control List)授权,实现不同用户之间数据融合计算。更多信息请参见授权多用户访问。
明文-密文类型转换
全密态数据库支持修改列类型(明文类型修改为密文类型,密文类型修改为明文类型)。更多信息请参见明文和密文的转换。
使用该功能前,当前用户需要先获得BCL授权。