达梦8与Oracle 11g透明数据加密(TDE)技术对比
本文系统性对比达梦8与Oracle 11g的透明数据加密技术原理、覆盖维度与落地能力。
当前主流关系型数据库默认采用明文方式存储底层数据文件,该存储机制存在固有安全漏洞。多数企业依赖操作系统权限管控、数据库账号密码体系构建数据防护体系,但此类防护手段存在明显局限性,无法从底层数据存储层面规避数据泄露风险。
非法攻击者可绕过数据库管理系统与操作系统权限校验机制,直接窃取数据库物理数据文件。通过UE等通用文本编辑工具,即可直接读取文件内明文存储的业务敏感数据,无需数据库登录权限,即可完成核心数据窃取,这也是数据库明文存储带来的核心“裸奔”安全隐患。
针对数据库明文存储的安全短板,主流数据库厂商均提供了标准化解决方案。透明数据加密(Transparent Data Encryption,TDE)是专门面向数据库存储场景设计的原生安全特性,可从物理存储层对数据进行加密防护,有效规避物理文件泄露导致的数据安全风险。
TDE并非新兴技术,行业落地周期已久。Oracle 10g、达梦5版本均已在官方文档中收录TDE透明加密特性,实现了技术架构的初步落地。时至今日,Oracle已迭代至23c版本,功能与性能持续更新;达梦8依托信创产业发展,在政企、金融、能源等核心领域大规模落地应用。
经行业场景调研分析,TDE低普及率的核心原因,是行业用户普遍存在性能顾虑。多数运维及技术团队认为,开启数据库加密安全特性会产生性能损耗,影响业务读写效率,因此主动放弃原生加密能力,导致生产数据库长期处于无防护的明文存储状态,存在极大的合规与安全风险。
伴随服务器硬件算力持续升级、硬件部署成本稳步下行,早年TDE加密带来的性能损耗问题已得到有效解决。当前硬件算力可完全抵消加密算法运行产生的性能开销,性能瓶颈不再是限制TDE落地的核心因素。
从技术定义来看,透明数据加密的核心特征为对业务应用完全透明。数据的加密、解密全过程由数据库管理系统自主完成,无需改造上层业务代码、无需应用程序参与,对业务架构与运行逻辑无任何影响,这也是“透明加密”的核心技术优势。
在加密覆盖维度上,两款数据库的原生能力存在明显差异。Oracle 11g的透明加密的维度支持列级别加密和表空间级别;达梦8除了对列和表空间级别支持加密外,还支持对全库级别、存储过程、函数、触发器、包、类等自定义类型进行加密。
为直观验证两款数据库TDE技术的落地差异与实际防护效果,下文复现Oracle 11g与达梦8表空间级TDE的部署流程,并对加密效果进行横向对比分析。
一、Oracle 数据库启用透明数据加密特性
Oracle 11g 开启 TDE 一共分为 3 个操作步骤:
①查询v$encryption_wallet视图,获取密钥文件的预设操作系统路径,此时操作系统上该目录尚未创建。
②登录操作系统,手动创建密钥文件目录。
③执行 SQL 设置密钥,开启TDE特性,再次查询v$encryption_wallet视图,确认TDE状态变为OPEN。
SYS@PROD1> select * from v$encryption_wallet;
WRL_TYPE
----------------
WRL_PARAMETER
----------------------------------------
STATUS
----------------
file
/u01/app/oracle/admin/PROD1/wallet
CLOSED
SYS@PROD1> !mkdir -p /u01/app/oracle/admin/PROD1/wallet
SYS@PROD1> alter system set encryption key identified by "Oracle11g";
System altered.
SYS@PROD1> select * from v$encryption_wallet;
WRL_TYPE
----------------
WRL_PARAMETER
----------------------------------------
STATUS
----------------
file
/u01/app/oracle/admin/PROD1/wallet
OPEN
二、Oracle 创建加密表空间及测试表
TDE状态为OPEN之后,即可创建加密表空间。本次创建加密表空间encrypt,新建测试用户并将该表空间设置为用户默认表空间,之后创建测试表并插入测试数据,name字段写入固定字符串This is an encrypted message.,后续将通过该字符串验证物理文件加密效果。
SYS@PROD1> CREATE TABLESPACE encrypt
2 DATAFILE '/u01/app/oracle/oradata/PROD1/encrypt.dbf'
3 SIZE 100M autoextend off
4 ENCRYPTION
5 DEFAULT STORAGE(ENCRYPT);
Tablespace created.
SYS@PROD1> create user encrypt identified by "Oracle11g" default tablespace encrypt;
User created.
SYS@PROD1> grant resource,connect to encrypt;
Grant succeeded.
SYS@PROD1> conn encrypt/Oracle11g
Connected.
ENCRYPT@PROD1> show user
USER is "ENCRYPT"
ENCRYPT@PROD1> create table encrypt (id int,name varchar(50));
Table created.
ENCRYPT@PROD1> insert into encrypt values (1,'This is an encrypted message.');
1 row created.
直至数据插满,查询encrypt表有209万行数据。
ENCRYPT@PROD1> /
524288 rows created.
ENCRYPT@PROD1> /
1048576 rows created.
ENCRYPT@PROD1>/
insert into encrypt select * from encrypt
*
ERROR at line 1:
ORA-01653: unable to extend table ENCRYPT.ENCRYPT by 1024 in tablespace ENCRYPT
ENCRYPT@PROD1> commit;
Commit complete.
ENCRYPT@PROD1> select count(*) from encrypt;
COUNT(*)
----------
2097152
为完成对比实验,我们再创建一套未开启加密的对照组环境。创建普通表空间unencrypt,新建测试用户,构建测试表并写入对照字符串This is an unencrypted message.,同样批量填充数据。后续直接读取物理 dbf 文件,该字符串在未加密数据文件中可以直接检索到,以此和加密表空间形成鲜明对比。
SYS@PROD1> create tablespace unencrypt datafile '/u01/app/oracle/oradata/PROD1/unencrypt.dbf' size 100m autoextend off;
Tablespace created.
SYS@PROD1> create user unencrypt identified by "Oracle11g" default tablespace unencrypt;
User created.
SYS@PROD1> grant resource,connect to unencrypt;
Grant succeeded.
SYS@PROD1> conn unencrypt/Oracle11g
Connected.
UNENCRYPT@PROD1> create table unencrypt (id int,name varchar(50));
Table created.
UNENCRYPT@PROD1> insert into unencrypt values (1,'This is an unencrypted message.');
1 row created.
UNENCRYPT@PROD1> commit;
Commit complete.
UNENCRYPT@PROD1> insert into unencrypt select * from unencrypt;
1 row created.
Oracle 未加密表空间批量填充对照数据:继续对unencrypt测试表执行复制插入,批量生成对照样本数据。因为该表空间同样设置autoextend off,数据量增长速度相比加密表空间更慢。
SYS@PROD1> insert into unencrypt select * from unencrypt;
6 rows created.
SYS@PROD1> /
12 rows created.
SYS@PROD1> /
24 rows created.
SYS@PROD1> /
48 rows created.
SYS@PROD1> /
96 rows created.
SYS@PROD1> /
192 rows created.
查询dba_tablespaces视图,encrypted列显示为YES的是已经启用TDE特性的加密表空间。
SYS@PROD1> select TABLESPACE_NAME,ENCRYPTED from dba_tablespaces;
TABLESPACE_NAME ENCRYPTED
------------------------------ ----------
SYSTEM NO
SYSAUX NO
UNDOTBS1 NO
TEMP NO
USERS NO
ENCRYPT YES
UNENCRYPT NO
7 rows selected.
下载unencrypt表空间的数据文件,使用UE打开该文件,明文显示的‘This is an unencrypted message’。可验证了Oracle数据库默认是以明文方式存储的数据。

