1. 程式人生 > >Oracle 透明資料加密--列加密

Oracle 透明資料加密--列加密

我們所需要做的就是把某列宣告成加密的,剩下的全部由Oracle完成。當用戶插入或者更新資料時,列值會被截獲、加密,然後用加密後的格式儲存。然後,當這一列被查詢時,又會自動對列值進行解密,然後把解密後的文字(明文)返回給使用者。使用者甚至都不需要知道發生過加密和解密——也就是所謂的透明。全部都是由Oracle程式碼內部完成,不需要任何觸發器或者複雜的過程邏輯。


TDE的目的:用最小的代價加密敏感資料,避免可能的對資料檔案的盜竊帶來的破壞。不過,注意,強調的重點是透明——也就是說,加密是自動進行的,解密也一樣。在資料庫中。Oracle不會區分使用者。當一個使用者具有查詢物件的許可權時,Oracle都會明文給出資料值
TDE總共有三層加密,第一層,wallet金鑰的驗證密碼,這個值是人工設定的密碼,第二層wallet金鑰,第三層,表金鑰,所以只要任何一層沒被竊取,你的資料都是相對安全的。
加密解密過程


使用限制:
1.不能在主鍵,外來鍵列使用TDE
2.對於使用了TDE的列我們只能建立b樹索引。
3.大物件資料型別不可以使用,BLOB,CLOB
4.import/export
5.其他直接訪問資料庫資料檔案的工具不可以使用
支援的加密演算法:
AlgorithmKey SizeParameter 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

參考命令說明
TaskSQL 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
開啟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