对于数据库的安全性而言,除了使用用户、权限和角色进行控制外,还可以通过数据加密或者数据掩码来实现,关于透明的数据加密,可以对个别表列或整个表空间进行加密。当用户向加密的列中插入数据时,透明数据加密会自动加密该数据。当用户选择该列时,数据将自动解密。选择完毕后,数据将重新加密。
本篇就Oracle 12c中的透明数据加密进行演示。
1 演示环境
SQL> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
2 配置透明的数据加密
1)查看数据库兼容性
如果希望配置完整的表空间加密特性,则必须将数据库的compatible初始化参数设置为11.2.0.0或更高。
SQL> show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 12.1.0.2.0
2)创建基于密码的软件密钥库
创建密钥库,需要使用administer key management SQL语句,对应的密钥库目录必须存在,否则出错。
SQL> administer key management create keystore '/u01/app/oracle/admin/ORCL/wallet' identified by system;
keystore altered.
3)打开(关闭)密钥库
在创建基于密码的软件密钥库之后,如果要使用,必须手动打开它。
SQL> administer key management set keystore open identified by system;
keystore altered.
如果不需要加密了,可以使用以下命令将密钥库关闭:
administer key management set keystore close identified by system;
4)创建主加密密钥
主加密密钥存储在密钥存储库中,用于保护表密钥和表空间加密密钥。默认情况下,主加密密钥是由透明数据加密生成的随机密钥。
SQL> administer key management set key identified by system with backup using 'passwd key backup';
keystore altered.
5)查看密钥状态
SQL> select * from v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS WALLET_TYP WALLET_OR FULLY_BAC CON_ID
---------- ---------------------------------------- ---------- ---------- --------- --------- ----------
FILE /u01/app/oracle/admin/ORCL/wallet OPEN PASSWORD SINGLE NO 0
3 加密数据(命令行方式)
配置好透明数据加密之后,就可以对表中的列或表空间进行加密了,可以使用Oracle Cloud Control进行加密,也可以使用命令行进行加密。
3.1 加密表中的列
TDE列加密概览:
3.1.1 支持的数据类型
TDE列加密支持以下数据类型:
- BINARY_DOUBLE
- BINARY_FLOAT
- CHAR
- DATE
- INTERVAL DAY TO SECOND
- INTERVAL YEAR TO MONTH
- NCHAR
- NUMBER
- NVARCHAR2
- RAW
- TIMESTAMP
- VARCHAR2
TDE是在SQL层对数据进行加密的,如果使用数据库工具绕过了SQL层,那么就不能使用TDE对数据进行加密了,同时,TDE不能对外键进行加密。
3.1.2 加密表中的列
1)创建新表时对列加密(使用默认算法)
默认情况下,TDE使用AES加密算法进行加密,密钥长度为192字节,即AES192。如果没指定加密列的算法,默认使用AES192。
SQL> create table student(
2 id number,
3 first_name varchar2(20),
4 last_name varchar2(20),
5 phone varchar2(15) encrypt);
Table created.
该示例对phone进行加密,使用默认算法AES192,并且SALT和MAC均是默认值。SALT是加密前在给定的字段加的长度为16的随机字符串,用于防破解,而MAC是TDE加的消息认证代码,用于完整性检查。
SQL> desc student;
Name Null? Type
----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
ID NUMBER
FIRST_NAME VARCHAR2(20)
LAST_NAME VARCHAR2(20)
PHONE VARCHAR2(15) ENCRYPT
2)创建新表时对列加密(不使用默认算法)
如果创建表时,指定列不使用默认算法,需通过ENCRYPT USING字句,非默认算法包括:3DES168、AES128、AES256。
SQL> create table employee(
2 id number encrypt no salt,
3 first_name varchar2(20),
4 last_name varchar2(20),
5 salary number(6) encrypt using '3DES168');
Table created.
3)在已存在的表新增加密列
SQL> alter table student add id_card varchar2(20) encrypt;
Table altered.
4)加密表中未加密的列
SQL> alter table student modify first_name encrypt;
Table altered.
5)对表中的列禁用加密
SQL> alter table student modify first_name decrypt;
Table altered.
6)测试TDE加密
--创建测试数据
SQL> insert into student values(1,'Alen','Liu','110','123454');
1 row created.
SQL> commit;
Commit complete.
--查看TDE密钥状态及位置,目前是打开状态
SQL> select wrl_parameter,status,wallet_type from v$encryption_wallet;
WRL_PARAMETER STATUS WALLET_TYP
---------------------------------------- ---------- ----------
/u01/app/oracle/admin/ORCL/wallet OPEN PASSWORD
--查看数据可以看到
SQL> select * from scott.student;
ID FIRST_NAME LAST_NAME PHONE ID_CARD
---------- -------------------- -------------------- --------------- --------------------
1 Alen Liu 110 123454
--关闭TDE密钥
SQL> administer key management set keystore close identified by system;
keystore altered.
SQL> select wrl_parameter,status,wallet_type from v$encryption_wallet;
WRL_PARAMETER STATUS WALLET_TYP
---------------------------------------- ---------- ----------
/u01/app/oracle/admin/ORCL/wallet CLOSED UNKNOWN
--执行查询,出错,提示密钥库未打开
SQL> select * from scott.student;
select * from scott.student
*
ERROR at line 1:
ORA-28365: wallet is not open
SQL> select id,first_name,last_name from scott.student;
ID FIRST_NAME LAST_NAME
---------- -------------------- --------------------
1 Alen Liu
可以看到,当密钥存储库关闭时,加密列不可访问,但未加密的字段可以正常访问。
3.2 加密表空间
TDE表空间加密概览:
对于表空间的加密,加密算法默认时AES128。
1)加密表空间(使用默认算法)
SQL> create tablespace testdata datafile '/u01/app/oracle/oradata/ORCL/testdata01.dbf' size 100m encryption default storage(encrypt);
Tablespace created.
2)加密表空间(使用非默认算法)
SQL> create tablespace studata datafile '/u01/app/oracle/oradata/ORCL/studata01.dbf' size 100m encryption using 'AES256' default storage(encrypt);
Tablespace created.
SQL> col tablespace_name for a30
SQL> select tablespace_name,encrypted from dba_tablespaces where tablespace_name='STUDATA';
TABLESPACE_NAME ENC
------------------------------ ---
STUDATA YES
3)移动表至加密表空间中
SQL> alter table emp_new move tablespace testdata;
Table altered.
4 加密数据(Cloud Control方式)
4.1 加密表中的列
1)打开Cloud Control,访问数据库主页
2)输入口令,点击登录
3)这里我使用已创建的表作为示例,如果新增表,点击创建即可
4)点击编辑
5)选择加密的列,如果更改加密算法,点击加密选项更改即可,点击应用
6)点击链接,可以查看执行结果
7)执行成功,点击确定
8)查看加密的列
4.2 加密表空间
1)打开Cloud Control,访问数据库主页
2)点击创建
3)输入表空间名称,点击添加
4)输入文件名,点击继续
5)勾选加密,如果更改加密算法,点击加密选项,在弹出的页面选择对应的加密算法
6)创建成功
5 TDE相关的数据字典视图
5.1 v$wallet
该数据字典视图显示TDE的主加密密钥信息。
5.2 v$encryption_wallet
该视图展示了TDE的密钥库和密钥的位置信息。
5.3 v$encryption_keys
该视图展示了TDE主加密密钥信息。
5.4 v$encrypted_tablespaces
该视图展示了加密的表空间信息。
5.5 dba_encrypted_columns / all_encrypted_columns / user_encrypted_columns
该视图展示了已加密的表中的列的信息。