Oracle中对列加密的方法
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/
通常轉換為
? /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 設備內創建一個萬能密鑰。用戶 ID 和口令是 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 -auto_login
兩種情況都要求提供錢夾口令。
--------------------------------------------------------------------------------
使用 Oracle 安全備份時,如何避免將 Oracle TDE 錢夾備份到 RMAN 數據庫備份所在的磁帶上?
RMAN 將數據庫文件、重做日志等添到備份文件中,因此加密錢夾或自動打開的錢夾不會成為數據庫備份的一部分。Oracle 安全備份 (OSB) 使用數據集來定義待備份的操作系統文件。OSB 自動排除自動打開的錢夾 ('cwallet.sso')。加密錢夾 ('ewallet.p12') 不會被自動排除。您需要使用排除數據集語句來指定備份過程中需要跳過的文件:
?? exclude name ewallet.p12
有關 EXCLUDE 關鍵字的詳細說明
--------------------------------------------------------------------------------
什么是 Oracle 安全備份 (OSB)?
OSB 為 Oracle 數據庫提供優化的、高效的磁帶備份解決方案。OSB 能夠以加密的格式在磁帶上存儲數據,從而防范備份磁帶被盜竊。
--------------------------------------------------------------------------------
可否使用 Oracle 安全備份對發送至磁盤的備份進行加密?
不能。不過,Oracle RMAN 可與 Oracle Advanced Security 一起使用,以便對磁盤上的數據庫備份進行加密。
--------------------------------------------------------------------------------
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 步操作來降低數據庫文件出現虛副本的概率,不論這些副本是由操作系統生成還是由存儲固件生成。
--------------------------------------------------------------------------------
?
來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/26736162/viewspace-1274191/,如需轉載,請注明出處,否則將追究法律責任。
總結
以上是生活随笔為你收集整理的Oracle中对列加密的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty5中的4种解码器
- 下一篇: 不要再把 pp 写成 % 了。