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:AAAoxoracle12WINDOWS.X64_193000_db_home(随意命名的oracle安装路径)wallet
指定 wallet 路径
在oracle安装路径下的NETWORKADMIN下的 sqlnet.ora 中设置 ENCRYPTION_WALLET_LOCATION 参数,指定软件 wallet 路径。其中,在 sqlnet.ora 文件中添加的条目如下。
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:AAAoxoracle12WINDOWS.X64_193000_db_homewallet)
)
)
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:AAAoxoracle est.dbf'
size 500m
encryption
default storage(encrypt);
其中encryption表时数据库使用默认的加密算法DES128,可以在encryption后面使用using子句来指定另外的算法,如:
SQL> create tablespace DB_TEST
datafile 'D:AAAoxoracle est.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之后,插入成功。如图: