一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法
【專利摘要】本發(fā)明公開了一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法,包括以下步驟:(1)布魯姆濾波器的實現(xiàn);(2)為明文添加隨機字符串;(3)加密;(4)解密。通過上述方式,本發(fā)明基于數(shù)據(jù)庫的積木式動態(tài)加密方法具有能夠利用數(shù)據(jù)庫原本就有的查詢優(yōu)化技術(shù)進行密文的查找和計算,并且不需要過多的更改原有應(yīng)用程序連接數(shù)據(jù)庫部分的代碼,同時數(shù)據(jù)庫管理員無法獲得明文信息等優(yōu)點,在基于數(shù)據(jù)庫的積木式動態(tài)加密方法的普及上有著廣泛的市場前景。
【專利說明】 一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)庫加密領(lǐng)域,特別是涉及一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法。
【背景技術(shù)】
[0002]在當(dāng)下這個信息爆炸的時代,信息安全已經(jīng)成為非常熱門的話題。而現(xiàn)代信息安全技術(shù),在防范網(wǎng)絡(luò)攻擊方面,已經(jīng)做的相當(dāng)出色。身份認證技術(shù),防火墻,路由器技術(shù),安全監(jiān)測與審計技術(shù),最大限度的保證了信息在網(wǎng)絡(luò)中的安全。
[0003]然而,強大的網(wǎng)絡(luò)安全技術(shù)并不能阻止信息的泄露。2013年震驚世界的棱鏡事件發(fā)生。如此機密的文件信息為何斯諾登能夠獲取到呢?這必須和斯諾登此前系統(tǒng)管理員職務(wù)有所聯(lián)系。
[0004]即使是網(wǎng)絡(luò)防范幾乎沒有漏洞的美國政府,也不能阻止敏感信息從內(nèi)部流出,那么網(wǎng)絡(luò)防范沒有那么嚴(yán)格安全的企業(yè)信息又如何得到保障?棱鏡事件后,國內(nèi)也發(fā)生了多起信息外泄的安全時間,開房記錄曝光,用戶信息泄露等等。
[0005]當(dāng)網(wǎng)絡(luò)防御被攻破之后,如何繼續(xù)保障信息的安全?如何放心的把數(shù)據(jù)交給權(quán)限很大的系統(tǒng)管理員來進行管理?發(fā)生的各種事件,讓數(shù)據(jù)安全的重要性越來越高。
[0006]數(shù)據(jù)庫作為數(shù)據(jù)存儲的媒介,其安全問題值得重視。數(shù)據(jù)庫加密的難點和重點在于對于密文的檢索技術(shù),現(xiàn)今密文檢索技術(shù)主要有4種:在數(shù)據(jù)庫外部開發(fā)自建索引組件、使用同態(tài)加密算法對密文進行檢索、全文密文檢索和透明數(shù)據(jù)加密解密處理。然而,由于現(xiàn)有數(shù)據(jù)庫和加密后密文的特點,數(shù)據(jù)庫加密的實現(xiàn)有著不小的挑戰(zhàn)。主要存在以下問題:
(I)數(shù)據(jù)庫內(nèi)的操作符和函數(shù),不支持對密文的查詢和檢索。
[0007](2)查詢效率必須滿足日常使用要求。
[0008](3)使用新的加密數(shù)據(jù)庫,要使原有系統(tǒng)后臺連接數(shù)據(jù)庫的代碼盡可能少的改動。
[0009](4)合理使用密鑰,保證數(shù)據(jù)庫管理員無法知道敏感信息。
[0010]作為信息安全防護的最后一道屏障,數(shù)據(jù)庫加密已經(jīng)成為越來越熱門的研究課題。
【發(fā)明內(nèi)容】
[0011]本發(fā)明主要解決的技術(shù)問題是提供一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法,通過使用PostgreSQL提供的開發(fā)者接口,實現(xiàn)了類似于TDE透明數(shù)據(jù)操作的數(shù)據(jù)庫加密方案,在基于數(shù)據(jù)庫的積木式動態(tài)加密方法的普及上有著廣泛的市場前景。
[0012]為解決上述技術(shù)問題,本發(fā)明提供一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法,包括以下步驟:
(I)布魯姆濾波器的實現(xiàn):
Ca)自定義一個結(jié)構(gòu)體BL00M,結(jié)構(gòu)體內(nèi)聲明了位數(shù)組的大小asize、用于表示布魯姆濾波器的位數(shù)組a、所用的哈希函數(shù)個數(shù)nfuncs、以及指向所有用到的哈希函數(shù)的函數(shù)指針funcs,這些哈希函數(shù)傳入const char*類型的參數(shù)并輸出unsigned int類型的結(jié)果,這里用 typedef unsigned int (*hashfunc_t) (const char *)來聲明一個指向所需哈希函數(shù)的函數(shù)指針類型hashfunc_t ;
(b)編寫創(chuàng)建布魯姆濾波器的函數(shù)BLOOM *bloom_create (int size, int nfuncs,...),根據(jù)傳入的size來確定位數(shù)組大小、傳入的nfuncs來確定哈希函數(shù)的個數(shù),使用var_start和var_end來處理動態(tài)個數(shù)的參數(shù)列表,得到所有哈希函數(shù)指針;
(c)編寫銷毀布魯姆濾波器的函數(shù)intbloom_destroy (BLOOM *bloom),用于在完成布魯姆濾波器運算后,及時銷毀堆中的內(nèi)存,防止內(nèi)存泄露;
(d)編寫添加兀素的函數(shù)int bloom_add(BLOOM abloom, const char *s),用于向指定的bloom中添加字符串元素s ;
(e)編寫檢查元素是否屬于布魯姆濾波器的函數(shù)intbloom_check(BLOOM *bloom,const char *s),使用bloom中指向哈希函數(shù)的函數(shù)指針,依次計算s的哈希值并檢查位數(shù)組上相應(yīng)的數(shù)值,如果為0,返回false ;
(2)為明文添加隨機字符串:
(f)利用OpenSSL 提供的函數(shù) int RAND_bytes (unsigned char *buf, int num)來產(chǎn)生5個隨機數(shù);
(g)將產(chǎn)生的隨機數(shù)轉(zhuǎn)換成相應(yīng)的16進制字符串,生成I個長度為10的Hex字符串;
(3)加密:
(h)使用步驟(I)中實現(xiàn)的代碼生成布魯姆濾波器;
(i)計算明文長度,生成長度計數(shù)器;
(j)使用步驟(2)中實現(xiàn)的代碼生成隨機字符串,并接在明文后面生成最終帶加密字符串;
(k)利用OpenSSL提供的API,加密步驟(j)得到的字符串;
(I)將步驟(h)、(j)、(k)中得到的字符串組合在一起,形成最終密文;
(4)解密:
(m)忽略密文的布魯姆濾波器部分,按照步驟(3)加密時的組合順序提取出明文計數(shù)器和密文,解密密文后,截取明文計數(shù)器指示的明文長度,得到最終明文。
[0013]在本發(fā)明一個較佳實施例中,步驟(3)、(4)中設(shè)定了兩個密鑰:主密鑰MasterKey和工作密鑰Sess1nKey,其中主密鑰MasterKey,由開發(fā)人員和用戶#define在代碼中共同協(xié)定,用來加密工作密鑰,工作密鑰Sess1nKey,用于加密數(shù)據(jù),通過AES128算法,以密文的形式存儲在專門用來保管密鑰的數(shù)據(jù)庫中。
[0014]在本發(fā)明一個較佳實施例中,還植入新的數(shù)據(jù)類型encrypted_string,使得數(shù)據(jù)庫可以插入數(shù)據(jù),編寫應(yīng)用于encrypted_string的操作符函數(shù),使得可以對數(shù)據(jù)庫的數(shù)據(jù)進行查詢。
[0015]在本發(fā)明一個較佳實施例中,植入新的數(shù)據(jù)類型encrypted_string和編寫應(yīng)用于encrypted_string的操作符函數(shù)的步驟包括:
(η)創(chuàng)建 encrypted_string 類型;
(ο)添加encrypted_string類型比較函數(shù);
(P)添加為encrypted_string提供索引功能的函數(shù); (q)倉鍵encrypted_string運算操作符;
(r)創(chuàng)建encrypted_string索引必要的操作符列表。
[0016]本發(fā)明的有益效果是:本發(fā)明基于數(shù)據(jù)庫的積木式動態(tài)加密方法具有能夠利用數(shù)據(jù)庫原本就有的查詢優(yōu)化技術(shù)進行密文的查找和計算,并且不需要過多的更改原有應(yīng)用程序連接數(shù)據(jù)庫部分的代碼,同時數(shù)據(jù)庫管理員無法獲得明文信息等優(yōu)點,在基于數(shù)據(jù)庫的積木式動態(tài)加密方法的普及上有著廣泛的市場前景。
【具體實施方式】
[0017]下面將對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅是本發(fā)明的一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護的范圍。
[0018]一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法,包括以下步驟:
(1)布魯姆濾波器的實現(xiàn):
Ca)自定義一個結(jié)構(gòu)體BLOOM,結(jié)構(gòu)體內(nèi)聲明了位數(shù)組的大小asize、用于表示布魯姆濾波器的位數(shù)組a、所用的哈希函數(shù)個數(shù)nfuncs、以及指向所有用到的哈希函數(shù)的函數(shù)指針funcs,這些哈希函數(shù)傳入const char*類型的參數(shù)并輸出unsigned int類型的結(jié)果,這里用 typedef unsigned int (*hashfunc_t) (const char *)來聲明一個指向所需哈希函數(shù)的函數(shù)指針類型hashfunc_t ;
(b)編寫創(chuàng)建布魯姆濾波器的函數(shù)BLOOM *bloom_create (int size, int nfuncs,...),根據(jù)傳入的size來確定位數(shù)組大小、傳入的nfuncs來確定哈希函數(shù)的個數(shù),使用var_start和var_end來處理動態(tài)個數(shù)的參數(shù)列表,得到所有哈希函數(shù)指針;
(c)編寫銷毀布魯姆濾波器的函數(shù)intbloom_destroy (BLOOM *bloom),用于在完成布魯姆濾波器運算后,及時銷毀堆中的內(nèi)存,防止內(nèi)存泄露;
(d)編寫添加兀素的函數(shù)int bloom_add(BLOOM abloom, const char *s),用于向指定的bloom中添加字符串元素s ;
(e)編寫檢查元素是否屬于布魯姆濾波器的函數(shù)intbloom_check(BLOOM *bloom,const char *s),使用bloom中指向哈希函數(shù)的函數(shù)指針,依次計算s的哈希值并檢查位數(shù)組上相應(yīng)的數(shù)值,如果為0,返回false ;
(2)為明文添加隨機字符串:
因為加密要求相同明文每次加密密文不同,因此我們需要向明文添加隨機字符串,來達到此目的,
(f)利用OpenSSL 提供的函數(shù) int RAND_bytes (unsigned char *buf, int num)來產(chǎn)生5個隨機數(shù);
(g)將產(chǎn)生的隨機數(shù)轉(zhuǎn)換成相應(yīng)的16進制字符串,生成I個長度為10的Hex字符串;
(3)加密:
我們可以利用OpenSSL提供的加密算法API實現(xiàn)字符串的加密處理,將所需的其他密文信息,比如布魯姆濾波器和記錄明文長度的Hex格式的計數(shù)器組合在一起,形成最終插入數(shù)據(jù)庫的密文, (h)使用步驟(I)中實現(xiàn)的代碼生成布魯姆濾波器;
(i)計算明文長度,生成長度計數(shù)器;
(j)使用步驟(2)中實現(xiàn)的代碼生成隨機字符串,并接在明文后面生成最終帶加密字符串;
(k)利用OpenSSL提供的API,加密步驟(j)得到的字符串;
(I)將步驟(h)、(j)、(k)中得到的字符串組合在一起,形成最終密文;
(4)解密:
(m)忽略密文的布魯姆濾波器部分,按照步驟(3)加密時的組合順序提取出明文計數(shù)器和密文,解密密文后,截取明文計數(shù)器指示的明文長度,得到最終明文。
[0019]其中,OpenSSL是使用非常廣泛的SSL的開源實現(xiàn)。由于其中實現(xiàn)了為SSL所用的各種加密算法,因此OpenSSL也是被廣泛使用的加密函數(shù)庫。OpenSSL中支持眾多的密碼算法,并提供了很好的封裝和接口。密碼算法主要分為如下幾類:對稱算法、公鑰算法、散列算法、隨機數(shù)產(chǎn)生算法等。OpenSSL代碼全部用C編寫,因此采用OpenSSL來開發(fā)加密/解密模塊,不會受到應(yīng)用平臺的制約。
[0020]優(yōu)選地,步驟(3)、(4)中設(shè)定了兩個密鑰:主密鑰MasterKey和工作密鑰Sess1nKey,其中主密鑰MasterKey,由開發(fā)人員和用戶#define在代碼中共同協(xié)定,用來加密工作密鑰,工作密鑰Sess1nKey,用于加密數(shù)據(jù),通過AES128算法,以密文的形式存儲在專門用來保管密鑰的數(shù)據(jù)庫中。這樣,數(shù)據(jù)庫管理員并不知道MasterKey的值,沒有辦法解密Sess1nKey,也就沒有辦法解密數(shù)據(jù)庫內(nèi)的密文信息,而開發(fā)人員,雖然知道MasterKey,但是沒有連接數(shù)據(jù)庫的權(quán)限,獲取數(shù)據(jù)庫信息也無從談起。包括以下步驟:
(201)聲明Sess1nKey 的全局變量,char sess1nkey[21] = { O };
(202)編寫函數(shù)void getsess1nkey (char* sess1nkey),利用 PostgreSQL 提供的libpg API,連接數(shù)據(jù)庫并且得到密鑰密文,解密得到用于加密解密的密鑰。其中通過getenv (〃PG_C0NN_KEY_ST0RAGE〃)方法,得到配置在系統(tǒng)環(huán)境變量中的連接迷藥數(shù)據(jù)庫的urI,以達到客戶可以根據(jù)自身數(shù)據(jù)庫環(huán)境配置連接參數(shù)的目的;
(203)編寫函數(shù)char* encrypt (char* plain)和 char* decrypt (char* cipher),使用得到的Sess1nKey作為密鑰實現(xiàn)加密解密操作,作為最終被數(shù)據(jù)庫/應(yīng)用調(diào)用的加密/解密函數(shù)。
[0021]優(yōu)選地,還植入新的數(shù)據(jù)類型encrypted_string,使得數(shù)據(jù)庫可以插入數(shù)據(jù),編寫應(yīng)用于encrypted_string的操作符函數(shù),使得可以對數(shù)據(jù)庫的數(shù)據(jù)進行查詢。
[0022]優(yōu)選地,植入新的數(shù)據(jù)類型encrypted_string和編寫應(yīng)用于encrypted_string的操作符函數(shù)的步驟包括:
(η)創(chuàng)建 encrypted_string 類型;
(ο)添加encrypted_string類型比較函數(shù);
(P)添加為encrypted_string提供索引功能的函數(shù);
(q)倉鍵encrypted_string運算操作符;
Cr)創(chuàng)建encrypted_string索引必要的操作符列表。
[0023]利用PostgreSQL提供的編程接口,我們可以編寫所需要的數(shù)據(jù)類型和功能,將所寫的函數(shù)自然的融入進數(shù)據(jù)庫原有的系統(tǒng)中,充分利用數(shù)據(jù)庫原有的機能,上述實施例中僅以encrypted_string加密數(shù)據(jù)類型為例,演示如何開發(fā)并且擴展數(shù)據(jù)庫的功能,其他數(shù)據(jù)類型均以此為例。
[0024]本發(fā)明基于數(shù)據(jù)庫的積木式動態(tài)加密方法的有益效果是:
一、通過采用OpenSSL加密算法庫,實現(xiàn)AES加密、解密(CBC模式)和隨機數(shù)生成,實現(xiàn)對于同一個明文,每次加密后的密文都不相同;
二、通過利用BloomFilter,增大部分空間開銷,在密文比較時加快整體效率;
三、使用PostgreSQL提供的接口,擴展數(shù)據(jù)庫的功能,植入新的加密數(shù)據(jù)類型和相應(yīng)的操作符,將加密數(shù)據(jù)完整的融入原有數(shù)據(jù)庫系統(tǒng)中,利用數(shù)據(jù)庫自身的查詢優(yōu)化手段達到了高效密文查詢的目的。
[0025]以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其它相關(guān)的【技術(shù)領(lǐng)域】,均同理包括在本發(fā)明的專利保護范圍內(nèi)。
【權(quán)利要求】
1.一種基于數(shù)據(jù)庫的積木式動態(tài)加密方法,其特征在于,包括以下步驟: (1)布魯姆濾波器的實現(xiàn): (a)自定義一個結(jié)構(gòu)體BLOOM,結(jié)構(gòu)體內(nèi)聲明了位數(shù)組的大小asize、用于表示布魯姆濾波器的位數(shù)組a、所用的哈希函數(shù)個數(shù)nfuncs、以及指向所有用到的哈希函數(shù)的函數(shù)指針funcs,這些哈希函數(shù)傳入const char*類型的參數(shù)并輸出unsigned int類型的結(jié)果,這里用 typedef unsigned int (*hashfunc_t) (const char *)來聲明一個指向所需哈希函數(shù)的函數(shù)指針類型hashfunc_t ; (b)編寫創(chuàng)建布魯姆濾波器的函數(shù)BLOOM *bloom_create (int size, int nfuncs,...),根據(jù)傳入的size來確定位數(shù)組大小、傳入的nfuncs來確定哈希函數(shù)的個數(shù),使用var_start和var_end來處理動態(tài)個數(shù)的參數(shù)列表,得到所有哈希函數(shù)指針; (c)編寫銷毀布魯姆濾波器的函數(shù)intbloom_destroy (BLOOM *bloom),用于在完成布魯姆濾波器運算后,及時銷毀堆中的內(nèi)存,防止內(nèi)存泄露; (d)編寫添加兀素的函數(shù)int bloom_add(BLOOM abloom, const char *s),用于向指定的bloom中添加字符串元素s ; (e)編寫檢查元素是否屬于布魯姆濾波器的函數(shù)intbloom_check(BLOOM *bloom,const char *s),使用bloom中指向哈希函數(shù)的函數(shù)指針,依次計算s的哈希值并檢查位數(shù)組上相應(yīng)的數(shù)值,如果為0,返回false ; (2)為明文添加隨機字符串: (f)利用OpenSSL 提供的函數(shù) int RAND_bytes (unsigned char *buf, int num)來產(chǎn)生5個隨機數(shù); (g)將產(chǎn)生的隨機數(shù)轉(zhuǎn)換成相應(yīng)的16進制字符串,生成I個長度為10的Hex字符串; (3)加密: (h)使用步驟(I)中實現(xiàn)的代碼生成布魯姆濾波器; (i)計算明文長度,生成長度計數(shù)器; (j)使用步驟(2)中實現(xiàn)的代碼生成隨機字符串,并接在明文后面生成最終帶加密字符串; (k)利用OpenSSL提供的API,加密步驟(j)得到的字符串; (I)將步驟(h)、(j)、(k)中得到的字符串組合在一起,形成最終密文; (4)解密: (m)忽略密文的布魯姆濾波器部分,按照步驟(3)加密時的組合順序提取出明文計數(shù)器和密文,解密密文后,截取明文計數(shù)器指示的明文長度,得到最終明文。
2.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)庫的積木式動態(tài)加密方法,其特征在于,步驟(3)、(4)中設(shè)定了兩個密鑰:主密鑰MasterKey和工作密鑰Sess1nKey,其中主密鑰MasterKey由開發(fā)人員和用戶#define在代碼中共同協(xié)定,用來加密工作密鑰,工作密鑰Sess1nKey用于加密數(shù)據(jù),通過AES128算法,以密文的形式存儲在專門用來保管密鑰的數(shù)據(jù)庫中。
3.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)庫的積木式動態(tài)加密方法,其特征在于,還植入新的數(shù)據(jù)類型encrypted_string,使得數(shù)據(jù)庫可以插入數(shù)據(jù),編寫應(yīng)用于encrypted_string的操作符函數(shù),使得可以對數(shù)據(jù)庫的數(shù)據(jù)進行查詢。
4.根據(jù)權(quán)利要求3所述的基于數(shù)據(jù)庫的積木式動態(tài)加密方法,其特征在于,植入新的數(shù)據(jù)類型encrypted_string和編寫應(yīng)用于encrypted_string的操作符函數(shù)的步驟包括: (η)創(chuàng)建 encrypted_string 類型; (ο)添加encrypted_string類型比較函數(shù); (P)添加為encrypted_string提供索引功能的函數(shù); (q)倉鍵encrypted_string運算操作符; (r)創(chuàng)建encrypted_string索引必要的操作符列表。
【文檔編號】G06F17/30GK104252604SQ201410439845
【公開日】2014年12月31日 申請日期:2014年9月1日 優(yōu)先權(quán)日:2014年9月1日
【發(fā)明者】羅喜召 申請人:蘇州銳盾信息科技有限公司