1. 程式人生 > >oracle資料庫加密學習總結

oracle資料庫加密學習總結

作者: ldd600

安全就好比在寒冷的冬天裡,您穿上好幾件衣服或穿最龐大的冬天使用的夾克禦寒。 但是,構建各防禦層可能阻止不了最堅決的惡意入侵者,當然這也不會總能夠防禦合法使用者盜竊公司財產。 這裡的組最後一道防線是加密,通過加密,使用者(或者惡意入侵者)只有使用密碼才可以訪問到資料。 沒有密碼的資料是無效的。 如果您保護了密碼,您就保護了資料。請記住,加密不能替代其它層次的安全性。

對於網路,加密是確保全域性安全地主要因素:而對於資料庫,加密則是安全防禦中地某一層,應該理智地對資料庫進行加密,否則,在總體安全得不到任何加強的同時,有可能會降低系統的效能、可用性以及可訪問性。加密和解密需要計算資源,因此,有可能會給資料庫

伺服器增加額外的負載,或者伺服器在大量的計算壓力下的響應事件無法令人滿意。同時,由於無法使用加密狀態下的資料這一事實,使得資料庫無法對資料進行有效地比較,也不能進行計算,而基本的資料操作也是無效的。加密不但向用戶,而且資料庫隱藏了資料。利用加密,還帶來金鑰管理的任務。如果不能妥善地管理金鑰,則會在兩方面遭遇災難:第一,如果金鑰洩漏,則會導致資料洩漏;第二:金鑰丟失,則會導致資料永遠不會再被解密。

到目前為止,Oracle 提供兩種加密方式:

a)         加密 API 例如包 和 dbms_crypto (在 Oracle 資料庫 10g 第 1 版和更高版本中)。 使用這些包,我們可以構建我們自己的基礎架構,對資料進行加密。 這種方法的靈活性最強,但是構建和管理卻相當複雜。

b)        透明的資料加密是 Oracle 資料庫 10g 第 2 版和更高版本的一個特性;使用該特性後,我們就不必手動進行密碼管理了。 資料庫管理密碼,但是正如名稱所指,加密是透明的——資料僅僅以加密的方式儲存而已。 當我們選擇了這種方式,擴充套件性比較差。

在本次實驗中,為了更好地理解資料庫的加密機制,我們將採用第一種方法。在Oracle10g中出現了dbms_crypto替代了之前的dbms_obfuscation_toolkit,DBMS_CRYPTO增加了若干新的加密演算法、雜湊演算法。DBMS_CRYPTO還撤銷了對於public組的執行許可權。對於DBMS_CRYPTO中的詳細解釋將在實驗中分步介紹。在本次實驗中我們將採用David knox提供的Data_Crypto軟體包來對資料庫進行加密、解密,完成本次實驗。包中已經對金鑰還有資料轉換進行了處理,已經對DBMS_CRYPTO包做了封裝。當然學生也可以直接用DBMS_CRYPTO來完成上述功能。

加密資料

      DBMS_CRYPTO支援DES加密、雙金鑰的3DES以及三金鑰的3DES加密,採用三個不同大小的AES和RC4加密演算法。DBMS_CRYPTO通過數字值如DBMS_CRYPTO.encrypt_aes,這些引數是包的全域性變數,可通過包名.變數,看起來有點像java中static final類變數,c++中的static constant,還有用數字表示的分組加密模式,如CBC,CFB,ECB和OFB,以及填充模式PKCS5,、Zeros、ORCL或NONE。這些都作為常數變數,傳遞給加密函式,Oracle預設推薦CBC模式和PKCS5。

DBMS_CRYPTO包提供了一個加密函式和兩個儲存過程都取名為encypt,但引數不同,這就是PL/SQL的函式和過程過載,需要引數型別、引數數量和引數次序不同。函式基於RAW的資料型別,接受RAW資料型別的金鑰、資料以及可選的初始向量(IV initialization vector)作為輸入,並返回RAW資料型別。兩道加密儲存過程則始給予LOB資料型別,其中之一接收BLOB型別引數,而另外一道過程則接受CLOB型別引數,這兩個儲存過程都利用RAW資料型別的金鑰和IV,而且它們都是利用BLOB資料型別的in out引數。

那我們怎麼對字元型資料進行加密呢,那又為什麼不採用字元型資料來存放密文呢?

