Oracle应用服务器使用Sec_Manager.Secure_Package 程序包中的例程存储加密格式的私人数据。根据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 的加密算法才能够查看程序包内容。

使用内置的数据库审计功能访问受保护数据

即使所有安全措施都已经到位了,了解是否对机密数据进行了未授权访问仍很重要。最简单的方法是使用内置的数据库审计功能在表级别监视对受保护数据的访问(SELECTINSERTUPDATEDELETE),而不管请求事务的数据库连接如何,命令如下:

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 的情况下,审计记录甚至可以包含 SQLBINDSQLTEXT信息。

可以使用 Oracle 提供的功能轻松地增强此处提供的示例,从而加入电子邮件或寻呼机通知和激活条件,以只生成特定事件的审计记录。

小知识之脚本:

脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。