如何在Oracle SecureFiles中加密數據
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數據庫中存儲的大對象數據容量會繼續增長,但是存儲費用在不斷下降。其中有許多的敏感數據,如醫療記錄、員工數據和知識產權。能夠對這些信息進行加密,這是非常寶貴的,也可以避免在將來投入大量金錢和精力去實現安全性。