1.1小总结
(1)数据库全库和REDO日志透明加密只能初始化时设置。
(2)表空间透明加密只能创建时设置 。
(3)表列透明加密,可以创建时设置,也可后期更改为透明加密,但是更改前的数据不加密,只对更改后插入数据加密。
(4)支持对存储过程等其它对象加密。
(5)表列半透明加密,半透明加密模式用户默认只能看到自己插入的数据。
(6)表列半透明加密,表列由不加密改为半透明加密,报错:第1行附近出现错误[-2704]:试图执行半透明加密表不支持的DDL。
本节主要介绍透明加密。
1.2具体内容
包括:
✔ 透明加密
✔ 半透明加密
✔ 非透明加密
DM使用服务器主密钥 SVR_KEY 和数据库主密钥 DB_KEY 进行分级存储加密。SVR_KEY为服务器主密钥,用于加密数据库主密钥;DB_KEY用于加密库内密钥,如用户加密密钥、列加密密钥等。
DM安全版提供了两个系统过程SP_UPDATE_SVRKEY()和 SP_UPDATE_DBKEY(),分别用于更新密钥 SVR_KEY和DB_KEY。
例如,更新服务器主密钥SVR_KEY。
SQL> SP_UPDATE_SVRKEY();
加密算法

1.2.1透明加密
在透明加密中,密钥生成、密钥管理和加解密过程由数据库管理系统自动完成,用户不可见。透明加密的目的主要是保证存储在数据文件中的敏感数据的安全,并不能保护合法用户的个人私密数据。
1.2.1.1全库加密
--加密算法查询
SELECT CYT_NAME FROM V$CIPHERS WHERE (CYT_TYPE=1 OR CYT_TYPE=2 );

--获取全库加密算法名
系统存储函数 SF_GET_ENCRYPT_NAME()获取全库加密算法名。未使用全库加密时返回 NULL。
--查PAGE_ENC_SLICE_SIZE(设置页加密分片大小,可选值:0、512、4096,单位:Byte)
select * from v$dm_ini where PARA_NAME='PAGE_ENC_SLICE_SIZE';
(1)初始化时设置
示例1-指定数据库采用OPENSSL_SM4_CFB_V1加密算法加密
dminit path=/data/dmdata page_size=32 extent_size=32 port_num=5238 CASE_SENSITIVE=0 charset=1 log_size=1024 SYSDBA_PWD=HUN_admin2026 SYSAUDITOR_PWD=HUN_admin2026 DB_NAME=DAMENG1 ENCRYPT_NAME=OPENSSL_SM4_CFB_V1
示例2指定数据库+在线日志采用OPENSSL_SM4_CFB_V1加密算法加密
dminit path=/data/dmdata page_size=32 extent_size=32 port_num=5239 CASE_SENSITIVE=0 charset=1 log_size=1024 SYSDBA_PWD=HUN_admin2026 SYSAUDITOR_PWD=HUN_admin2026 DB_NAME=DAMENG2 ENCRYPT_NAME=OPENSSL_SM4_CFB_V1 RLOG_ENCRYPT_NAME=OPENSSL_SM4_CFB_V1

(2)查询算法
select SF_GET_ENCRYPT_NAME();

(3)查看5238数据库数据文件和redo日志文件中存储数据
strings /data/dmdata/DAMENG1/MAIN.DBF --密文
strings /data/dmdata/DAMENG1/DAMENG101.log --明文

(4)查看5239数据库数据文件和redo日志文件中存储数据
如果配置了归档可以使用dmrachk工具查看。
strings /data/dmdata/DAMENG2/MAIN.DBF --密文
strings /data/dmdata/DAMENG2/DAMENG201.log --密文

1.2.1.2表空间加密
数据库不能设置加密,创建表空间时指定进行透明加密(仅针对写入此加密表空间的数据进行加密)。
示例1
(1)创建用户和表空间
create tablespace TEST1 datafile 'test1s.dbf' size 128 CACHE = NORMAL encrypt with SM4_CFB;
--create tablespace TEST1 datafile 'test1s.dbf' size 128 CACHE = NORMAL encrypt with
SM4_CFB BY "EncryptKey123!";--加密密码若未指定(BY "EncryptKey123!"),由数据库随机生成;
create tablespace TEST2 datafile 'test2.dbf' size 128 CACHE = NORMAL;
create user TEST1 identified by "HUN_admin2026"
default tablespace "TEST1"
default index tablespace "TEST1";
grant "PUBLIC","RESOURCE","SOI" to TEST1;
(2)用户test1登录数据库,使用加密表空间,查询表空间数据文件。
disql test1/HUN_admin2026@192.168.118.236:5237
create table test1(id int,info VARCHAR2(20));
insert into test1 values(1,'test1');
commit;
strings /data/dmdata/DAMENG/test1s.dbf --密文

