前言
透明加密是指将数据库page加密后写入磁盘,当需要读取对应page时进行加密读取。此过程对于用户是透明, 用户无需干预。
该文档进行数据库KingbaseES V8R3版本测试透明加密功能,需要说明,该版本发布时间早于KingbaseES V8R6,所以只能进行表加密,而没有表空间加密功能。
测试透明加密
参数说明:
a) encrypt_user_table:布尔型。
b) 参数级别:用户级。
c) 参数值域、默认值:默认值为off,表示不开启用户表默认加密。
实验数据库版本环境:
- TEST=# select * from version();
- VERSION
- -------------------------------------------------------------------------------------------------------------------------
- Kingbase V008R003C002B0340 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit
- (1 row)
复制代码
1、创建非默认加密表
此时的参数encrypt_user_table=off:
- TEST=# show encrypt_user_table ;
- encrypt_user_table
- --------------------
- off
- (1 row)
复制代码
create table 语法方式创建加密表,注意语法中加入了关键字ENCRYPTED:
SYSTEM用户创建加密表
- TEST=# CREATE TABLE TABLE_ENCRYPT(a INT, b varchar(10)) ENCRYPTED;
- CREATE TABLE
- TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='TABLE_ENCRYPT';
- RELNAME | RELISENCRYPTED | LENGTH
- ---------------+----------------+--------
- TABLE_ENCRYPT | t | 32
- (1 row)
复制代码
注:字段说明
relisencrypted bool 该对象是否是透明加密的。
创建索引也是加密的
- TEST=# CREATE INDEX TABLE_ENCRYPT_INDEX ON TABLE_ENCRYPT(a);
- CREATE INDEX
- TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='TABLE_ENCRYPT_INDEX';
- RELNAME | RELISENCRYPTED | LENGTH
- ---------------------+----------------+--------
- TABLE_ENCRYPT_INDEX | t | 32
- (1 row)
复制代码
插入数据,查看表文件:
- TEST=# insert into TABLE_ENCRYPT values(1, 'aaaa');
- INSERT 0 1
- TEST=# insert into TABLE_ENCRYPT values(2, 'bbbb');
- INSERT 0 1
- TEST=# checkpoint;
- CHECKPOINT
- TEST=# select sys_relation_filepath('TABLE_ENCRYPT');
- SYS_RELATION_FILEPATH
- -----------------------
- base/14941/49218
- (1 row)
复制代码
SYSTEM用户创建非加密表(普通表),并查看表文件:
- TEST=# CREATE TABLE TABLE_NOENCRYPT(a INT, b varchar(10));
- CREATE TABLE
- TEST=# insert into TABLE_NOENCRYPT values(1, 'aaaa');
- INSERT 0 1
- TEST=# insert into TABLE_NOENCRYPT values(2, 'bbbb');
- INSERT 0 1
- TEST=# checkpoint;
- CHECKPOINT
复制代码
- TEST=# select sys_relation_filepath(‘TABLE_NOENCRYPT’);
- SYS_RELATION_FILEPATH
- -----------------------
- base/14941/57411
- (1 row)
复制代码
如下图,使用操作系统命令hexdump 查看表已经加密成功:从输出结果已经看不到连续字符‘aaaa’,转为其他乱码字符显示。


下面的图片为非加密表的输出结果,可以看到输出了‘aaaa’表中的数据,说明表没有进行加密。


2、创建默认加密表:
确认修改配置文件,kingbase.conf,增加encrypt_user_table=on,重启数据库。
这里create table 创建表语法与创建普通表无异,不需要增加关键字ENCRYPTED
SYSTEM用户创建用户表:
- TEST=# show encrypt_user_table ;
- encrypt_user_table
- --------------------
- on
- (1 row)
复制代码
- TEST=# CREATE TABLE TABLE_ENCRYPT(a INT, b varchar(10)) ;
- CREATE TABLE查看视图sys_class中已经进行加密
复制代码
- TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME=‘TABLE_ENCRYPT’;
- RELNAME | RELISENCRYPTED | LENGTH
- ---------------±---------------±-------
- TABLE_ENCRYPT | t | 32
- (1 row)
复制代码
插入数据,查看表文件:
- TEST=# insert into TABLE_ENCRYPT values(1, 'aaaa');
- INSERT 0 1
- TEST=# insert into TABLE_ENCRYPT values(2, 'bbbb');
- INSERT 0 1
- TEST=# checkpoint;
- CHECKPOINT
- TEST=# select sys_relation_filepath('TABLE_ENCRYPT');
- SYS_RELATION_FILEPATH
- -----------------------
- base/14941/49228
- (1 row)
复制代码
hexdump 查看表也被加密,‘aaaa’字符已经不能正常显示。


3、使用CTS语法为已存在非加密表进行加密
- TEST=# \d aaa
- Table "PUBLIC.AAA"
- Column | Type | Modifiers
- --------+---------+-----------
- EE | INTEGER |
- NAME | TEXT |
- AAA表未加密
- TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='AAA';
- RELNAME | RELISENCRYPTED | LENGTH
- ---------+----------------+--------
- AAA | f |
- (1 row)
复制代码
AAA表数据:
- TEST=# select* from aaa;
- EE | NAME
- ----±-----
- 1 |
- 2 |
- 3 |
- 4 |
- 5 | king
- (5 rows)
复制代码
- 需要参数encrypt_user_table开启
- TEST=# show encrypt_user_table ;
- encrypt_user_table
- --------------------
- on
- (1 row)
- TEST=# create table TABLE_ENCRYPT2 as select * from aaa;
- SELECT 5
- TEST=#
- 创建完TABLE_ENCRYPT2表处于加密模式
- TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='TABLE_ENCRYPT2';
- RELNAME | RELISENCRYPTED | LENGTH
- ----------------+----------------+--------
- TABLE_ENCRYPT2 | t | 32
- (1 row)
复制代码
TABLE_ENCRYPT2表数据和表AAA一致
- TEST=# select * from TABLE_ENCRYPT2;
- EE | NAME
- ----±-----
- 1 |
- 2 |
- 3 |
- 4 |
- 5 | king
- (5 rows)
- TEST=# select sys_relation_filepath(‘TABLE_ENCRYPT2’);
- SYS_RELATION_FILEPATH
- -----------------------
- base/14941/57414
- (1 row)
复制代码
hexdump查看TABLE_ENCRYPT2表已经处于加密状态,数据king无法正常显示 hexdump -c 57414 |grep k


查看非加密表文件:
- TEST=# select sys_relation_filepath('AAA');
- SYS_RELATION_FILEPATH
- -----------------------
- base/14941/24580
- (1 row)
复制代码
hexdump查看AAA表没有处于加密状态 hexdump -c 24580 |grep k
如图,没加密情况可以正常显示数据king


结论
KingbaseES V8R3版本数据库可以配置透明加密功能中的表加密,但没有实现表空间加密功能,建议客户尽量使用V8R6版本透明加密功能。
KingbaseES V8R3版本数据库可以通过create table语法中加入关键字ENCRYPTED实现表加密,也可以通过在kingbase.conf中设置参数encrypt_user_table=on实现默认表加密功能。
KingbaseES V8R3数据库可以通过CTS方式将未加密的表改为加密方式存储。




