Oracle 數據庫加密


 數據加密

 動態數據(data in motion)和靜態數據(data at rest),除了手動加密,其他的加密都需要oracle企業版的高級加密(額外收費——)

 1 靜態數據加密

   Example:

1 創建一個新的表空間

 create tablespace in_the_clear

    datafile 'f:\mydb\in_the_clear.dbf' size 1m

  創建一個表

  create table t_clear 
    ( id           varchar2(30) primary key, 
      ssn          varchar2(11), 
      address      varchar2(80), 
      credit_card  varchar2(30) 
    ) 
    tablespace in_the_clear;
  insert into t_clear (id, ssn, address, credit_card ) 
    values ( 'Look for me', '123-45-6789', 
            '123 Main Street', '1234-5678-9876-5432' );

 然后commit;

 Alter system checkpoint;--觸發檢查點事件。

  • !strings -a /tmp/in_the_clear.dbf | egrep '(Look for me|123)'
  • Linux下查看該數據文件的內容

 Oracle把數據類型為number和date的值按原樣存儲,

 如果delete刪除了數據,數據仍留在原處,它會保留在數據文件中,除非被其他數據覆蓋或者直到有其他數據覆蓋,

 還可以根據redo文件跟一些歸檔文件來查出大量信息,還可以根據undo表空間找出一些數據,對於redo文件,oracle提供了log miner工具,可以來檢查數據文件的內容

  select a.member 
      from v$logfile a, v$log b
     where a.group# = b.group#
      and b.status = 'CURRENT' 
       and rownum = 1;

F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO04.LOG

  獲取當前的在線重做日志文件。

!strings -a &REDO | egrep '(Look for me|123)'

2 oracle錢夾

   Oracle建議使用多個錢夾,錢夾存儲在數據庫之外,

 2.1 建立錢夾

在數據庫服務器的sqlnet.ora配置文件中作一個修改,

F:\oracle\product\10.2.0\db_1\NETWORK\ADMIN

SQLNET.AUTHENTICATION_SERVICES= (NTS)

# NAMES.DIRECTORY_PATH= (TNSNAMES)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ENCRYPTION_WALLET_LOCATION=

   (SOURCE=(METHOD=FILE)

           (METHOD_DATA=

              (DIRECTORY=f:\mydb\) ---指定存放錢夾的目錄

           )

   )

然后

 shutdown immediate

 startup

ALTER SYSTEM SET ENCRYPTION KEY identified by yhq1314;

ALTER SYSTEM SET ENCRYPTION KEY identified by foobar;

需要打開或者關閉,在數據打開的時候

idle> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY foobar;

idle> ALTER SYSTEM SET ENCRYPTION WALLET close IDENTIFIED BY foobar;

在以后重啟實例后或者關閉了錢夾后,想要查詢經過加密的數據,必須打開錢夾

 2.2 透明列級加密(10g

  create table t_clear 
    ( id           varchar2(30) primary key, 
      ssn          varchar2(11), 
      address      varchar2(80), 
      credit_card  varchar2(30)  encrypt
    ) 
tablespace in_the_clear;
credit_card  varchar2(30)  encrypt ----缺省情況下采用192位密鑰長度的AES算法。

Encrypt后面 可以加

   Using ‘xx’選擇對這列使用什么算法aes還是des等

   Identified by 密碼,指定加密數據使用特定的密碼

   Salt或no salt

可以手動取消該列的加密

alter table t_clear modify(credit_card decrypt)

同樣可以在加密

alter table t_clear modify(credit_card encrypt )

create index idx_credit_card on t_clear(credit_card)—無法對該列創建索引

這樣必須在打開錢夾后才能對t_clear表的credit_card列進行操作(dml,select等)

1 加密列的統計信息

   對列加密會帶來副作用,改變查詢計划,

2 列加密的限制

  使用索引的能力降低

  使用索引時的保護減弱,

  無法使用基於函數的索引

  無法使用外接約束

 2.3 透明表空間加密(11g

  create tablespace encrypted

  datafile '/tmp/encrypted.dbf' size 1m

    ENCRYPTION default storage ( ENCRYPT );

 表空間的加密的存儲沒有開銷,

3 手動加密實現

  手動加密需要使用oracle的2個內置包來實現

Dbms_crypto:更容易鍵入和讀出,支持DES,3DES,RC4,AES還能生成多種散列和消息驗證碼,如MD5,MD4,SHA-1,能處理RAW,CLOB,BLOB數據類型

手動加密的列必須是raw列類型,必須是16的整數倍,

CREATE OR REPLACE FUNCTION md5_digest(input_string IN VARCHAR2) RETURN VARCHAR2

IS

        hex_digest varchar2(32);

        digest varchar2(32);

BEGIN

        digest := DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => input_string);

SELECT Lower(RAWTOHEX(digest)) INTO hex_digest FROM dual;

        RETURN hex_digest;

END;

 

利用 Dbms_crypto 

 Desc  Dbms_crypto

 Grant execute on Dbms_crypto to scott

 Grant execute on dbms_lock to scott

  Md5

 CREATE OR REPLACE FUNCTION md5_digest1(input_string IN VARCHAR2) RETURN VARCHAR2
IS
        l_hash raw(32);
BEGIN
         l_hash := dbms_crypto.hash(
                    src=>input_string,
                    typ=>dbms_crypto.hash_md5);
        dbms_output.put_line('digest2=='||l_hash);
        RETURN l_hash;
END;
/

 

select md5_digest1('123456') from dual

declare
      l_src_date clob := '123456';
       l_hash raw(200);
    begin
       l_hash := dbms_crypto.hash(
                    src=>l_src_date,
                    typ=>dbms_crypto.hash_md5);
       dbms_output.put_line(l_hash);
  end;

 

des

 

DECLARE
 l_credit_card_no VARCHAR2(19) := '1234-5678-9012-3456';
 l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_credit_card_no);
 l_key     RAW(128) := utl_raw.cast_to_raw('abcdefgh');
 l_encrypted_raw RAW(2048);
 l_decrypted_raw RAW(2048);
BEGIN
  dbms_output.put_line('Original : ' || l_credit_card_no);
  l_encrypted_raw := dbms_crypto.encrypt(l_ccn_raw,
  dbms_crypto.des_cbc_pkcs5, l_key);
dbms_output.put_line(
'Encrypted : ' || RAWTOHEX(utl_raw.cast_to_raw(l_encrypted_raw)));
l_decrypted_raw :
= dbms_crypto.decrypt(src => l_encrypted_raw, typ => dbms_crypto.des_cbc_pkcs5, key => l_key);
dbms_output.put_line(
'Decrypted : ' || utl_raw.cast_to_varchar2(l_decrypted_raw));
END;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM