KingbaseES V8R3 表加密
前言
透明加密是指将数据库page加密后写入磁盘,当需要读取对应page时进行加密读取。此过程对于用户是透明, 用户无需干预。
该文档进行数据库V8R3版本测试透明加密功能,需要说明,该版本发布时间早于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
结论
KingbaseESV8R3版本数据库可以配置透明加密功能中的表加密,但没有实现表空间加密功能,建议客户尽量使用V8R6版本透明加密功能。
KingbaseESV8R3版本数据库可以通过create table语法中加入关键字ENCRYPTED实现表加密,也可以通过在kingbase.conf中设置参数encrypt_user_table=on实现默认表加密功能。
KingbaseESV8R3数据库可以通过CTS方式将未加密的表改为加密方式存储。