Oracle SecureFiles是在Oracle 11g引入的,它有传统的大对象(已经更名为BasicFile LOB)所不具备的一些优势。Oracle SecureFile LOB支持智能数据压缩,它是一种消除多次存储相同数据副本的去重方法,还支持其他一些使用大对象提升性能的特性。这些新特性中最有用的一个是Oracle的透明数据加密功能,目前已经扩展并加入了Oracle SecureFiles。
当我们在一个或多个LOB字段上启用透明数据加密(TDE)时,Oracle会在数据文件、备份文件和重做日志文件的块层次上自动对字段执行加密和解密操作。在启用之后,LOB只能按照逐个字段的方式执行加密,这个字段的所有LOB(跨越所有可用分区)都会加密。应用程序和访问数据表的用户完全不知道所发生的透明数据加密操作。然而,由于传统的导入导出工具和基于可转移表空间的导出操作不支持TDE,所以在移动这些包含加密字段的数据时必须使用Data Pump导入和导出工具。
TDE支持下面的加密算法:
3DES16——使用168位密钥的三重数据加密标准。
AES128——使用128位密钥的高级加密标准。
AES192——使用192位密钥的高级加密标准。这是默认算法。
AES256——使用256位密钥的高级加密标准。
在开始使用透明数据加密之前,安全管理员必须先创建一个wallet和设定一个主密钥。我们可以使用与其他Oracle数据库组件共享的默认数据库wallet。此外,我们可以创建一个TDE专用的独立wallet。Oracle强烈建议使用一个独立wallet来存储主加密密钥。如果sqlnet.ora文件中没有设置ENCRYPTION_WALLET_LOCATION参数,那么它就会使用WALLET_LOCATION值。如果sqlnet.ora文件没有设置WALLET_LOCATION,那么它就会使用默认数据库wallet。默认数据库wallet的位置是ORACLE_BASE/admin/DB_UNIQUE_NAME/wallet。
如果使用TDE专用的wallet,那么必须使用ENCRYPTION_WALLET_LOCATION参数在sqlnet.ora文件中指定wallet位置。主密码将用于保护数据表密码和表空间加密密钥,并且存储在外部安全模块中。默认情况下,TDE会生成一个随机密钥。此外,它也可能是来自于专门用于加密的PKI证书的现有密钥对。
使用下面的命令,就可以设置主加密密钥:
ALTER SYSTEM SET ENCRYPTION KEY ["certificate_ID"] IDENTIFIED BY "password";
certificate_ID ——这是一个可选字符串,它包含了Oracle wallet所存储证书的唯一标识符。如果想要使用PKI私有密钥作为主加密密钥,则可以使用这个参数。
password ——这是安全模块一定要使用的wallet密码。它区分大小写。
这个数据库必须将主加密密钥加载到内存中,然后它才能加密或解密字符/表空间。下面的ALTER SYSTEM命令将显式打开wallet:
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password"
其中的“password”值是指创建加密密钥时所使用的密码。这个密码串必须添加到双号中。在wallet打开之后,它会一直保持打开,直到数据库实例关闭或显式关闭wallet。下面的命令将显式关闭wallet:
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "password"
关闭wallet将禁用所有加密和解密操作。每当我们重新启动一个数据库实例,我们都必须打开wallet,重新启用加密和解密操作。一旦创建和打开了wallet,我们就可以在ENCRYPT子句中使用CREATE TABLE和ALTER TABLE命令。
用于加密非LOB字段的透明数据加密语法与在Oracle SecureFiles中启用加密的语法完全相同。它们有一个重要的区别,非LOB字段可以使用NO SALT参数阻止TDE在加密数据之前先给数据添加一个随机字符串。Oracle SecureFile LOB字段不支持NO SALT选项。我们可以使用数据字典视图USER_ENCRYPTED_COLUMNS确定应该加密哪一些字段,以及这些字段的状态。下面是一些ENCRYPT子句的例子:
CREATE TABLE tab_3DES (col1 CLOB ENCRYPT USING '3DES168')
LOB(col1) STORE AS SECUREFILE(
CACHE
NOLOGGING
);
使用默认加密算法(AES192)和一个密码创建一个Oracle SecureFile LOB字段:
CREATE TABLE tab_enc_pw (col1 CLOB ENCRYPT IDENTIFIED BY badpassword)
LOB(col1) STORE AS SECUREFILE(
CACHE
);
使用AES256启用LOB加密:
ALTER TABLE tab_nocrypt MODIFY
( col1 CLOB ENCRYPT USING 'AES256');
通过重新生成加密密钥修改一个Oracle SecureFiles字段:
ALTER TABLE tab_3DES REKEY USING 'AES256';
Disable LOB encryption:
禁用LOB加密:
ALTER TABLE tab_enc_pw MODIFY
( col1 CLOB DECRYPT);
Oracle数据库中存储的大对象数据容量会继续增长,但是存储费用在不断下降。其中有许多的敏感数据,如医疗记录、员工数据和知识产权。能够对这些信息进行加密,这是非常宝贵的,也可以避免在将来投入大量金钱和精力去实现安全性。