保序加密支持ORDER BY
功能描述
Vastbase支持OPE(保序加密)算法,这使得密态数据库中的表能够支持对密文列的排序操作。通过保序加密技术,即使是没有密钥的客户端用户也能根据密文列进行排序,且排序结果与有密文的客户端用户查到的排序结果保持一致,从而确保即使在不暴露密钥的情况下,排序操作也能得到正确的结果。
注意事项
- OPE仅支持整型字段加解密,不支持其它数据类型的保序加密。
- 密文列数据在进行(=、!=、<、<=、>、>=)运算仅支持btree索引。不支持其它类型的索引。
- 不支持密文字段的in、like条件查询。
- 未适配JDBC驱动,仅支持Libpq驱动。
- order by排序结果正确的前提是密文列的CEK是OPE算法。如果密文列的CEK非OPE算法,排序结果将会是错误的。
操作步骤
1、以操作系统用户vastbase登录CN(数据库实例)所在主机。
2、执行以下命令以连接到密态数据库。
vsql -p 5432 vastbase -r -C
3、创建客户端主密钥CMK,创建CMK的语法请参考CREATE CLIENT MASTER KEY。
CREATE CLIENT MASTER KEY ImgCMK WITH (KEY_STORE = localkms, KEY_PATH = "key_path_value2", ALGORITHM = RSA_2048);
4、创建列加密密钥CEK,并指定加密算法OPE,创建的CEK的语法请参考CREATE COLUMN ENCRYPTION KEY。
CREATE COLUMN ENCRYPTION KEY ImgCEK WITH VALUES (CLIENT_MASTER_KEY = ImgCMK, ALGORITHM = OPE);
5、创建加密表,对指定列进行加密。
CREATE TABLE test1(id int encrypted with(column_encryption_key=ImgCEK,encryption_type=DETERMINISTIC),name text default 'testaaa',c3 text not null);
6、向加密表插入数据。
INSERT INTO test1 VALUES(1,'asdfghjkl','a'),(2,null,'b'),(null,'','c'),(3,'','c');
7、在有密钥的客户端查询表test1数据,并根据密文列对表数据进行排序。
SELECT * FROM test1;
SELECT * FROM test1 order by id;
返回结果为:
id | name | c3
----+-----------+----
1 | asdfghjkl | a
2 | | b
| | c
3 | | c
(4 rows)
id | name | c3
----+-----------+----
1 | asdfghjkl | a
2 | | b
3 | | c
| | c
(4 rows)
8、退出密态数据库,并连接到非密态数据库。
vsql -p 5432 vastbase -r
9、在非密态数据库中,执行相同的查询语句将返回加密后的数据。
select * from test1;
select * from test1 order by id;
返回结果为:
id | name | c3
------------------------+-----------+----
\x011aefabd73435 | asdfghjkl | a
\x011aefabd73134313830 | | b
| | c
\x011aefabd73635353336 | | c
(4 rows)
id | name | c3
------------------------+-----------+----
\x011aefabd73435 | asdfghjkl | a
\x011aefabd73134313830 | | b
\x011aefabd73635353336 | | c
| | c
(4 rows)
在非密态数据库中,由于缺少解密密钥,加密列的数据将以加密后的形式显示。
10、退出非密态数据库,并连接到密态数据库,清理环境。
DROP TABLE test1;
DROP COLUMN ENCRYPTION KEY ImgCEK cascade;
DROP CLIENT MASTER KEY ImgCMK cascade;