oracle資料庫加密學習總結
安全就好比在寒冷的冬天裡,您穿上好幾件衣服或穿最龐大的冬天使用的夾克禦寒。 但是,構建各防禦層可能阻止不了最堅決的惡意入侵者,當然這也不會總能夠防禦合法使用者盜竊公司財產。 這裡的組最後一道防線是加密,通過加密,使用者(或者惡意入侵者)只有使用密碼才可以訪問到資料。 沒有密碼的資料是無效的。 如果您保護了密碼,您就保護了資料。請記住,加密不能替代其它層次的安全性。
對於網路,加密是確保全域性安全地主要因素:而對於資料庫,加密則是安全防禦中地某一層,應該理智地對資料庫進行加密,否則,在總體安全得不到任何加強的同時,有可能會降低系統的效能、可用性以及可訪問性。加密和解密需要計算資源,因此,有可能會給資料庫
到目前為止,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.資料檔案包括了全部資料庫資料·一個數據庫可以有多個數據