2014-06-19 88 views
0

我有Oracle 10g數據庫。我想掩蓋我的表格記錄。它並不需要有意義,它不需要可讀。只需要被掩蓋。例如:Oracle 10g數據屏蔽

select * 
from customer; 

LAST_NAME  FIRST_NAME  ADDRESS 
-------------- -------------- -------------------- 
Doe   John   10 someroad st 

我轉換成這樣:

LAST_NAME  FIRST_NAME  ADDRESS 
-------------- -------------- -------------------- 
Ahd   Uiea   55 xxxx ue 

我需要開源軟件,可以做這項工作。我應該使用什麼?

+0

您是否需要此屏蔽只針對某些Oracle帳戶? DBA賬戶是否應該能夠看到原始數據?如果沒有,如果有必要,你打算如何恢復原始數據? –

+0

我需要從生產數據庫中取數據來測試數據庫。但我不採取原始數據。爲此,我必須掩蓋表格的記錄。我不需要恢復到原始數據。 @FrankSchmitt – renis

回答

0

您可以使用ORA_HASH或DBMS_CRYPTO包完全滿足您的要求。給予解決方案使用DBMS_CRYPTO:

--source數據:

create table customer(last_name varchar2(50),first_name varchar2(50), address varchar2(200)); 

--encrypt功能(腳本Source):

CREATE OR REPLACE FUNCTION encrypt_value (p_in IN varchar2, p_key IN raw) RETURN raw IS l_enc_val raw (2000); 

l_mod number := dbms_crypto.ENCRYPT_AES128 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5; 

BEGIN l_enc_val := dbms_crypto.encrypt (UTL_I18N.STRING_TO_RAW (p_in, 'AL32UTF8'), l_mod, p_key); 

RETURN l_enc_val; 

END; 

--Function實現:

select encrypt_value(last_name,'AABBCC'),encrypt_value(first_name,'AABBCC'), encrypt_value(address,'AABBCC') from customer; 
0

如果您正在使用Oracle的企業版,您可以使用Virtual Private Database (VPD)爲此。

VPD允許您進行細粒度的訪問控制(基於用於連接到數據庫的帳戶)。它可以:

  • 只返回行的子集
  • 使用列屏蔽顯示敏感列作爲NULL值

它通過添加自定義達到這個WHERE子句查詢在桌子上跑。有沒有辦法來規避它,沒必要以適應現有的應用程序(使用定製視圖等)

要爲您customer表創建一個VPD,您需要:

  • 創建功能產生WHERE子句
  • 創建一個策略,爲您的數據庫表
  • 啓用該策略

功能

CREATE OR REPLACE FUNCTION hide_address (
v_schema IN VARCHAR2, 
v_objname IN VARCHAR2) 

RETURN VARCHAR2 AS 
result VARCHAR2 (200); 

BEGIN 
result := '1=0'; -- evaluates to FALSE for every account 
RETURN (result); 
END hide_address; 

創建策略

BEGIN 
DBMS_RLS.ADD_POLICY(
    object_schema   => 'scott', 
    object_name   => 'customer', 
    policy_name   => 'hide_address_policy', 
    policy_function  => 'hide_address', 
    sec_relevant_cols  =>' address', 
    sec_relevant_cols_opt => dbms_rls.ALL_ROWS); 
END; 

啓用策略後,查詢試圖訪問CUSTOMER.ADDRESS將返回NULL 。根據您的要求,您可能要添加視圖訪問返回一個隨機地址,而不是NULL表:

select name, 
    (case when address is NULL 
    then dbms_random.string('', 15) 
    else address end) as address 
from 
    customer