orcl透明数据库加密(TDE)加密表空间
TDE加密介绍
透明数据加密包括列加密和表空间加密,它是oracle高级安全组件的一部分;
oracle11g企业版默认安装时会安装上oracle高级安全组件,oracle声称这是一个单独另外收费的组件,作为商业用途使用如果没有付费意味着侵权。
oracle增强表空间加密特性,数据库的兼容性参数必须被设置为11.2或更高。
oracle的列加密是从10gR2开始可以使用,表空间加密是从11gR1开始使用。
表空间加密算法3DES168,AES128,AES192,AES256,默认是AES128
TDE从11g开始支持加密整个表空间,表空间的对象都自动加密,不需要对表再进行加密。
表空间加密中,支持内部对象blod,clob等加密,不支持外部对象BFILE。
TDE的主密钥存储在外部安全模块(Oracle Wallet中或HSM)。这TDE主密钥用于加密TDE表空间加密密钥,而这又是用来加密和解密数据表空间。
已经加密的数据对数据库使用者或是应用程序都是透明的,自动解密。
如果存储介质或是数据文件被偷,TDE可以保护数据不被还原。
加密密钥自动产生,不需要用户管理。只需要及时做好备份,不要丢失即可。
注意:加密的秘钥即使是同一密码,生成的秘钥也会不同,不要试图重新加载秘钥,这样容易导致数据库不可用。
操作环境
系统:window7
数据库:oracle12C
(这里需注意,windows7系统不支持oracle19C原因:)
Navicat:12破解版
表空间加密实现过程
启用TDE
创建和管理Oracle钱夹
-
如果是linux系统,输入如下命令创建目录$ mkdir -p /u01/app/oracle/admin/orcl/wallet
-
如果是windows系统,直接在想存储秘钥的位置新建文件夹即可,我的存储位置是D:\AAA\box\oracle12WINDOWS.X64_193000_db_home(随意命名的oracle安装路径)\wallet
指定 wallet 路径
在oracle安装路径下的NETWORK\ADMIN下的 sqlnet.ora 中设置 ENCRYPTION_WALLET_LOCATION 参数,指定软件 wallet 路径。其中,在 sqlnet.ora 文件中添加的条目如下。
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:\AAA\box\oracle12WINDOWS.X64_193000_db_home\wallet)
)
)
ENCRYPTION_WALLET_LOCATION参数的作用就是告知Wallet的实现方式和物理位置。DIRECTORY 的具体路径作为主加密Key的存放位置.
检查 sqlnet.ora 信息读取状态(任一节点)
select * from v$encryption_wallet;
select * from gv$encryption_wallet;
注意:确保 vencryption_wallet 与 gvencryptionwallet与gvencryption_wallet 的 wallet location 是 一致的。
注意:对于 wallet 分别在不同节点的情况以及 sqlnet.ora 在加入 ENCRYPTION_WALLET_LOCATION 参数前已经被数据库各实例读取的情况,需要 重启各个实例以初始化 wallet 的状态,从而更新 gv$encryption_wallet 的 wallet location。
创建master key主密钥文件,指定wallet密码
创建该文件只有系统用户system可以,自己单独建立的用户无此权限
win+R后输入命令sqlplus打开窗口,输入用户名及密码,确定oracle正常运行
通过以下命令建立加密文件:
alter system set encryption key identified by “123456”;
其中,123456为wallet密码。Oracle Wallet是一个可以打开关闭的功能组件,设置密码之后,只有通过密码口令可以启用wallet功能。
此时,在设置的目录下会多出一个ewallet.p12文件。这就是生成的master key文件。
启动和关闭Wallet
- 启动Wallet:
SQL> alter system set encryption wallet open identified by "123456";
- 关闭Wallet:(注意密码一定是双引号)
SQL> alter system set encryption wallet close identified by "123456";
- 可以通过以下语句查询Wallet是否在打开状态:
select * from v$encryption_wallet;
说明:wallet只有在open的情况下才能进行数据库的透明加密,如果处于关闭状态,则会报错wallet,加密表空间需确认wallet是否真正开启。
表空间加密
在创建加密表空间之前,包含有表空间主密钥的 Oracle wallet 必须处于打开状态。
-
表空间限制
1.1 不能加密临时和撤销表空间1.2 不能更改加密表空间的安全密匙
1.3 不能加密外部表
-
加密表空间示例:
SQL> create tablespace DB_TEST
datafile 'D:\AAA\box\oracle\test.dbf'
size 500m
encryption
default storage(encrypt);
其中encryption表时数据库使用默认的加密算法DES128,可以在encryption后面使用using子句来指定另外的算法,如:
SQL> create tablespace DB_TEST
datafile 'D:\AAA\box\oracle\test.dbf'
size 500m
encryption
using '3DES168'
default storage(encrypt);
- 检查一个表空间是否加密:
查看个表空间的加密属性,确定新建表空间为 TDE 加密表空间。
SQL> select encrypted from dba_tablespaces where tablespace_name='DB_TEST';
- 删除加密表空间
SQL>drop tablespace encts including contents and datafiles;
Tablespace dropped.
未找到相关修改现有表空间间加密解密语句。。。
如果在Navicat直接挪动表空间,可能会丢失数据。
验证加密表空间
可通过此步骤验证加密表空间是否真正有效。
- 测试表:创建加密表空间 ENCTS以及非加密表空间 DB_TEST。随后分别在两个表空间内创建表 JM_TABLE 以及非加密表 BJM_DATA,语句类似如下。
create table jm_table(col1 number, col2 varchar2(30)) tablespace ENCTS;
create table bjm_table(col1 number, col2 varchar2(30)) tablespace DB_TEST;
- 创建后分别插入测试数据。
insert into jm_table values (1,'secret data');
insert into bjm_table values (1,'no secret data');
Oracle wallet 不打开,则无法对加密表空间中的表进行插入数据,类似如下结果。
其中红色框内的SQL因为wallet未打开,所以无法执行插入操作,反之,不加密的表空间则可以正常插入数据(增删改查全部同理)。
尝试打开wallet之后,插入成功。如图:
本文来自博客园,作者:zwbsoft,转载请注明原文链接:https://www.cnblogs.com/zwbsoft/p/15194739.html
电话微信:13514280351
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南