對于資料庫的安全性而言,除了使用用戶、權限和角色進行控制外,還可以通過資料加密或者資料掩碼來實作,關于透明的資料加密,可以對個別表列或整個表空間進行加密,當用戶向加密的列中插入資料時,透明資料加密會自動加密該資料,當用戶選擇該列時,資料將自動解密,選擇完畢后,資料將重新加密,
本篇就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
該視圖展示了已加密的表中的列的資訊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2477.html
標籤:Oracle
下一篇:了解Spring
