达梦数据库-数据库存储加密01-记录总结

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';

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

访问 https://eco.dameng.com/

相关推荐
笃行3506 小时前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3506 小时前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3506 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB1 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶1 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵1 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils1 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
Databend2 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
ClouGence3 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle