如何在Oracle SecureFiles中加密數(shù)據(jù)
Oracle SecureFiles是在Oracle 11g引入的,它有傳統(tǒng)的大對象(已經(jīng)更名為BasicFile LOB)所不具備的一些優(yōu)勢。Oracle SecureFile LOB支持智能數(shù)據(jù)壓縮,它是一種消除多次存儲相同數(shù)據(jù)副本的去重方法,還支持其他一些使用大對象提升性能的特性。這些新特性中最有用的一個是Oracle的透明數(shù)據(jù)加密功能,目前已經(jīng)擴(kuò)展并加入了Oracle SecureFiles。
當(dāng)我們在一個或多個LOB字段上啟用透明數(shù)據(jù)加密(TDE)時,Oracle會在數(shù)據(jù)文件、備份文件和重做日志文件的塊層次上自動對字段執(zhí)行加密和解密操作。在啟用之后,LOB只能按照逐個字段的方式執(zhí)行加密,這個字段的所有LOB(跨越所有可用分區(qū))都會加密。應(yīng)用程序和訪問數(shù)據(jù)表的用戶完全不知道所發(fā)生的透明數(shù)據(jù)加密操作。然而,由于傳統(tǒng)的導(dǎo)入導(dǎo)出工具和基于可轉(zhuǎn)移表空間的導(dǎo)出操作不支持TDE,所以在移動這些包含加密字段的數(shù)據(jù)時必須使用Data Pump導(dǎo)入和導(dǎo)出工具。
TDE支持下面的加密算法:
3DES16——使用168位密鑰的三重數(shù)據(jù)加密標(biāo)準(zhǔn)。
AES128——使用128位密鑰的高級加密標(biāo)準(zhǔn)。
AES192——使用192位密鑰的高級加密標(biāo)準(zhǔn)。這是默認(rèn)算法。
AES256——使用256位密鑰的高級加密標(biāo)準(zhǔn)。
在開始使用透明數(shù)據(jù)加密之前,安全管理員必須先創(chuàng)建一個wallet和設(shè)定一個主密鑰。我們可以使用與其他Oracle數(shù)據(jù)庫組件共享的默認(rèn)數(shù)據(jù)庫wallet。此外,我們可以創(chuàng)建一個TDE專用的獨立wallet。Oracle強(qiáng)烈建議使用一個獨立wallet來存儲主加密密鑰。如果sqlnet.ora文件中沒有設(shè)置ENCRYPTION_WALLET_LOCATION參數(shù),那么它就會使用WALLET_LOCATION值。如果sqlnet.ora文件沒有設(shè)置WALLET_LOCATION,那么它就會使用默認(rèn)數(shù)據(jù)庫wallet。默認(rèn)數(shù)據(jù)庫wallet的位置是ORACLE_BASE/admin/DB_UNIQUE_NAME/wallet。
如果使用TDE專用的wallet,那么必須使用ENCRYPTION_WALLET_LOCATION參數(shù)在sqlnet.ora文件中指定wallet位置。主密碼將用于保護(hù)數(shù)據(jù)表密碼和表空間加密密鑰,并且存儲在外部安全模塊中。默認(rèn)情況下,TDE會生成一個隨機(jī)密鑰。此外,它也可能是來自于專門用于加密的PKI證書的現(xiàn)有密鑰對。
使用下面的命令,就可以設(shè)置主加密密鑰:
ALTER SYSTEM SET ENCRYPTION KEY ["certificate_ID"] IDENTIFIED BY "password";
certificate_ID ——這是一個可選字符串,它包含了Oracle wallet所存儲證書的唯一標(biāo)識符。如果想要使用PKI私有密鑰作為主加密密鑰,則可以使用這個參數(shù)。
password ——這是安全模塊一定要使用的wallet密碼。它區(qū)分大小寫。
這個數(shù)據(jù)庫必須將主加密密鑰加載到內(nèi)存中,然后它才能加密或解密字符/表空間。下面的ALTER SYSTEM命令將顯式打開wallet:
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password"
其中的“password”值是指創(chuàng)建加密密鑰時所使用的密碼。這個密碼串必須添加到雙號中。在wallet打開之后,它會一直保持打開,直到數(shù)據(jù)庫實例關(guān)閉或顯式關(guān)閉wallet。下面的命令將顯式關(guān)閉wallet:
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "password"
關(guān)閉wallet將禁用所有加密和解密操作。每當(dāng)我們重新啟動一個數(shù)據(jù)庫實例,我們都必須打開wallet,重新啟用加密和解密操作。一旦創(chuàng)建和打開了wallet,我們就可以在ENCRYPT子句中使用CREATE TABLE和ALTER TABLE命令。
用于加密非LOB字段的透明數(shù)據(jù)加密語法與在Oracle SecureFiles中啟用加密的語法完全相同。它們有一個重要的區(qū)別,非LOB字段可以使用NO SALT參數(shù)阻止TDE在加密數(shù)據(jù)之前先給數(shù)據(jù)添加一個隨機(jī)字符串。Oracle SecureFile LOB字段不支持NO SALT選項。我們可以使用數(shù)據(jù)字典視圖USER_ENCRYPTED_COLUMNS確定應(yīng)該加密哪一些字段,以及這些字段的狀態(tài)。下面是一些ENCRYPT子句的例子:
CREATE TABLE tab_3DES (col1 CLOB ENCRYPT USING '3DES168')
LOB(col1) STORE AS SECUREFILE(
CACHE
NOLOGGING
);
使用默認(rèn)加密算法(AES192)和一個密碼創(chuàng)建一個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數(shù)據(jù)庫中存儲的大對象數(shù)據(jù)容量會繼續(xù)增長,但是存儲費(fèi)用在不斷下降。其中有許多的敏感數(shù)據(jù),如醫(yī)療記錄、員工數(shù)據(jù)和知識產(chǎn)權(quán)。能夠?qū)@些信息進(jìn)行加密,這是非常寶貴的,也可以避免在將來投入大量金錢和精力去實現(xiàn)安全性。