對字元型和其他資料型別進行加密要用UTL_RAW..CAST_TO_RAW進行資料型別的轉換。實驗中採用的DATA_CRYPTO中提供的加密和解密函式已經完成了字元轉換,不需要再手動進行轉換了。為什麼不採用字元型別來存放密文,是因為不同語言版本的Oracle資料庫轉換後的字元型別不同,當一個數據庫中的密文移動到其他語言版本的資料庫中將不能解密。所以選擇了RAW和BLOB.

下面開始實驗:

1)        首先我們在ldd600模式下安裝DATA_CRYPTO包和建立一個員工表,它包括兩個欄位,ename,salary。

SQL> @cry_install.sql

2)        我們將對salary列進行加密,因為員工的工資也屬於隱私。

加密之前

進行加密:SQL> update people

2         set salary=data_crypto.encrypt(salary,'sal key');

加密之後,

請問who能看的懂?但是注意我們存放的還是字元型,data_crypto包中的encrypt_char用來把字元型加密為RAW型。但是建表的時要指定salary列的型別為raw。這裡就不試了。

我們看看這些資料如果為raw型是什麼樣子的

1)        查詢時我們要對其進行解密,才能解讀

SQL> select ename,data_crypto.decrypt(salary,'sal key') salary

  2     from people;

對照一下,和加密之前的資料完全相同。

雜湊

   雜湊就是通過雜湊函式的方法,使明文資料轉換成固定長度密文資料。雜湊到目前為止還是是計算上不可逆的過程。在Oracle中它的使用者的密碼,也是通過雜湊存放的。不過我們不能簡單的把資料庫使用者的使用者名稱雜湊後來和DBA_USERS表中PASSWORD例進行比較,因為Oracle採用的是HMAC。

   DBMS_CRYPTO包提供了MD4、MD5和SHA-1雜湊演算法,其中一個函式接受RAW型別的資料,另外一個函式接受CLOB型別的資料,還有一個函式接受BLOB型別的資料,所有上述三個函式返回的都是RAW型別的資料。之所以返回的是RAW型別的資料,有一個重要的原因是因為雜湊的輸出是固定大小的,雜湊演算法接受任何大小的輸入,並返回固定大小的輸出。MD4和MD5返回的輸出是128位,而SHA返回的輸出是160位。DATA_CRYPTO包也封裝了這些雜湊函式,預設的是SHA。

1)        建立一個表euser,包括兩列:ename和password,password是使用者名稱經initcap函式處理過後的結果,initcap是把字串的第一個字母改成大寫,而其他字元改成小寫。這個表的安裝也會在執行cry_install.sql時安裝

1)        更改paassword列為其雜湊值

    SQL> update euser

2                 set password = data_crypto.hash (password);

      看看雜湊後的euser表

      SQL> select ename , utl_raw.cast_to_raw (password) password

  2     from euser;

1)        這一步我們要編寫一個函式用來驗證密碼是否正確

        SQL> @user_auth.sql

2)        通過下面的匿名過程顯示如何進行密碼認證。

        SQL> BEGIN

  2    IF (is_user_auth ('scott', 'scott'))

  3    THEN

  4      DBMS_OUTPUT.put_line ('Scott authenticated with "scott"');

  5    ELSE

  6      DBMS_OUTPUT.put_line ('Scott could not authenticate with "scott"');

  7    END IF;

  8 

  9    IF (is_user_auth ('scott', 'Scott'))

 10    THEN

 11      DBMS_OUTPUT.put_line ('Scott authenticated with "Scott"');

 12    ELSE

 13      DBMS_OUTPUT.put_line ('Scott could not authenticate with "Scott"');

 14    END IF;

 15  END;

 16  /

金鑰管理

   在這個例子中,我們將通過資料庫來進行金鑰管理,也就是通過資料庫中的表來管理使用者的金鑰。

1)        在資料庫中有金鑰管理員,他負責管理使用者的金鑰。首先要建立金鑰中心表KM,用來存放使用者名稱和金鑰對,金鑰是以密文的形式存放於密鑰中心中。金鑰管理員擁有一個主金鑰用來對金鑰中心中的金鑰加密儲存。

KM也是在cry_install.sql執行建立的

2)        為了建立金鑰要編寫能產生偽隨機字串的函式,隨機金鑰的產生我們需要利用DBMS_OBFUCATION_TOOLKIT包。執行 指令碼建立產生一個隨機字串函式create_key,隨機字串是由一個引數作為種子產生的,函式返回產生的隨機字串。

