Oracle中對列加密的方法

Appleses發表於2016-01-30

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 裝置內建立一個萬能金鑰。使用者 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 <wallet_location> -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/28628435/viewspace-1984506/,如需轉載,請註明出處,否則將追究法律責任。

相關文章