oracle 10g R2 新特性 TDE

在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_ext
organization external
(
type oracle_datapump
default directory dump_dir
location ('accounts_1_ext.dmp',
'accounts_2_ext.dmp',
'accounts_3_ext.dmp',
'accounts_4_ext.dmp')
)
parallel 4
as
select 
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_DT
from accounts;
在文件 accounts_*_ext.dmp 中,SSN 和 FOLIO_ID 的值不會是明文,而是加密形式。如果您希望使用這些文件作爲外部表,則必須提供 topSecret 作爲口令以讀取這些文件。

在這裏您可以看到,TDE 是訪問控制的理想補充(而不是替代)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章