下载encrypt表空间的数据文件,使用UE打开该文件,发现所有内容均显示为乱码,表空间数据文件已经成功加密。

三、达梦数据库启用透明数据加密特性
达梦 8 实现 TDE 表空间加密,在建表空间 DDL 中增加`encrypt with`子句,可指定加密算法与密钥。本次创建加密表空间`encrypt`,新建测试用户并将该表空间设置为默认表空间,后续创建测试表,写入验证字符串`This is an encrypted message.`,用于物理文件加密效果校验。
SQL> create tablespace encrypt datafile '/DB/data/encrypt.dbf' size 100 autoextend off encrypt with RC4 by Dameng;
操作已执行
已用时间: 188.254(毫秒). 执行号:301.
SQL> create user encrypt identified by "Dameng123" default tablespace encrypt;
操作已执行
已用时间: 52.995(毫秒). 执行号:302.
SQL> grant resource,public to encrypt;
操作已执行
已用时间: 2.643(毫秒). 执行号:303.
SQL> exit
[dmdba@localhost ~]$ disql encrypt/Dameng123:5237
服务器[LOCALHOST:5237]:处于普通打开状态
登录使用时间 : 0.975(ms)
disql v8
创建不加密的表空间unencrypt,创建用户unencrypt,使用默认表空间unencrypt。创建unencrypt表,循环插入数据unencrypt表数据类型包含‘This is an unencrypted message’,用于后期验证明文效果。
SQL> create tablespace unencrypt datafile '/DB/data/unencrypt.dbf' size 100 autoextend off;
操作已执行
已用时间: 22.076(毫秒). 执行号:500.
SQL> create user unencrypt identified by "Dameng123" default tablespace unencrypt;
操作已执行
已用时间: 3.727(毫秒). 执行号:501.
SQL> grant resource,public to unencrypt;
操作已执行
已用时间: 2.598(毫秒). 执行号:502.
SQL> conn unencrypt/Dameng123:5237
服务器[LOCALHOST:5237]:处于普通打开状态
登录使用时间 : 0.900(ms)
SQL> select user();
行号 USER()
---------- ----------
1 UNENCRYPT
已用时间: 12.046(毫秒). 执行号:600.
SQL> create table unencrypt (id int,name varchar(50));
操作已执行
已用时间: 3.420(毫秒). 执行号:601.
SQL> insert into unencrypt values (1,'This is an unencrypted message');
影响行数 1
已用时间: 0.374(毫秒). 执行号:602.
SQL> commit;
循环插入数据,直至unencrypt表空间和encrypt表空间爆满。
SQL> insert into encrypt select * from encrypt;
[-523]:磁盘空间不足.
已用时间: 00:00:04.891. 执行号:0.
SQL> select count(*) from encrypt;
行号 COUNT(*)
---------- ----------
1 1048576
已用时间: 18.068(毫秒). 执行号:426.
SQL> /
影响行数 524288
已用时间: 00:00:03.589. 执行号:624.
SQL> insert into unencrypt select * from unencrypt;
[-523]:磁盘空间不足.
已用时间: 00:00:02.321. 执行号:0.
SQL> select count(*) from unencrypt;
行号 COUNT(*)
---------- ----------
1 1048576
已用时间: 0.341(毫秒). 执行号:626.
分别用UE打开unencrypt表空间和encrypt表空间的数据文件,实现预期效果。
unencrypt表空间数据文件是明文。

encrypt表空间数据文件是密文。

四、总结
历次等保迎检检查项中均包含“数据库是否启用加密存储”,本文通过对比实验予以验证:Oracle 11g、达梦 8 数据库在默认配置下,业务数据以明文形式存放于磁盘数据文件,可直接通过操作系统文本检索工具读取到业务明文;只有显式开启数据库 TDE 透明数据加密特性后,磁盘上的数据文件才会以密文形式存储。
关于TDE特性开启方法,在Oracle 12c之后的版本开启TDE的语法格式变化很大,但基本原理相同。相比Oracle,达梦数据库对支持TDE全库级别加密、支持多种数据库对象加密,而且开启方法极为简单,只需要在DDL语句中加入“encrypt with”子句即可。
透明数据加密是一种简单高效的存储层加密方案,同时也存在明显局限:TDE 仅对磁盘上的数据文件、数据库对象做存储算法加密。如果攻击者已经拿到合法的数据库账号连接权限,TDE 将无法对业务数据起到防护作用。
辩证看待数据库安全能力,没有某一项数据库安全特性可以覆盖全部安全风险。实际生产环境需要结合业务场景,合理选用对应的安全能力,平衡安全防护与运维成本,保障数据库系统安全稳定运行。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)