在Oracle的最新版本10g R2中,出現最及時的技術應該是透明資料加密技術(Transparent Data Encryption,TDE)。這一技術包含在Oracle進階安全選項裡,每處理器的費用為10,000美元,只供企業版使用者使用。
與之前Oracle發布的隱蔽工具包相比,TDE是一個巨大的飛躍。雖然工具包是免費的,但遠遠不能滿足使用者的需求。不但需要手工改寫代碼,還要修改程式碼來調用加密的API。
透明資料加密
對於加密,許多使用者深感矛盾:他們既感興趣,又因意識密鑰管理的複雜性而感到謹慎,如果處理不當,則會導致設定的效率低下。加密和解密值還會帶來相關的效能開銷,這使得大部分應用程式架構師不太樂於接受該過程。結果是,很多系統設計根本沒有加密,只是構築了強大的外圍防護,如強大的口令和適當的授權方案。
但是,請想象一下如果整個伺服器被盜了,甚至只是磁碟被盜,這些磁碟可以裝配在具有相同作業系統的伺服器上,然後其中的資料將被銷毀殆盡。或者有一個的 DBA 品行不端,在日常商務活動中惡意突破了外圍防護,然後將您所有重要的客戶資訊洗劫一空。在這兩種情況下,如果所涉及的商業機構是在加利福尼亞州(可能不久之後在美國的其他州),它們在法律上有責任將安全性漏洞的情況通知給所有受到影響的客戶。
在上述罕見(但確是事實)的情況中,認證方案沒有實際意義。這就是為什麼對於那些將安全作為頭等大事的機構而言,透明資料加密 (TDE) 是一個如此有用的特性;它支援加密,同時將密鑰管理的複雜性交給資料庫引擎來處理。同時,它允許 DBA 在不必實際看到資料的情況下管理資料庫表。
在 Oracle 資料庫 10g 第 2 版中使用 TDE 時,可以隨時地對錶中的一列或多列進行加密;只需將列定義為加密形式即可,不用編寫代碼。請記住,加密需要使用密鑰和演算法對輸入值進行加密。TDE 為特定的表產生單獨的密鑰。這種方法方便了密鑰管理卻也更易被他們竊取,所以資料庫提供了另一種密鑰 — 萬能密鑰 — ,它可以在資料庫層級上設定。表密鑰是利用萬能密鑰進行加密的,要獲得表密鑰就需要這個萬能密鑰。因此,對列進行解密時需要萬能密鑰和表密鑰。(有關常規加密以及在 Oracle 中使用供應程式包的進一步探討,請參見 Oracle 雜誌專欄“為您的資料資產加密”。)
萬能金鑰儲存區在資料庫外一個稱為“錢夾”的地方 — 預設位置在 $ORACLE_BASE/admin/$ORACLE_SID/wallet。在概念上,它類似於。
在配置 TDE 之後 — 或者更明確地說是配置了錢夾和萬能密鑰之後 — 您可以使用它來保護資料值。要為表的一列加密,需要使用以下 SQL:
create table accounts(acc_no number not null,first_name varchar2(30) not null,last_name varchar2(30) not null,SSN varchar2(9) ENCRYPT USING 'AES128',acc_type varchar2(1) not null,folio_id number ENCRYPT USING 'AES128',sub_acc_type varchar2(30),acc_open_dt date not null,acc_mod_dt date,acc_mgr_id number)
在這裡,您在列 SSN 和 FOLIO_ID 上使用了 TDE,它們現在以加密方式儲存在表本身。但是,當使用者從表中選擇時,她看到以明文表示的資料,因為在檢索過程中已經完成瞭解密。如果磁碟被盜,則包含在表段中的資訊仍然保持加密狀態。盜竊者需要表密鑰才能看到加密的值,但是要獲得表密鑰,他需要萬能密鑰,而萬能金鑰儲存區在外部,因此無法獲得。
注意列 SSN 和 FOLIO_ID 後面的子句,這些子句指定 ENCRYPT 使用 128 位進階加密標準。
資料庫擁有預先配置的錢夾。要設定錢夾口令,可使用命令:
alter system set encryption key authenticated BY "topSecret";
如果還未建立錢夾,該命令將先建立錢夾,然後將口令設定為“topSecret”(區分大小寫)。然後您就可以開始在表的建立和更改期間將加密用於列定義。
為外部表格加密
在以上樣本中,我使用散列表為列加密。您還可以在外部表格上使用 TDE。例如,如果您希望產生一個包含 ACCOUNTS 的資料的轉儲檔案,以便發送到不同的地點,則可以使用簡單的 ENCRYPT 子句。
create table account_extorganization external(type oracle_datapumpdefault directory dump_dirlocation ('accounts_1_ext.dmp','accounts_2_ext.dmp','accounts_3_ext.dmp','accounts_4_ext.dmp'))parallel 4asselect ACC_NO,FIRST_NAME,LAST_NAME,SSN ENCRYPT IDENTIFIED BY "topSecret",ACC_TYPE,FOLIO_ID ENCRYPT IDENTIFIED BY "topSecret",SUB_ACC_TYPE,ACC_OPEN_DT,ACC_MOD_DTfrom accounts;
在檔案 accounts_*_ext.dmp 中,SSN 和 FOLIO_ID 的值不會是明文,而是加密形式。如果您希望使用這些檔案作為外部表格,則必須提供 topSecret 作為口令以讀取這些檔案。
在這裡您可以看到,TDE 是存取控制的理想補充(而不是替代)。