【12c】Oracle 12c Transparent Data Encryption透明数据加密

对于数据库的安全性而言,除了使用用户、权限和角色进行控制外,还可以通过数据加密或者数据掩码来实现,关于透明的数据加密,可以对个别表列或整个表空间进行加密。当用户向加密的列中插入数据时,透明数据加密会自动加密该数据。当用户选择该列时,数据将自动解密。选择完毕后,数据将重新加密。

本篇就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

该视图展示了已加密的表中的列的信息。

 

posted @ 2020-05-06 23:37  追梦男生  阅读(510)  评论(0编辑  收藏  举报