oracle中的加密包

sunwgneuqsoft發表於2007-09-29

Oracle中的加密演算法

加密演算法概述

在介紹oracle中的加密演算法之前,大家首先要對加密演算法有一個大致的瞭解,懂得為什麼加密,如何加密,加密演算法的分類。

一, 為什麼加密

我們的系統中會存在一些極其敏感的資料,這些資料涉及到公司的機密。自然這些是不想讓其他公司或競爭對手看到的,所以就需要一種方法來對資料進行“包裝”。包裝後的資料就象是增加了一層堅固的外殼,其他人很難看到殼內的敏感資料。這種“包裝”就是加密。可見加密對於敏感資料的重要意義。

二, 如何加密

所謂加密,就是對原內容為明文的檔案或資料按某種演算法進行處理,使其成為不可讀的程式碼,經過這樣處理的資料通常稱為密文,密文只能在經過相對應的反向演算法處理後才能恢復原來的內容,透過這樣的途徑來達到保護資料不被非法人竊取、閱讀的目的,而將該編碼資訊轉化為其原來資料的過程,就是解密

[@more@]

Oracle中的加密演算法

加密演算法概述

在介紹oracle中的加密演算法之前,大家首先要對加密演算法有一個大致的瞭解,懂得為什麼加密,如何加密,加密演算法的分類。

一, 為什麼加密

我們的系統中會存在一些極其敏感的資料,這些資料涉及到公司的機密。自然這些是不想讓其他公司或競爭對手看到的,所以就需要一種方法來對資料進行“包裝”。包裝後的資料就象是增加了一層堅固的外殼,其他人很難看到殼內的敏感資料。這種“包裝”就是加密。可見加密對於敏感資料的重要意義。

二, 如何加密

所謂加密,就是對原內容為明文的檔案或資料按某種演算法進行處理,使其成為不可讀的程式碼,經過這樣處理的資料通常稱為密文,密文只能在經過相對應的反向演算法處理後才能恢復原來的內容,透過這樣的途徑來達到保護資料不被非法人竊取、閱讀的目的,而將該編碼資訊轉化為其原來資料的過程,就是解密

最簡單的加密就是透過改變明文中的字元位置來實現。舉個簡單的例子,比如說welcome這個字串,我透過交換相鄰位置的字元位置來實現最簡單的加密。加密後的字串變成ewclmoe。這是簡單的加密方式,可以說沒有任何的安全性,但是可以說明加密的原理,就是透過一定的處理讓明文轉變成很難讀懂的密文。

現在流行的加密演算法是利用一複雜的金鑰透過某種加密的演算法將明文轉化為密文。既然是進行加密,那麼和加密相關的金鑰和加密演算法自然也是需要保護的。演算法的保密性可以分為基於保持演算法的秘密和基於保持金鑰的秘密。

如果演算法的保密性是基於保持演算法的秘密,這種演算法稱為受限制的演算法。受限制的演算法具有歷史意義,但按現在的標準,它們的保密性已遠遠不夠。大的或經常變換的使用者組織不能使用它們,因為每有一個使用者離開這個組織,其它的使用者就必須改換另外不同的演算法。如果有人無意暴露了這個秘密,所有人都必須改變他們的演算法。

  更糟的是,受限制的密碼演算法不可能進行質量控制或標準化。每個使用者組織必須有他們自己的唯一演算法。這樣的組織不可能採用流行的硬體或軟體產品。但竊聽者卻可以買到這些流行產品並學習演算法,於是使用者不得不自己編寫演算法並予以實現,如果這個組織中沒有好的密碼學家,那麼他們就無法知道他們是否擁有安全的演算法。

而基於保持金鑰的演算法則具有更大的靈活性和實用習性。這些演算法的安全性都基於金鑰的安全性;而不是基於演算法的細節的安全性。這就意味著演算法可以公開,也可以被分析,可以大量生產使用演算法的產品,即使偷聽者知道你的演算法也沒有關係;如果他不知道你使用的具體金鑰,他就不可能閱讀你的訊息

  演示如下,金鑰用K表示。K可以是很多數值裡的任意值。金鑰K的可能值的範圍叫做金鑰空間。加密和解密運算都使用這個金鑰(即運算都依賴於金鑰,並用K作為下標表示),這樣,加/解密函式現在變成:

  EK(M)=C

  DK(C)=M.

  這些函式具有下面的特性:

  DKEKM))=M.

  有些演算法使用不同的加密金鑰和解密金鑰,也就是說加密金鑰K1與相應的解密金鑰K2不同,在這種情況下:

  EK1(M)=C

  DK2(C)=M

  DK2 (EK1(M))=M

三, 加密演算法的分類

1, 基於“訊息摘要”演算法

