Oracle 應用服務器應用程序使用 Sec_Manager.Secure_Package 程序包中的例程存儲加密格式的私人數據(如使用 Secure_Package.Secure_Data 存儲 CARD_NO 數據)。根據create_packages.sql中描述的定制加密程序包的定義,對 CARD_NO 列的訪問已被函數調用所取代,該函數調用的參數是要存儲在列中的值以及用于數據解密的密鑰。
例如,要將“a1b2c3d4”用作加密密鑰,必須將最初如下所示的典型 INSERT 語句
insert into CUSTOMER (NAME, CARD_NO) values ('Jane Doe', '1234123412341234');轉換為:
insert into CUSTOMER (NAME, CARD_NO) values ('Jane Doe', Sec_Manager.Secure_Package.Secure_Data('1234123412341234','a1b2c3d4'));同樣,Oracle 應用服務器應用程序還使用 Sec_Manager.Secure_Package 中的例程讀取加密格式的數據,如 CARD_NO 數據的 Secure_Package.Clear_Data。然后利用插入值時使用的加密密鑰來以明文格式取回受保護信息。這種情況下,必須將最初為如下所示的典型 SELECT 語句
select NAME, CARD_NO from CUSTOMER;修改為:
select NAME, Sec_Manager.Secure_Package.Clear_Data(CARD_NO,'a1b2c3d4') from CUSTOMER;
當完成所有開發(希望由值得信任的人員完成)后,還可以將升級后的代碼加密,以便甚至連升級腳本的數據庫管理員都無法確切了解安全性的實現方法。通過 Oracle 提供的實用程序實現加密,可以使用如下所示命令
wrap iname=Secure_Package.sql oname=Secure_Package.sec打包后,可以在 SQL*Plus 提示符后象執行任何明文腳本一樣執行 Secure_Package.sec,且 Oracle 引擎還將對其進行解釋。同一概念也可應用于任何其他與安全性相關的 PL*SQL 腳本。此方法不但禁止了參與代碼升級的人員(數據庫管理員、開發人員、支持和管理人員)查看程序包內容,而且程序包內容還以加密格式部署到數據庫中,因此以后要嘗試破解這些程序包內容是很難的。
即使具有數據庫管理員權限的入侵者將 CONNECT 權限授予安全對象所有者 Sec_Manager 以查看保護和加密程序包的內容,也不會有任何明文會存儲在這些對象的數據庫中。由于 Oracle 未提供任何“解包”實用程序,因此入侵者將必須破解 Oracle 的加密算法才能夠查看程序包內容。
即使所有安全措施都已經到位了,了解是否對機密數據進行了未授權訪問仍很重要。最簡單的方法是使用內置的數據庫審計功能在表級別監視對受保護數據的訪問(SELECT、INSERT、UPDATE、DELETE),而不管請求事務的數據庫連接如何,命令如下:audit insert, update, select on SHIP2004.CUSTOMER;但使用 Oracle Fine Grained Auditing (FGA),您可以進一步改進訪問監視以最小化處理開銷并提供有意義的信息。enable_fga.sql 中提供的示例使用 DBMS_FGA 程序包啟用基本的審計策略。數據庫中的內置審計機制禁止用戶繞過審計,從而確保了它的精確性??梢栽?DBA_FGA_AUDIT_TRAIL 視圖以及 DBA_COMMON_AUDIT_TRAIL 視圖中查看審計記錄,在策略指定 audit_trail = DBMS_FGA.DB_EXTENDED 的情況下,審計記錄甚至可以包含 SQLBIND 和 SQLTEXT 信息。 可以使用 Oracle 提供的功能輕松地增強此處提供的示例,從而加入電子郵件或尋呼機通知和激活條件,以只生成特定事件的審計記錄。