Oracle Transparent Data Encryption 透明加密(一)

realkid4發表於2010-12-15

摘要

 

Transparent Data Encryption透明機密技術是Oracle在10g版本之後推出的資料層加密技術。核心概念是藉助外接於資料庫的加密檔案,對資料表列乃至表空間等多層次進行加密。這種技術對儲存在資料庫中的敏感資訊,提供了簡單可靠的安全防護解決方案。

 

 

透明加密技術概要

 

簡單的說,Transparent Data Encryption(以下簡稱為TDE)是一種基於加密鍵key的訪問控制系統。加密過的資料直接放置在資料庫中,如果沒有解密授權,從資料庫中搜尋出的資料都是不可讀的非明文。只有指定的使用者ID進行讀取時,才進行自動的解密操作。

 

TDE的加密元件機制中包括主加密key(Master Encryption Key)和資料列加密key(Column Encryption Keys)。主加密key是儲存在資料庫外,通常是建立在一個安全目錄的檔案,受到系統級別安全管理。而資料列加密key是建立在資料庫的資料字典中。在資料庫外儲存的主加密key也稱為Oracle Wallet。

 

在工作的時候,Oracle是不需要利用如觸發器等元件的協助實現TDE功能。只需要指定進行加密處理的物件(資料列、表空間等),Oracle自己進行資料的加密和解密操作。進行加密和解密的時候,Oracle首先使用主加密key對資料字典裡的資料列key進行加解密,之後解密過的資料列key就可以資料列進行加解密操作。相當於將加解密的key分割在資料庫內部和資料庫外部兩部分。

 

 

使用TDE有一些獨特的優點:

 

1、  加密金鑰分割儲存,使得在儲存媒體或者資料檔案丟失的時候,保證敏感資料的安全;

2、  實現資料庫層次的加密,使得應用系統符合如PCI DSS標準在內的安全性規範要求;

3、  對資料使用使用者而言,加密解密的操作完全是透明的;

4、  過去一些不支援資料加解密的應用,可以直接進行無縫的移植。實現資料加密的要求;

 

同時,使用TDE的時候,還要注意一些限制,比如在外來鍵約束列上不能使用。還有一些特殊的索引型別和資料型別,在使用TDE的時候受到限制。

 

 

安裝配置TDE

1、  確定你的版本資訊

TDE是Oracle10gR2中推出的一個新功能,所以在規劃使用TDE的時候,要保證你的Oracle版本是在10gR2或者以上。

 

下面是筆者測試

 

SQL> select * from v$version;

 

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE 10.2.0.1.0     Production

 

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

 

 

2、建立一個新目錄,並指定為Wallet目錄

 

使用TDE的一個重要過程就是對於主加密key的建立管理,資料庫檔案外的key是存放在稱作wallet的目錄中。對key的使用,oracle支援多個資料庫元件使用相同的wallet,但是Oracle推薦使用單獨的wallet來存放主加密key。

 

設定wallet目錄的方法很簡單,在引數檔案sqlnet.ora中,按照下面的格式加入資訊:

 

ENCRYPTION_WALLET_LOCATION=

(SOURCE=(METHOD=FILE)

        (METHOD_DATA=

         (DIRECTORY=D:\oracle\product\10.2.0\admin\orcl\ORA_WALLET)))

 

ENCRYPTION_WALLET_LOCATION引數的作用就是告知Wallet的實現方式和物理位置。在上面的例項程式碼中,我們制定了一個目錄路徑,作為主加密Key的存放位置。

 

3、建立master key檔案,指定wallet密碼

 

使用SYS使用者登入系統,建立加密檔案。透過命令:

 

ALTER SYSTEM SET [ENCRYPTION] KEY IDENTIFIED BY password

 

其中,password相當於設定一個wallet密碼。Oracle Wallet是一個可以開啟關閉的功能元件,設定密碼之後,只有透過密碼口令可以啟用wallet功能。

 

SQL> alter system set encryption key identified by "password";

 

System altered

 

注意,在這裡,我們還可以選取一些更強壯的加密方法,來定義master key。如下:

 

 

ALTER SYSTEM SET ENCRYPTION KEY "j23lm781098dhb345sm" IDENTIFIED BY "p3812dH9E";

 

 

上述程式碼定義了PKI加密方法。

 

此時,我們可以發現在設定的目錄下,多出一個Personal Information Exchange型別的檔案,筆者機器上名稱為:ewallet.p12。相當於我們生成的master key檔案。

 

4、啟動、關閉Wallet