訊息摘要Message Digest)是一種能產生特殊輸出格式的演算法,這種加密演算法的特點是無論使用者輸入什麼長度的原始資料,經過計算後輸出的密文都是固定長度的,這種演算法的原理是根據一定的運算規則對原資料進行某種形式的提取,這種提取就是摘要,被摘要的資料內容與原資料有密切聯絡,只要原資料稍有改變,輸出的摘要便完全不同,因此基於這種原理的演算法便能對資料完整性提供較為健全的保障。但是,由於輸出的密文是提取原資料經過處理的定長值,所以它已經不能還原為原資料,即訊息摘要演算法是不可逆的,理論上無法透過反向運算取得原資料內容,因此它通常只能被用來做資料完整性驗證,而不能作為原資料內容的加密方案使用,否則誰也無法還原。儘管如此,訊息摘要演算法還是為密碼學提供了健全的防禦體系,因為連專家也無法根據攔截到的密文還原出原來的密碼內容。因為這個特性,訊息摘要演算法產生的密文被稱為摘要

如今常用的訊息摘要演算法經歷了多年驗證發展而保留下來的強者,分別是MD2MD4MD5SHASHA-1/256/383/512等,其中最廣泛應用的是基於MD4發展而來的MD5演算法。

注:在oracle的加密包dbms_obfuscation_toolkit提供了MD5演算法的呼叫過程。就象上面說明的那樣,MD5這種基於訊息摘要的加密演算法只是單向的,是不可逆的,只能作為一種資料完整性的嚴整方法。另外一點,一般來說這類演算法都是不需要金鑰的。

2,“對稱/非對稱金鑰”加密演算法

由於“訊息摘要”演算法產生的資料只能作為一種身份驗證的憑證來使用,如果我們要對整個文件資料進行加密,就不能採用這種不可逆的演算法了,因此金鑰演算法(Key Encoding)的概念被提出,與開頭提到的智力題類似,此類演算法透過一個被稱為金鑰的憑據進行資料加密處理,接收方透過加密時使用的金鑰字串進行解密,即雙方持有的密碼相同(對稱)。如果接收方不能提供正確的金鑰,解密出來的就不是原來的資料了。

以上是對稱金鑰的概念,那麼非對稱金鑰又該怎麼理解呢?有人用郵箱作為比喻,任何人都可以從郵箱的信封人口塞進信件,但是取信的權力卻僅僅在於持有郵箱鑰匙的人的手上。這個眾人皆知的信封入口就是公鑰Public Key),而你持有的郵箱鑰匙就是私鑰Private Key),這種演算法規定,對方給你傳送資料前,可以用公鑰加密後再發給你,但是這個公鑰也無法解開它自己加密的資料,即加密過程是單向的,這樣即使資料被途中攔截,入侵者也無法對其進行破解,能還原資料內容的只有私鑰的持有者,這就是非對稱金鑰加密演算法,也稱為公共金鑰演算法,這兩者均建立在PKI驗證體系結構上。

基於對稱金鑰的加密演算法有DESTripleDESRC2RC4RC5Blowfish等;基於非對稱金鑰的加密演算法有RSADiffie-Hellman等。

注:在oracle的加密包dbms_obfuscation_toolkit提供了DESTripleDES3-DES)的演算法。

Oracle中的加密演算法

Oracle的加密包dbms_obfuscation_toolkit提供三種加密的演算法,其中包括基於“訊息摘要”的演算法MD5,還有對稱的加密演算法DESDES3

1MD5

前面已經介紹過了MD5不能作為常規的加密使用,他只能作為一種校驗資料完整性的方法。

加密包dbms_obfuscation_toolkit中提供了四個關於MD5演算法的過程或者函式,兩個是操作RAW型資料的,另外兩個是操作VARCHAR2。下面主要介紹下對VARCHAR2進行加密的MD5過程PROCEDURE MD5

PROCEDURE MD5

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

INPUT_STRING VARCHAR2 IN

CHECKSUM_STRING VARCHAR2(16) OUT

其中引數INPUT_STRING為預加密的輸入字串,CHECKSUM_STRING為加密後的輸出字串。

參考程式碼如下:

例子1

SQL> variable n_in varchar2(100)

SQL> variable n_out varchar2(100)

SQL> exec :n_in := 'this is a jok!'

SQL> exec dbms_obfuscation_toolkit.MD5(INPUT_STRING => :n_in,CHECKSUM_STRING => :n_out);

PL/SQL procedure successfully completed.

SQL> print n_out

N_OUT

----------------

