达梦数据库-数据库存储加密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/

相关推荐
时空自由民.2 小时前
嵌入式学习-构建系统(图形化IDE/Kconfig/手动makefile Cmake)
数据库·ide·单片机·学习
m0_515098422 小时前
如何排查RAC节点被驱逐Eviction_CSS日志与宕机重启原因分析
jvm·数据库·python
weixin_458580122 小时前
HTML函数工具是否适配HDR显示器_高动态范围指南【指南】
jvm·数据库·python
qq_654366982 小时前
Cgo 中正确设置 C 结构体内函数指针回调的完整方案
jvm·数据库·python
qq_432703662 小时前
如何处理复杂的SQL注入攻击_使用行为分析识别异常
jvm·数据库·python
极客先躯2 小时前
高级java每日一道面试题-2025年11月15日-行业专题[LangChain4j]-如何实现热点事件的实时分析和推送?
java·数据库·langchain·突发性与不可预测性·信息碎片化与多源重复·情绪驱动与谣言风险·推送的精准性与合规性
Vect__2 小时前
初识MySQL,数据库相关概念,库操作,表操作
数据库·mysql
sinat_383437362 小时前
如何在 Ubuntu Core(Snappy)上部署 Go Web 服务
jvm·数据库·python
空空潍2 小时前
MySQL索引不生效?一文理解CBO成本模型
数据库·sql·mysql