SQL> @get_random.sql;

3)        建立一個函式由2步中的隨機數產生使用者名稱和隨機金鑰對,並存儲在km中

      SQL>@create_key.sql;

   為使用者ldd600產生一個32位的金鑰並加密後儲存在km中密文是48位

      SQL>exec create_key('ldd600');

4)現在要做的是金鑰管理員把密文金鑰取出,並把它解密。建立一個解密並讀取金鑰的儲存過程。該儲存過程輸入引數位使用者名稱,輸出位該使用者對應的所有金鑰。

   SQL>@de_key.sql

 解密並讀取32位金鑰的明文

  SQL>exec de_key(‘ldd600’);

3)        接下來所要做的是將這個金鑰明文發給使用者ldd600,通知他該金鑰。

包裝機密程式碼

在前面一個例子5.5中我們金鑰管理員的主金鑰是儲存在儲存過程create_key和de_key中。攻擊者只要按如下方式就可以看到該密碼:

SQL> COL TEXT FORMAT A80

SQL> select text from dba_source where name='CREATE_KEY';

注意這裡的CREATE_KEY一定要大寫。查詢結果如圖5.1所示

將上面方法和windows的find,unix的grep命令結合起來使用,就很容易搜尋的密碼了,開啟cmd。

C:\Documents and Settings\ldd600>sqlplus ldd600/[email protected] @pass.sql

C:\Documents and Settings\ldd600>find /i "password" c:\find.txt

如上圖容易就找到了密碼的資訊

消除此風險的最佳方法是使用 wrap 實用程式。 建立指令碼檔案以建立過程或函式後,請使用以下程式碼包裝它:

  C:\Documents and Settings\ldd600>wrap  iname=d:\sql\create_key_01.sql  oname=d:\

sql\create_key_01.plb

  C:\Documents and Settings\ldd600>sqlplus ldd600/[email protected] @create_key_01.plb

  SQL> col text format a80

SQL> select text

  2  from dba_source

  3   where name='CREATE_KEY'

  4  /

看看我們現在看到了什麼

我們仍然可以使用exec create_key(‘使用者名稱’);來呼叫儲存過程:

SQL> exec create_key('scott');

PL/SQL procedure successfully completed

相關推薦

oracle資料庫加密學習總結

作者: ldd600 安全就好比在寒冷的冬天裡,您穿上好幾件衣服或穿最龐大的冬天使用的夾克禦寒。 但是,構建各防禦層可能阻止不了最堅決的惡意入侵者,當然這也不會總能夠防禦合法使用者盜竊公司財產。 這裡的組最後一道防線是加密,通過加密,使用者(或者惡意入侵者)只有使用密碼才

oracle資料庫逐步學習總結【基礎二】

  原創作品,轉載請在文字開頭明顯位置註明出處:https://www.cnblogs.com/sunshine5683/p/10067872.html 接著上一篇,繼續總結!   五、oracle表管理 首先,在開頭說一下sys使用者和system使用者的區別:sys使用者是超

Java嵌入式資料庫H2學習總結(二)——在Web應用程式中使用H2資料庫

一、搭建測試環境和專案 1.1、搭建JavaWeb測試專案   建立一個【H2DBTest】JavaWeb專案,找到H2資料庫的jar檔案,如下圖所示:      H2資料庫就一個jar檔案,這個Jar檔案裡面包含了使用JDBC方式連線H2資料庫時使用的驅動類,將"h2-1.4.183.jar"加入到

ORACLE資料庫基礎知識總結

1、RMAN全備備份檔案的順序 備份歸檔日誌、所有的資料檔案、控制檔案、spfile、再次備份歸檔日誌 2、redo日誌丟失恢復 redo日誌的三種狀態是current、active、inactive inactive,可以重建 clear log active、current不能變成inactive,只能通

Oracle 資料庫加密

 資料加密  動態資料(data in motion)和靜態資料(data at rest),除了手動加密,其他的加密都需要oracle企業版的高階加密(額外收費——)  1 靜態資料加密    Example: 1 建立一個新的表空間 &

Oracle資料庫常用操作總結(一)

