標籤:
Oracle中對列加密的方法 2011-12-22 17:21:13
分類: Linux
Oracle支援多種列加密方式:
1,透明資料加密(TDE):
create table encrypt_col(id int,
txt varchar2(100) encrypt using ‘演算法名稱‘ identified by ‘密鑰‘ no salt);
優點:對應用完全透明
缺點:需要資料庫管理員管理wallet,增加了管理複雜性,也無法避免資料庫管理員查看原文。
2,使用DBMS_CRYPTO包
優點:只要應用程式儲存好密鑰,資料庫管理員無法察看:
測試:
DECLARE
input_string VARCHAR2 (200) := ‘Secret Message‘;
output_string VARCHAR2 (200);
encrypted_raw RAW (2000); -- stores encrypted binary text
decrypted_raw RAW (2000); -- stores decrypted binary text
num_key_bytes NUMBER := 256/8; -- key length 256 bits (32 bytes)
key_bytes_raw RAW (32); -- stores 256-bit encryption key
encryption_type PLS_INTEGER := -- total encryption type
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
BEGIN
DBMS_OUTPUT.PUT_LINE ( ‘Original string: ‘ || input_string);
key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
DBMS_OUTPUT.PUT_LINE ( ‘key_bytes_raw: ‘ || key_bytes_raw);
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_I18N.STRING_TO_RAW (input_string, ‘AL32UTF8‘),
typ => encryption_type,
key => key_bytes_raw
);
DBMS_OUTPUT.PUT_LINE (‘Encrypted string: ‘ || encrypted_raw);
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => encrypted_raw,
typ => encryption_type,
key => key_bytes_raw
);
output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, ‘AL32UTF8‘);
DBMS_OUTPUT.PUT_LINE (‘Decrypted string: ‘ || output_string);
END;
/
==>
Original string: Secret Message
key_bytes_raw : 2D9AB3BE8CDFBCD942162D0F6C90956C503E432D5128BE26116C39BA4DAC6B96
Encrypted string: 51E36E4576F951A940B671394B2FDC05
Decrypted string: Secret Message
------------------
透明資料加密常見問題集
TDE 有哪些相關的開銷?
與未加密的資料表空間相比,加密的資料表空間不會要求更高的儲存空間。
與列級 TDE 相關的開銷分為兩方面:儲存和效能。在效能方面,與加密或解密常用屬性(如信用卡號碼)相關的開銷估計為 5%。當索引基於加密列構建時,索引的建立將使用密文。如果經 TDE 加密的列已建立索引並為 SQL 陳述式引用,Oracle 將對 SQL 陳述式中用到的值進行透明加密並使用密文進行索引查詢。TDE 相關的儲存開銷可能會很大,這是因為每個加密值都有額外 20 個位元組的完整性檢查。此外,TDE 會將加密值填充到 16 個位元組,所以如果信用卡號碼要求 9 個位元組的儲存空間,加密該號碼將要求額外 7 個位元組的儲存空間。最後,如果為加密值指定了 salt,該 salt 將要求額外 16 個位元組的儲存空間。總之,加密表中的一列將要求每行有 33 到 48 個位元組的額外儲存空間。
--------------------------------------------------------------------------------
資料在網路上依然是加密狀態嗎?
使用 TDE 加密後的資料在離開資料庫前會首先進行解密。不過,這些資料可以通過 Oracle 的網路加密解決方案在網路上進行加密,該方案和 TDE 一同包含在 Oracle Advanced Security 選件中。Oracle 的網路加密解決方案可以對 Oracle SQL*Net 上傳送的所有資料進行加密。
--------------------------------------------------------------------------------
任何人只要獲得應用程式的授權就能對資料進行解密嗎?
是的,TDE 在使客戶能夠在資料庫內應用加密,而不影響現有的應用程式。以加密格式返回資料會破壞現有的應用程式。TDE 的優勢是,加密不會產生傳統資料庫加密解決方案所產生的開銷,傳統的方案要求有觸發器和視圖。
--------------------------------------------------------------------------------
TDE 與 Oracle 提供的加密方法有何不同?
Oracle 通過 Oracle8i 引入了 DBMS_OBFUSCATION_TOOLKIT。Oracle 10g 版本 1 引入了新的 DBMS_CRYPTO 程式包。這些程式包中的各種 API 可用於對資料庫內的資料進行手動加密。不過,此應用程式必須管理加密金鑰,並且要通過調用 API 進行要求的加密和解密操作。
--------------------------------------------------------------------------------
哪些密碼編譯演算法可與 TDE 一同使用?
TDE 支援 3DES168、AES128(資料表空間加密預設演算法)、AES192(列級 TDE 預設演算法)和 AES256。
--------------------------------------------------------------------------------
可以使用第三方密碼編譯演算法代替 TDE 提供的演算法嗎?
不可以,不能插入其他密碼編譯演算法。
--------------------------------------------------------------------------------
TDE 的許可方式是什嗎?
TDE 作為 Oracle Advanced Security 選件的一部分進行打包,該選件包含在 Oracle 企業版中。
--------------------------------------------------------------------------------
可以對帶有外鍵約束的列使用 TDE 嗎?
使用資料表空間加密時,即使某個表在加密的資料表空間外部,外鍵的加密方式也和加密資料表空間中儲存的所有其他元素相同。列級 TDE 不支援對外鍵約束中使用的列進行加密。這是因為單個表有它們自己的特殊加密金鑰。
--------------------------------------------------------------------------------
可以對聯結中使用的列進行加密嗎?
可以。即使聯結條件的列已加密,聯結表對於應用程式和使用者也是透明的。
--------------------------------------------------------------------------------
TDE 支援哪些資料類型?
由於資料表空間加密對整個資料表空間進行加密,在支援的資料類型上沒有限制。
下面的資料類型可使用列級 TDE 進行加密:
varchar2 nvarchar2
number date
binary_float binary_double
timestamp raw
char nchar
SecureFile LOBs
--------------------------------------------------------------------------------
何時使用列級 TDE 或資料表空間加密?
根據下面的指導原則確定具體方法的選擇:
僅對因合規性原因需要加密的資料進行加密(PCI-DSS 的信用卡和帳戶號碼;用於類似於 CA SB 1386 這樣的漏洞通知法律的地址、姓名和個人身份號碼(駕駛證,身份證)),或者對其他您認為的關鍵資料進行加密,如薪水、研究結果、客戶資訊。
如果您需要對外鍵列中的資料進行加密,或者您需要除 B 樹外的索引,又或者您需要對列級 TDE 不支援的資料類型進行加密,可選擇資料表空間加密。
如果列級 TDE 能夠滿足您的安全和安規性要求,您可以根據效能測試結果進行選擇
--------------------------------------------------------------------------------
加密金鑰可以更改嗎?
資料表空間加密的萬能密鑰不能重建。變通方法是,建立一個新的加密資料表空間,備份當前資料表空間,將所有表和其他內容從舊的資料表空間轉移到新資料表空間中,然後刪除舊的加密資料表空間。
列級 TDE 使用一個兩層密鑰機制。當列級 TDE 應用到現有的應用程式表列上時,Oracle 資料字典中會建立並儲存一個新的表鑰(用於該表中所有列)。該表鑰使用萬能祕密金鑰加密。萬能密鑰在 TDE 進行初始化時產生,並儲存在資料庫外部的 Oracle 錢夾或符合 PKCS#11 的 HSM 裝置中。萬能密鑰和列密鑰均可基於公司的安全性原則進行獨立修改。Oracle 建議在修改萬能密鑰前後均對錢夾進行備份。
--------------------------------------------------------------------------------
可否在 HSM 裝置中儲存用於資料表空間加密的萬能密鑰?
不可以。如果您從 10gR2 中的列加密移植到 11gR1 中的列和資料表空間加密,則必須首先在 11gR1 資料庫上重建萬能密鑰,以自動將用於資料表空間加密的萬能密鑰添加到您的軟體錢夾上,然後將列萬能密鑰移植到 HSM 裝置上。
--------------------------------------------------------------------------------
可以加密現有資料表空間嗎?
不可以。變通方法是,建立一個新的加密資料表空間,備份當前資料表空間,將所有表和其他內容從舊的資料表空間轉移到新資料表空間中,然後刪除舊的加密資料表空間。
--------------------------------------------------------------------------------
壓縮可否與資料表空間加密協同工作?
可以,內容在壓縮後進行加密。
--------------------------------------------------------------------------------
可傳輸的資料表空間可否與加密的資料表空間協同工作?
可以。但條件是,要麼目標資料庫上必須有萬能密鑰;要麼,如果已經使用了一個不同的萬能密鑰,使用 Oracle 資料泵對資料進行匯出和匯入,這可以通過轉儲檔案的可選加密來完成。
--------------------------------------------------------------------------------
什麼是錢夾?
錢夾是一個容器,用於儲存認證和簽署憑證,包括 TDE 萬能密鑰、PKI 私密金鑰、許可證和 SSL 需要的信託認證。藉助 TDE,可以在伺服器上使用錢夾來保護 TDE 萬能密鑰。此外,Oracle 要求在 SSL 上通訊的實體包含一個錢夾。除 Diffie-Hellman 外,該錢夾應當含有 X.509 版本 3 許可證、私密金鑰、信託認證列表。
Oracle 提供兩種類型錢夾:加密錢夾和自動開啟的錢夾。我們為 TDE 推薦加密錢夾(檔案名稱為 ewallet.p12)。資料庫啟動後和訪問 TDE 加密資料前,需手動開啟該錢夾。如果未開啟該錢夾,查詢受 TDE 保護的資料時資料庫將返回錯誤。自動開啟的錢夾(檔案名稱是 cwallet.sso)在資料庫啟動時會自動開啟。因此它適用於無人值守的 Data Guard 環境,在該環境中加密後的列會傳送到二級網站。
--------------------------------------------------------------------------------
TDE 中的密鑰管理功能如何?
TDE 中的密鑰管理組件括下面的功能:
產生
儲存
替換
銷毀
產生 — 在 TDE 中產生萬能密鑰可以通過資料庫中的隨機數產生器 (RNG) 來完成,或者管理員可以自行提供最多 70 個字元的字串。
儲存 — 一種選擇是將萬能金鑰儲存區在 Oracle 軟體錢夾中。該檔案應當受到適當 OS 許可的保護。根據 PKCS#5 標準,錢夾使用錢夾口令進行加密。錢夾口令不儲存在任何地方,在 Oracle Enterprise Manager 11g 中,該口令可以在任意數量的使用者或管理員間進行分割,他們必須以正確的順序輸入各自口令片斷,而與此同時他們當中無人知道整個口令。該口令甚至可以保護萬能密鑰不被擁有“root”許可權的使用者使用。
另一種選擇是將用於列級 TDE 的 TDE 萬能金鑰儲存區在硬體安全模組 (HSM) 上。Oracle 資料庫 11g 和 HSM 裝置之間的通訊基於標準的 PKCS#11 介面,它使得眾多 HSM 廠商都可與 Oracle 進行互操作。一旦裝置上產生了萬能密鑰,它將永遠不會在未加密的情況下離開裝置。
替換 — 通過簡單的命令就可以建立新的 TDE 萬能密鑰。傾刻間,資料庫中的所有列密鑰都會用舊的萬能密鑰解密然後用新的列密鑰進行加密。應用程式資料不會發生任何變化,因此該過程不會影響您資料庫的可用性。對於備份和恢複操作,到期的萬能金鑰儲存區在錢夾中。
銷毀 — 使用命令列公用程式“mkstore”可對萬能密鑰進行銷毀。使用“mkstore”前要對錢夾進行備份,同時要謹慎使用該程式,因為很容易刪除當前的萬能密鑰(該密鑰不能替換或重建)。
--------------------------------------------------------------------------------
如何保護錢夾和 TDE 萬能密鑰?
Oracle 資料庫 11g 允許在符合 PKCS#11 標準的 HSM 裝置上儲存列級 TDE 萬能密鑰,萬能密鑰永遠不會在未加密的情況下離開裝置。
對軟體錢夾(對於資料表空間加密和加密的轉儲檔案以及使用基於軟體的萬能密鑰所建立的備份而言,它是必需的)的訪問應當通過檔案層級的許可進行限制。加密該錢夾(基於 PKCS#5)的口令應當包含超過 10 個字母和數字字元。軟體錢夾口令可通過 Oracle Wallet Manager 修改。改變錢夾口令不會影響 TDE 萬能密鑰(它們彼此無關)。錢夾口令甚至可以阻止擁有“root”許可權並可訪問錢夾檔案的使用者擷取 TDE 萬能密鑰。
--------------------------------------------------------------------------------
Oracle Wallet Manager 在哪個預設位置尋找錢夾?
在 Unix 和 Linux 中,其位置是
/etc/ORACLE/WALLETS/<Oracle software owner user name>
通常轉換為
/etc/ORACLE/WALLETS/oracle
--------------------------------------------------------------------------------
可否使用 Oracle Wallet Manager (OWM) 為 TDE 建立加密錢夾和萬能密鑰
不能。如果您使用 Oracle Wallet Manager 建立加密錢夾,則無法包含 TDE 所需的萬能密鑰。只有以下 SQL 命令:
SQL> alter system set encryption key identified by "wallet_password";
能夠建立軟體錢夾(若其不存在),並為其添加一個萬能密鑰。
SQL> alter system set encryption key identified by "userID:password";
能夠在 HSM 裝置內建立一個萬能密鑰。使用者識別碼 和口令是 HSM 裝置內所建立的使用者的認證,用於支援與 Oracle 資料庫的通訊。在此之前,需要將 HSM 廠商的庫放到存檔的目錄中,同時需要在 sqlnet.ora 中將字串“METHOD=FILE”改為“METHOD=HSM”。
如果您希望升級到某個 HSM 裝置後繼續使用相同的萬能密鑰,使用:
SQL> alter system set encryption key identified by "userID:password"
migrate using "wallet_password";
--------------------------------------------------------------------------------
如何建立自動開啟的錢夾?
自動開啟的錢夾 (‘cwallet.sso‘) 需要利用現有的加密錢夾 (‘ewallet.p12‘) 建立,這樣萬能密鑰就能在自動開啟的錢夾中使用了。
您可以在 Oracle Wallet Manager (OWM) 中開啟加密錢夾,選中“Auto Login”複選框,然後選擇“Save”將自動開啟的錢夾寫到磁碟上,也可以使用命令列工具“orapki”:
orapki wallet create -wallet <wallet_location> -auto_login
兩種情況都要求提供錢夾口令。
--------------------------------------------------------------------------------
使用 Oracle 安全備份時,如何避免將 Oracle TDE 錢夾備份到 RMAN Database Backup所在的磁帶上?
RMAN 將資料庫檔案、重做日誌等添到備份檔案中,因此加密錢夾或自動開啟的錢夾不會成為Database Backup的一部分。Oracle 安全備份 (OSB) 使用資料集來定義待備份的作業系統檔案。OSB 自動排除自動開啟的錢夾 (‘cwallet.sso‘)。加密錢夾 (‘ewallet.p12‘) 不會被自動排除。您需要使用排除資料集語句來指定備份過程中需要跳過的檔案:
exclude name ewallet.p12
有關 EXCLUDE 關鍵字的詳細說明
--------------------------------------------------------------------------------
什麼是 Oracle 安全備份 (OSB)?
OSB 為 Oracle 資料庫提供最佳化的、高效的磁帶備份解決方案。OSB 能夠以加密的格式在磁帶上儲存資料,從而防範備份磁帶被盜竊。
--------------------------------------------------------------------------------
可否使用 Oracle 安全備份對發送至磁碟的備份進行加密?
不能。不過,Oracle RMAN 可與 Oracle Advanced Security 一起使用,以便對磁碟上的Database Backup進行加密。
--------------------------------------------------------------------------------
TDE 可否與 Data Guard 和 Oracle RAC 協同工作?
可以。TDE 可以與 Data Guard(物理或邏輯備份)和真正應用叢集 (RAC) 協同工作,但前提是,您必須將包含萬能密鑰的錢夾複製到其他執行個體中,同時要將各個執行個體上的錢夾開啟,以使這些執行個體均可使用該萬能密鑰。
--------------------------------------------------------------------------------
是否有其他不能與列級 TDE 協同工作的資料庫特性?
當資料經過 SQL 層時,列級 TDE 會對資料進行透明地加密和解密。Oracle 的某些特性會跳過 SQL 層,因此不能利用 TDE:
Materialized View Logs
Sync. and async. CDC (change data capture)
Classical LOBs (SecureFile LOBs
are supported)
--------------------------------------------------------------------------------
可否使用帶有直接路徑的 SQL*Loader 將資料載入到包含加密列的表中?
可以。SQL*Loader 文法、.dat 檔案和 .ctl 檔案不會有任何變化。如果目標表包含有加密的列,資料將在載入時進行透明加密。以下簡單樣本說明了如何使用帶有直接路徑的 SQL*Loader。只需將 ulcase6.sql 中的一行從
sal number(7,2),
更改為
sal number(7,2) encrypt no salt,
並使用 SQL*Loader 的正確文法:
sqlldr USERID=scott/tiger CONTROL=ulcase6.ctl LOG=ulcase6.log DIRECT=TRUE
--------------------------------------------------------------------------------
在重建萬能密鑰和/或列密鑰後如何恢複資料?
在建立備份後到將其恢複前,萬能密鑰已發生更改。
在這種情況下,恢複包含加密列的表對使用者而言是透明的。TDE 錢夾對到期萬能密鑰的曆史進行了記錄,同時自動將正確的萬能密鑰應用到備份資料上。這就是為什麼經常備份錢夾(備份到與加密資料不同的位置)如此重要的原因。
在建立備份後到將其恢複前,全部或部分加密列的列密鑰已重建:
如果已使用 RMAN 在磁碟上建立備份檔案,除非指示 RMAN 執行加密操作,否則檔案不會被加密。當檔案被讀取回時,它的列會使用新的列密鑰重新加密,而不論 RMAN 是否對檔案進行了加密。
--------------------------------------------------------------------------------
如何加密超大型表(包含數十億行)中的列?
對現有表中的列進行加密僅允許對該表進行 Read 訪問,而不允許進行 DML 操作。由於有數十億行,這一可用性有限的視窗會持續很長時間。聯機重新定義僅需要一個期間非常短的視窗對原始表進行鎖定。該時間長度與加密資料的數量或重新定義的複雜性無關,並且對使用者和應用程式是透明的。
--------------------------------------------------------------------------------
加密列中的現有資料後再查看資料庫檔案,有時仍能看到某些明文值。為什嗎?
這種情況與即使已刪除表或檔案、但仍然會在磁碟上看到資料的情況相同。在一個表的生命週期內,資料可能會在資料表空間內分段、重新整理、排序、複製和移動。這會在資料庫檔案中留下資料的“虛副本”。在加密現有列時,僅最新的“有效”副本被加密,這就將舊的明文版本留在了“虛副本”中。如果直接存取包含資料表空間的資料檔案,從而繞過資料庫的存取控制(例如,帶有十六進位編輯器的資料庫),那麼在那些塊被資料庫覆蓋之前,有時就會看到舊的明文值。為使風險最小化,請遵循下面的建議:
在新的資料檔案中建立一個新的資料表空間 (CREATE TABLESPACE ... )
對原始資料表空間和資料檔案中的明文值進行加密 (ALTER TABLE ...ENCRYPT)
對包含加密列的所有表執行步驟 2
將原始資料表空間中的所有表移到新的資料檔案中 (ALTER TABLE ....MOVE... )
刪除原始資料表空間 (DROP TABLESPACE)不要使用“and datafiles”參數,Oracle 推薦使用更強大的方法進行 OS 級操作,參見步驟 6
針對您的平台使用“shred”、“eraser”、“SDelete”或其他命令,以便在 OS 層級上刪除舊資料檔案
建議您使用第 6 步操作來降低資料庫檔案出現虛副本的機率,不論這些副本是由作業系統產生還是由儲存韌體產生。
Oracle中對列加密的方法