暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

金仓数据库KingbaseES V8R3 表加密

原创 jack 2023-10-26
353

前言

透明加密是指将数据库page加密后写入磁盘,当需要读取对应page时进行加密读取。此过程对于用户是透明, 用户无需干预。

该文档进行数据库KingbaseES V8R3版本测试透明加密功能,需要说明,该版本发布时间早于KingbaseES V8R6,所以只能进行表加密,而没有表空间加密功能。

测试透明加密

参数说明:

a) encrypt_user_table:布尔型。

b) 参数级别:用户级。

c) 参数值域、默认值:默认值为off,表示不开启用户表默认加密。

实验数据库版本环境:

  1. TEST=# select * from version();
  2.                                                          VERSION
  3. -------------------------------------------------------------------------------------------------------------------------
  4. Kingbase V008R003C002B0340 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit
  5. (1 row)

复制代码

1、创建非默认加密表

此时的参数encrypt_user_table=off:

  1. TEST=# show encrypt_user_table ;
  2. encrypt_user_table
  3. --------------------
  4. off
  5. (1 row)

复制代码

create table 语法方式创建加密表,注意语法中加入了关键字ENCRYPTED:

SYSTEM用户创建加密表

  1. TEST=# CREATE TABLE TABLE_ENCRYPT(a INT, b varchar(10)) ENCRYPTED;
  2. CREATE TABLE
  3. TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='TABLE_ENCRYPT';
  4.     RELNAME    | RELISENCRYPTED | LENGTH
  5. ---------------+----------------+--------
  6. TABLE_ENCRYPT | t              |     32
  7. (1 row)

复制代码

注:字段说明

relisencrypted bool 该对象是否是透明加密的。

创建索引也是加密的

  1. TEST=# CREATE INDEX TABLE_ENCRYPT_INDEX ON TABLE_ENCRYPT(a);
  2. CREATE INDEX
  3. TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='TABLE_ENCRYPT_INDEX';
  4.        RELNAME       | RELISENCRYPTED | LENGTH
  5. ---------------------+----------------+--------
  6. TABLE_ENCRYPT_INDEX | t              |     32
  7. (1 row)

复制代码

插入数据,查看表文件:

  1. TEST=# insert into TABLE_ENCRYPT values(1, 'aaaa');
  2. INSERT 0 1
  3. TEST=# insert into TABLE_ENCRYPT values(2, 'bbbb');
  4. INSERT 0 1
  5. TEST=# checkpoint;
  6. CHECKPOINT
  7. TEST=# select sys_relation_filepath('TABLE_ENCRYPT');
  8. SYS_RELATION_FILEPATH
  9. -----------------------
  10. base/14941/49218
  11. (1 row)

复制代码

SYSTEM用户创建非加密表(普通表),并查看表文件:

  1. TEST=# CREATE TABLE TABLE_NOENCRYPT(a INT, b varchar(10));
  2. CREATE TABLE
  3. TEST=# insert into TABLE_NOENCRYPT values(1, 'aaaa');
  4. INSERT 0 1
  5. TEST=# insert into TABLE_NOENCRYPT values(2, 'bbbb');
  6. INSERT 0 1
  7. TEST=# checkpoint;
  8. CHECKPOINT

复制代码

  1. TEST=# select sys_relation_filepath(‘TABLE_NOENCRYPT’);
  2. SYS_RELATION_FILEPATH
  3. -----------------------
  4. base/14941/57411
  5. (1 row)

复制代码

如下图,使用操作系统命令hexdump 查看表已经加密成功:从输出结果已经看不到连续字符‘aaaa’,转为其他乱码字符显示。

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

2、创建默认加密表:

确认修改配置文件,kingbase.conf,增加encrypt_user_table=on,重启数据库。

这里create table 创建表语法与创建普通表无异,不需要增加关键字ENCRYPTED

SYSTEM用户创建用户表:

  1. TEST=# show encrypt_user_table ;
  2. encrypt_user_table
  3. --------------------
  4. on
  5. (1 row)

复制代码

  1. TEST=# CREATE TABLE TABLE_ENCRYPT(a INT, b varchar(10)) ;
  2. CREATE TABLE查看视图sys_class中已经进行加密

复制代码

  1. TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME=‘TABLE_ENCRYPT’;

  2. RELNAME | RELISENCRYPTED | LENGTH

  3. ---------------±---------------±-------

  4. TABLE_ENCRYPT | t | 32

  5. (1 row)

复制代码

插入数据,查看表文件:

  1. TEST=# insert into TABLE_ENCRYPT values(1, 'aaaa');
  2. INSERT 0 1
  3. TEST=# insert into TABLE_ENCRYPT values(2, 'bbbb');
  4. INSERT 0 1
  5. TEST=# checkpoint;
  6. CHECKPOINT
  7. TEST=# select sys_relation_filepath('TABLE_ENCRYPT');
  8. SYS_RELATION_FILEPATH
  9. -----------------------
  10. base/14941/49228
  11. (1 row)

复制代码

hexdump 查看表也被加密,‘aaaa’字符已经不能正常显示。

3、使用CTS语法为已存在非加密表进行加密

  1. TEST=# \d aaa
  2.       Table "PUBLIC.AAA"
  3. Column |  Type   | Modifiers
  4. --------+---------+-----------
  5. EE     | INTEGER |
  6. NAME   | TEXT    |


  7. AAA表未加密
  8. TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='AAA';
  9. RELNAME | RELISENCRYPTED | LENGTH
  10. ---------+----------------+--------
  11. AAA     | f              |
  12. (1 row)

复制代码

AAA表数据:

  1. TEST=# select* from aaa;
  2. EE | NAME
  3. ----±-----
  4. 1 |
  5. 2 |
  6. 3 |
  7. 4 |
  8. 5 | king
  9. (5 rows)

复制代码

  1. 需要参数encrypt_user_table开启
  2. TEST=# show encrypt_user_table ;
  3. encrypt_user_table
  4. --------------------
  5. on
  6. (1 row)



  7. TEST=# create table  TABLE_ENCRYPT2 as select * from aaa;
  8. SELECT 5
  9. TEST=#

  10. 创建完TABLE_ENCRYPT2表处于加密模式
  11. TEST=# SELECT RELNAME, RELISENCRYPTED, LENGTH(RELTDEKEY) FROM SYS_CLASS WHERE RELNAME='TABLE_ENCRYPT2';
  12.     RELNAME     | RELISENCRYPTED | LENGTH
  13. ----------------+----------------+--------
  14. TABLE_ENCRYPT2 | t              |     32
  15. (1 row)

复制代码

TABLE_ENCRYPT2表数据和表AAA一致

  1. TEST=# select * from TABLE_ENCRYPT2;
  2. EE | NAME
  3. ----±-----
  4. 1 |
  5. 2 |
  6. 3 |
  7. 4 |
  8. 5 | king
  9. (5 rows)

  10. TEST=# select sys_relation_filepath(‘TABLE_ENCRYPT2’);
  11. SYS_RELATION_FILEPATH
  12. -----------------------
  13. base/14941/57414
  14. (1 row)

复制代码

hexdump查看TABLE_ENCRYPT2表已经处于加密状态,数据king无法正常显示 hexdump -c 57414 |grep k

查看非加密表文件:

  1. TEST=# select sys_relation_filepath('AAA');
  2. SYS_RELATION_FILEPATH
  3. -----------------------
  4. base/14941/24580
  5. (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方式将未加密的表改为加密方式存储。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论