--oracle cs架構軟體 --客戶端 --tns  --協議 --ip --埠 --資料庫名字 --監聽如果出了問題,先刪除所有監聽,再重建。netca。tns檔案中名字不能重複, --oracle預設自帶兩個管理員使用者 sys system 這兩個使用者在登入時

EasyDemo*oracle資料庫小知識點總結

1.新建表的兩種方式:   1.1sql語句建立(需重新整理)   1.2sqldeveloper-》選中資料庫->表->滑鼠右擊->新建表 2.對錶進行編輯:   選中要操作的表-&

Oracle資料庫基礎學習_01

–建立表空間 create tablespace itheima; DATAFILE ‘heima.dbf’ size 100m autoextend on next 10m; –刪除表空間 drop tablespace itheima; –建立使用者 cre

資料庫學習總結

    鎖的作用:資料庫是一個多使用者共享的資源,當出現併發的時候就會出現髒讀,資料丟失等問題。所以資料庫併發需要使用事務來控制,事務併發問題需要資料庫鎖來控制,所以資料庫鎖是跟併發控制和事務聯絡在一起的。 事務特性:ACID(原子性,一致性,隔離性,永續性)四特性,事務是恢復和併發

Oracle 資料庫基礎知識點總結(一)

 1.資料庫表的完整性  ①實體完整性:靠主鍵來維護,資料唯一且不能為空 ②參照完整性:靠外來鍵來維護,主鍵表無記錄外見表則無法操作資料 ③域完整性:check()約束 not null 約

mysql資料庫基礎學習總結3(查詢)

012.多表查詢      013.多表連線 1.多表查詢     語法:         select * from table1,table2;   

mysql資料庫基礎學習總結2(DML)

007.DML之insert 1.DML     資料操作語言;     DML操作的主體是表中的資料(記錄),操作分為四種(CURD) insert,update,delete,select;2.insert 語句  &

mysql資料庫基礎學習總結1(基礎)

001.資料庫基礎 1.什麼是資料     對客觀事物的符號表示,也是資訊的載體; 2.資料庫     用來管理資料的一個軟體;3.常見的關係型資料庫     oracle:oracle公司的資料庫;

Oracle資料庫深入學習

一、Oracle概念 oracle資料可系統是美國oracle(甲骨文)公司提供的以分散式資料庫為核心的一組軟體產品,是目前最流行的客戶/伺服器或B/S體系結構的資料庫之一,oracle資料庫時目前世界上使用最為廣泛的資料庫管理系統,作為一個通用的資料庫系統,它具有完善的資料庫管理功

oracle資料庫之操作總結

## 連線資料庫: sqlplus test/test#123#@localhost:1521/ORCL ## 查詢資料庫所有的表: select table_name from user_tables; ## 查詢資料庫表的欄位名: desc 表名;

Oracle資料庫優化的總結

分析和優化的基本步驟如下: 1、如果是SQL語句的寫法問題,我們可以通過在不更改業務邏輯的情況下改寫SQL來加以解決; 2、如果是不必要的全表掃描/排序而導致了目標SQL的效能問題,我們可以通過建立合適的索引(包括函式索引、點陣圖索引等)來加以解決; 3、如果是表或

Oracle資料庫 Null值 總結

有人總結了資料庫中Null值的概念,比較精煉,摘錄如下: Null是資料庫中特有的資料型別,當一條記錄的某個列為Null,則表示這個列的值是未知的、是不確定的。既然是未知的,就有無數種的可能性。因此,Null並不是一個確定的值。 這是Null的由來、也是Null的基礎,所有和Null相關的操作的結果都可以

Oracle資料庫基礎學習DAY3

1、連線用一個連線來從多個表中獲取資料。select table.column,table2.columnfrom table1,table2where table1.column1=table2.column2;在where子句中書寫連線的條件。如果某個列的名字在多個表中出

Oracle 資料庫安裝要點總結

1.建庫使用admin managed 使用policy managed 會在rac環境下出現節點1的例項名稱為 sid_2的情況2.有些小補丁如果不使用custom 建立資料庫,建立後需要手動的再次升

Oracle資料庫基礎學習DAY1

1.資料字典(data dictionary)是資料庫中所有物件及其關係的資訊集合。·系統空間資訊·資料庫中物件資訊·效能以及統計資訊·Oracle使用者資訊·使用者訪問、操作資訊·使用者角色等許可權資訊·列的相關資訊2.資料檔案包括了全部資料庫資料·一個數據庫可以有多個數據