šžå,(3ÐÜY

SQL> select length(:n_out) from dual;

LENGTH(:N_OUT)

--------------

16

例子2

SQL> exec :n_in := 'a';

SQL> exec dbms_obfuscation_toolkit.MD5(INPUT_STRING => :n_in,CHECKSUM_STRING => :n_out);

PL/SQL procedure successfully completed.

SQL> print n_out

N_OUT

-------------------------------------------------

Áu¹Àñ¶¨1Ùâiw&a

SQL> select length(:n_out) from dual;

LENGTH(:N_OUT)

--------------

16

例子3

SQL> exec :n_in := 'a';

SQL> exec dbms_obfuscation_toolkit.MD5(INPUT_STRING => :n_in,CHECKSUM_STRING => :n_out);

PL/SQL procedure successfully completed.

SQL> print n_out

N_OUT

-------------------------------------------------

Áu¹Àñ¶¨1Ùâiw&a

SQL> select length(:n_out) from dual;

LENGTH(:N_OUT)

--------------

16

說明:

(1) 對於例子1我加密的字串長度大概是15,而例子2中我加密的字串長度為1,可見MD5對加密字串的長度是沒有限制,當然了VARCHAR2自身會有4000的限制。

(2) 3個例子的結果可以看出來,無論加密前的字串長度為多少,加密後的字串長度均為16。這個是由MD5的演算法決定的,這也是為什麼MD5僅僅是“摘要”的體現,他是不可逆的。

(3) 例子2和例子3看起來完全一樣,這個是很好理解的,同樣的輸入當然得到同樣的結果了。這也是MD5可以作為一種資料檢驗方法的基礎,同樣的輸入同樣的輸出。反過來呢,同樣的輸出是否代表同樣的輸入呢?總有一些例外的,不過機率是極小的,比連續3期都中雙色球頭獎還要難。

(4) MD5可以作為一種資料校驗的方法,如果資料量比較大的話,那麼執行的效率就是個需要考慮的問題了。

2DES

DES是一種較為強壯的資料加密演算法,他的演算法是公開的,全部的保密性都在於金鑰的保密性上。所以對於DES(包括DES)來說一個複雜的金鑰是必須的,簡單的金鑰對於那些駭客來說形同虛設。現在的機器效能相比原來有了極大的提高,這也給暴力破解提供的物質上的準備。只要有足夠的時間,一切密文都會被破解的。我們能做得就是採用極其複雜的金鑰,將這個破解的時間往後推100年,推1000年,甚至10000年,讓破解密文後得到的回報遠遠小於破解所需的花費。想一想,如果破解一個軟體的註冊碼需要花費100萬元,而購買註冊證書的花費只有100元,大部分人都不會舍易取難了吧。當然了,也不排除那些極其執著的技術狂人,但畢竟是極小數。對於DES現在唯一的破解辦法就是窮舉法,如果一臺計算機的速度是每一秒種檢測一百萬個金鑰,那麼它搜尋完全部金鑰就需要將近2285年的時間。那麼那些技術狂人可以活這麼久麼?

Oracle的加密包dbms_obfuscation_toolkit中提供了實用與RAW型別的DES加密,也提供了VARCHAR2型別的DES加密。下面只介紹VARCHAR2型別的加密,RAW的與此類似。

PROCEDURE DESGETKEY

Argument Name Type In/Out Default?

------------------------------ ----------------------- ------ --------

SEED_STRING VARCHAR2 IN

KEY VARCHAR2 OUT

透過呼叫過程DESGETKEY可以產生一個相對複雜的金鑰。其中引數SEED_STRING是產生金鑰需要的種子,KEY為系統產生的金鑰字串。

例子1

SQL> variable n_seed varchar2(100)

SQL> variable n_key varchar2(100)

SQL> exec :n_seed := 'sun'

SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);

BEGIN dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key); END;

*

ERROR at line 1:

ORA-28237: seed length too short

ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 3

ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 25

ORA-06512: at line 1

例子2

SQL> exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'

SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);

BEGIN dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key); END;

*

ERROR at line 1:

ORA-28237: seed length too short

ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", line 3

ORA-06512: at "SYS.DBMS_OBFUSCATION_TOOLKIT", line 25

ORA-06512: at line 1

例子3

SQL> exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'

SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);

PL/SQL procedure successfully completed.

SQL> print n_key

N_KEY

-------------------------------------------------

Æs˜[È*n

SQL> select length(:n_key) from dual;

LENGTH(:N_KEY)

--------------

8

例子4

SQL> exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'

SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);

PL/SQL procedure successfully completed.

SQL> print n_key

N_KEY

-------------------------------------------------

©ÿëíŒJw

例子5

SQL> exec :n_seed := 'sunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwgsunwg'

SQL> exec dbms_obfuscation_toolkit.DESGETKEY(SEED_STRING => :n_seed,key => :n_key);

PL/SQL procedure successfully completed.

SQL> print n_key

N_KEY

-------------------------------------------------

XEÉš©”

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-973768/,如需轉載,請註明出處,否則將追究法律責任。

相關文章