(3)用户test1登录数据库,使用非加密表空间,查询表空间数据文件。
disql test1/HUN_admin2026@192.168.118.236:5237
ALTER TABLE TEST1.TEST1 MOVE TABLESPACE TEST2;
insert into test1 values(2,'test2');
commit;
strings /data/dmdata/DAMENG/test2.dbf --明文

drop user TEST1 cascade;
drop tablespace TEST1;
drop tablespace TEST2;
1.2.1.3表列透明加密
DM 支持对表的列进行透明加密,支持建表时设置加密列,以及修改表定义时设置加密列。存储加密支持所有的列类型,包括大字段类型。用透明加密的方式加密列上的数据时,在数据库中保存加密该列的密钥,执行 DML 语句的过程中系统能自动获取密钥。
--加密算法查询
SELECT CYT_NAME FROM V$CIPHERS WHERE (CYT_TYPE=1 OR CYT_TYPE=2 ) AND (WORK_MODE!='WORK_MODE_EXTKEY' AND WORK_MODE!='WORK_MODE_ECB_NOPAD'AND WORK_MODE!='WORK_MODE_CBC_NOPAD');
示例1
create tablespace TEST2 datafile 'test2.dbf' size 128 CACHE = NORMAL;
create user TEST2 identified by "HUN_admin2026"
default tablespace "TEST2"
default index tablespace "TEST2";
grant "PUBLIC","RESOURCE","SOI" to TEST2;
disql test2/HUN_admin2026@192.168.118.236:5237
CREATE TABLE TEST_ENCRYPT1(C1 INT, C2 VARCHAR2(20) ENCRYPT);
insert into TEST_ENCRYPT1 values(1,'TEST_ENCRYPT1');
commit;
select * from TEST_ENCRYPT1;
strings /data/dmdata/DAMENG/test2.dbf --密文

CREATE TABLE TEST_ENCRYPT2(C1 INT, C2 VARCHAR2(20) );
insert into TEST_ENCRYPT2 values(1,'TEST_ENCRYPT2');
commit;
strings /data/dmdata/DAMENG/test2.dbf --密文+明文

drop TABLE TEST_ENCRYPT1;
drop TABLE TEST_ENCRYPT2;
示例2
create tablespace TEST2 datafile 'test2.dbf' size 128 CACHE = NORMAL;
create user "TEST2" identified by "HUN_admin2026"
default tablespace "TEST2"
default index tablespace "TEST2";
grant "PUBLIC","RESOURCE","SOI" to TEST2;
disql test2/HUN_admin2026@192.168.118.236:5237
CREATE TABLE TEST_ENCRYPT1(C1 INT, C2 VARCHAR2(20));
insert into TEST_ENCRYPT1 values(1,'TEST_ENCRYPT1');
commit;
select * from TEST_ENCRYPT1;
strings /data/dmdata/DAMENG/test2.dbf --明文

修改表C2列为透明加密,修改前的数据不会加密存储
alter table TEST2.TEST_ENCRYPT1 modify "C2" VARCHAR2(20) encrypt with "SM4_ECB";
insert into TEST_ENCRYPT1 values(3,'TEST_ENCRYPT3');
commit;
select * from TEST_ENCRYPT1;
strings /data/dmdata/DAMENG/test2.dbf --明文+密文

修改表C2列为不加密
alter table TEST2.TEST_ENCRYPT1 modify "C2" VARCHAR2(20);
strings /data/dmdata/DAMENG/test2.dbf --全部明文

drop user TEST2 cascade;
drop tablespace "TEST2";
1.2.1.4其他数据库对象加密
DM 还支持对存储过程、存储函数、触发器、包、类、自定义类型等的定义进行加密,创建时在对象名称后加上"WITH ENCRYPTION "即可。
例如,创建存储过程 proc_arg,对其定义进行加密。
CREATE OR REPLACE PROCEDURE test_proc WITH ENCRYPTION(a IN INT, b INT)
AS
BEGIN
a:=0;
b:=A+1;
END;
/
CREATE OR REPLACE PROCEDURE test_proc2 (a IN INT, b INT)
AS
BEGIN
a:=0;
b:=A+1;
END;
/
查询定义
SELECT * FROM USER_SOURCE WHERE TYPE = 'PROCEDURE' and OWNER='TEST2';
SELECT * FROM DBA_SOURCE WHERE TYPE = 'PROCEDURE' and OWNER='TEST2';

更多达梦数据库运维指南、在线文档、相关资料、社区在线提问以及技术分享