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