Oracle 透明資料加密--列加密
TDE的目的:用最小的代價加密敏感資料,避免可能的對資料檔案的盜竊帶來的破壞。不過,注意,強調的重點是透明——也就是說,加密是自動進行的,解密也一樣。在資料庫中。Oracle不會區分使用者。當一個使用者具有查詢物件的許可權時,Oracle都會明文給出資料值
TDE總共有三層加密,第一層,wallet金鑰的驗證密碼,這個值是人工設定的密碼,第二層wallet金鑰,第三層,表金鑰,所以只要任何一層沒被竊取,你的資料都是相對安全的。
使用限制:
1.不能在主鍵,外來鍵列使用TDE
2.對於使用了TDE的列我們只能建立b樹索引。
3.大物件資料型別不可以使用,BLOB,CLOB
4.import/export
5.其他直接訪問資料庫資料檔案的工具不可以使用
支援的加密演算法:
Algorithm | Key Size | Parameter Name |
---|---|---|
Triple DES (Data Encryption Standard) | 168 bits |
|
AES (Advanced Encryption Standard) | 128 bits |
|
AES | 192 bits (default) |
|
AES | 256 bits |
|
支援加密的資料型別
CHAR
DATE
INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH
NCHAR
NUMBER
NVARCHAR2
RAW
TIMESTAMP
(includesTIMESTAMP WITH TIME ZONE
andTIMESTAMP WITH LOCAL TIME ZONE
)VARCHAR2
Task | SQL Command |
---|---|
Add encrypted column to existing table |
|
Create table and encrypt column |
|
Encrypt unencrypted existing column |
|
Master key: set or reset |
|
Master key: set or reset to use PKI certificate |
|
Wallet: open to access master keys |
|
舉例:
系統建立wallet目錄,指定wallet位置
mkdir -p /opt/oracle/admin/skydb/wallet
修改sqlnet.ora加入以下內容
ENRYPTION_WALLET_LOCATION =(SOURCE=(METHOD=file)METHOD_DATA=(DIRECTORY=/opt/oracle/admin/skydb/wallet))
資料庫裡建立wallet並且設定訪問密碼
alter system set encryption key authenticated by "123456";
建立帶有加密列的表,插入相關資料
create table en_tab (id int,name varchar(20),salary number(10,2) encrypt using 'AES256');
insert into en_tab values(1,'dabing',50000.00);
insert into en_tab values(2,'newboy',50000.00);
設定了密碼後可以手動開啟或者關閉wallet
開啟wallet
alter system set encryption wallet open authenticated by "123456";
關閉wallet
alter system set encryption wallet close;
如果有查詢許可權,不加密的列可以查詢,加密的無法查詢,必須開啟wallet才可以
SQL> desc hank.en_tab;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
NAME VARCHAR2(20)
SALARY NUMBER(10,2) ENCRYPT
SQL> select id,name from hank.en_tab;
ID NAME
---------- --------------------
1 dabing
2 newboy
SQL> select SALARY from hank.en_tab;
select SALARY from hank.en_tab
*
ERROR at line 1:
ORA-28365: wallet is not open
開啟wallet,可以正常訪問加密列
SQL> alter system set encryption wallet open authenticated by "123456";
System altered.
SQL> select SALARY from hank.en_tab;
SALARY
----------
50000
50000
只能建立no salt的btree索引
SQL> create index ind_sar on en_tab (salary);
create index ind_sar on en_tab (salary)
*
ERROR at line 1:
ORA-28338: cannot encrypt indexed column(s) with salt
SQL> alter table en_tab modify (salary ENCRYPT NO SALT);
Table altered.
SQL> create index ind_sar on en_tab (salary);
Index created.
可以參看資料字典檢視那些列被加密
SQL> select * from user_encrypted_columns;
TABLE_NAME COLUMN_NAME ENCRYPTION_ALG SAL
------------------------------ ------------------------------ ----------------------------- ---
EN_TAB SALARY AES 256 bits key NO