Wallet是一種功能,在實際中可以透過命令啟動或者關閉Wallet功能。

 

//嘗試開啟wallet功能,“”中包括的是指定的開啟密碼;

SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password";

 

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password"

 

//因為當前是開啟的狀態,所以提示錯誤

ORA-28354: wallet 已經開啟

 

//關閉Wallet

SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;

 

System altered

 

SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password";

 

System altered

 

 

到此,我們成功配置了Wallet,建立了master key。下面我們看如何使用TDE進行資料加密。

 

 

加密資料列

 

對資料列加密是TDE一個常用的功能。我們常常需要對資料庫中某個表的某個敏感資料進行加密處理,方式資訊的外洩。

 

首先,在定義資料表中的資料列(或者修改資料列)的時候,使用ENCRYPT進行標註。表示這個欄位是使用加密保護的重要字典。

 

SQL> create table t

  2  ( id number primary key,

  3    name varchar2(10) ENCRYPT);

 

Table created

 

上面的name列,使用了ENCRYPT進行標誌,表明需要對這個欄位進行加密處理,採用預設的加密配置。

 

注意:在預設不指定的情況下,Oracle在加密之前,對明文都要進行salt處理。所謂salt處理是一種強化加密資料的方法。透過在加密前明文中摻入一個隨機字串,來強化加密層級,防止進行字典攻擊和其他型別的破解操作。如果不需要進行salt處理,就是用No Salt在ENCRYPT後面。

 

使用salt是有一些限制的,如果列加密使用了salt,在對該列進行索引的時候,會報錯。

 

在加密演算法方面,Oracle也提供了一些非預設加密演算法,使用的時候,使用using關鍵字配合使用。加密方法如下:

 

l         3DES168

l         AES128

l         AES192 (default)

l         AES256

 

下面是一個使用No Salt和指定加密演算法的例子。

 

SQL> create table t_test

  2  (id number primary key,

  3   age number encrypt no salt,

  4   name varchar2(10) encrypt using '3DES168');

 

Table created

 

如果要對一個已經加密處理的資料列,解除加密,使用alter table DECRYPT關鍵字就可以實現,這裡不加以累述。

 

 

使用資料加密列

 

我們先向資料表t中插入一批資料

 

declare

  i number;

begin

 

  for i in 1..10 loop

    

     insert into t

     values (i,'Names : '||i);

  end loop;

 

  commit;

end ;

/

 

成功插入資料,並可以實現查詢。

 

SQL> select * from t;

 

        ID NAME

---------- ----------

         1 Names : 1

         2 Names : 2

          ……

10 rows selected

 

似乎和一般的沒有差別,但是如果我們關閉瞭解密Wallet會如何?

 

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as SYS

//關閉Wallet

SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;

 

System altered

//重新連回scott

SQL> conn scott/tiger@orcl;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

Connected as scott

 

//報錯

SQL> select * from t;

 

select * from t

 

ORA-28365: Wallet 未開啟

 

//能夠查詢到數目

SQL> select count(*) from t;

 

  COUNT(*)

----------

        10

//非加密欄位沒有問題

SQL> select id from t;

 

        ID

----------

         1

         2

……

 

10 rows selected

//加密欄位

SQL> select name from t;

 

select name from t

 

ORA-28365: Wallet 未開啟

 

 

從上面的例子看,TDE的作用就是最大限度的保護加密欄位,防止非法被訪問。

 

最後我們看看salt對索引的影響。

 

SQL> desc t_test;

Name Type         Nullable Default Comments

---- ------------ -------- ------- --------

ID   NUMBER                                

AGE  NUMBER       Y                         //no salt

NAME VARCHAR2(10) Y                         //salt

 

SQL> create index ind_t_test_name on t_test(name);

 

create index ind_t_test_name on t_test(name)

 

ORA-28338: 無法使用 salt 值加密索引列

 

SQL> create index ind_t_test_name on t_test(age);

 

Index created

 

相關的資料檢視

 

對於TDE而言,牽扯到的資料字典相對較少,而且容易理解。

l         dba_encrypted_columns:記錄所有的加密欄位;

l         all_encrypted_columns:記錄當前使用者所能訪問到的所有加密欄位;

l         user_encrypted_columns:記錄當前使用者自身Schema所有的加密欄位;

 

 

那麼,加密過程中,對效能的影響是如何?對master key的管理有什麼注意之處?我們下次繼續研究。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-681825/,如需轉載,請註明出處,否則將追究法律責任。

相關文章