功能支持

本文介绍全密态数据库的功能支持情况。

前提条件

本文介绍的全密态数据库支持的功能,支持的PolarDB PostgreSQL版的版本如下:

PostgreSQL 14(内核小版本14.9.14.0及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:

PostgreSQL 14

select 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

SELECT col1, col2
    FROM table_name
    WHERE ciphertext_col1 > ciphertext_col2 
    ORDER BY col1;

ORDER BY

GROUP BY

SELECT col1, count(*)
    FROM table_name
    GROUP BY col1
    HAVING col1 IS NOT NULL;

HAVING

INTERSECT

SELECT ACCOUNT 
    FROM table_name
    WHERE col1 IS NOT NULL
EXCEPT
    SELECT ACCOUNT 
    FROM table_name
    WHERE ciphertext_col1 > ciphertext_col2 
LIMIT 1;

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授权。