我們所需要做的就是把某列聲明成加密的,剩下的全部由Oracle完成。當使用者插入或者更新資料時,列值會被截獲、加密,然後用加密後的格式儲存。然後,當這一列被查詢時,又會自動對列值進行解密,然後把解密後的文本(明文)返回給使用者。使用者甚至都不需要知道發生過加密和解密——也就是所謂的透明。全部都是由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 |
3DES168 |
AES (Advanced Encryption Standard) |
128 bits |
AES128 |
AES |
192 bits (default) |
AES192 |
AES |
256 bits |
AES256 |
支援加密的資料類型
CHAR
DATE
INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH
NCHAR
NUMBER
NVARCHAR2
RAW
TIMESTAMP (includes TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE)
VARCHAR2
參考命令說明
| Task |
SQL Command |
Add encrypted column to existing table |
ALTER TABLE table_name ADD (column_name datatypeENCRYPT); |
Create table and encrypt column |
CREATE TABLE <table_name> (column_name datatypeENCRYPT); |
Encrypt unencrypted existing column |
ALTER TABLE table_name MODIFY (column_name ENCRYPT); |
Master key: set or reset |
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY <password>; |
Master key: set or reset to use PKI certificate |
ALTER SYSTEM SET ENCRYPTION KEY <certificate_ID>IDENTIFIED BY <password>; |
Wallet: open to access master keys |
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY <password>; |
舉例:系統建立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開啟walletalter system set encryption wallet open authenticated by "123456";關閉walletalter system set encryption wallet close;如果有查詢許可權,不加密的列可以查詢,加密的無法查詢,必須開啟wallet才可以SQL> desc hank.en_tab; Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(38) NAME VARCHAR2(20) SALARY NUMBER(10,2) ENCRYPTSQL> select id,name from hank.en_tab; ID NAME---------- -------------------- 1 dabing 2 newboySQL> 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 saltSQL> 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
參考:https://docs.oracle.com/cd/B19306_01/network.102/b14268/asotrans.htm#ASOAG600