數(shù)據(jù)庫加密方式
數(shù)據(jù)庫的加密方式一般有兩種:一種是數(shù)據(jù)庫管理系統(tǒng)內(nèi)部加密(簡稱庫內(nèi)加密);一種是數(shù)據(jù)庫管理系統(tǒng)外部加密(簡稱庫外加密)1。
庫內(nèi)加密庫內(nèi)加密是在數(shù)據(jù)庫管理系統(tǒng)的內(nèi)部加密的,如圖所示。
庫內(nèi)加密一般選擇在將數(shù)據(jù)存入磁盤或讀取給用戶之前進行加/解密操作,加/解密操作對用戶是完全透明的。也就是說,數(shù)據(jù)庫管理系統(tǒng)在將數(shù)據(jù)寫到硬盤之前先進行加密操作,而從硬盤讀取數(shù)據(jù)時進行相應(yīng)的解密操作。目前一些主流數(shù)據(jù)庫廠商已經(jīng)開始在其數(shù)據(jù)庫產(chǎn)品中提供加/解密功能,實現(xiàn)對數(shù)據(jù)的加/解密。如Oracle 10 g支持DES,3DES,AES等加密算法,供用戶調(diào)用進行庫內(nèi)數(shù)據(jù)加密存儲。
庫內(nèi)加密的優(yōu)點在于支持各種不同加密粒度的加密,而且加密的靈活性較好,功能強大。另外,由于是在數(shù)據(jù)庫管理系統(tǒng)內(nèi)部實現(xiàn)加/解密,可以更好地與數(shù)據(jù)庫管理系統(tǒng)內(nèi)部的各種功能有效結(jié)合起來。更重要的是,數(shù)據(jù)庫可以同時被多個應(yīng)用程序一起共享,這種方法的加/解密操作都是在數(shù)據(jù)庫管理系統(tǒng)的內(nèi)部完成,對用戶是完全透明的。
缺點在于需要修改數(shù)據(jù)庫管理系統(tǒng)的內(nèi)核。對于數(shù)據(jù)庫管理系統(tǒng)這么復(fù)雜的軟件,在系統(tǒng)內(nèi)部進行修改是一件非常困難的事,而且這種方法具有對數(shù)據(jù)庫提供商的依賴性,只能用于特定的場合,通用性不強。此外,數(shù)據(jù)庫管理系統(tǒng)負責(zé)集中管理和存儲大量數(shù)據(jù),如果還要它進行加/解密操作,必然會嚴(yán)重影響系統(tǒng)的性能。
庫外加密庫外加密一般選擇在應(yīng)用程序和數(shù)據(jù)庫管理系統(tǒng)之間,添加一個加/解密層來完成數(shù)據(jù)的存儲和訪問,如圖所示。
與庫內(nèi)加密相比,庫外加密的優(yōu)點在于無需修改數(shù)據(jù)庫管理系統(tǒng),只需要在應(yīng)用程序與數(shù)據(jù)庫之間增加相應(yīng)的加/解密模塊即可。將數(shù)據(jù)加密之后再存入數(shù)據(jù)庫,這樣就減少了數(shù)據(jù)庫管理系統(tǒng)的運行負擔(dān)。但是,這種做的缺點在于,對于加密后的數(shù)據(jù),數(shù)據(jù)庫的一些功能受到限制,如數(shù)據(jù)庫中的索引以及數(shù)據(jù)庫原有的完整性和一致性等。因此,需要在應(yīng)用程序中先對數(shù)據(jù)的完整性和一致性進行檢查,然后再對加密后的數(shù)據(jù)建立索引,最后才將數(shù)據(jù)存入數(shù)據(jù)庫中。這種方法不依賴數(shù)據(jù)庫提供商,通用性比較強,適合于任何一種數(shù)據(jù)庫。在目前新興的外包數(shù)據(jù)庫服務(wù)模式中,數(shù)據(jù)庫服務(wù)器都是由非完全可信的第三方提供,只是用來運行標(biāo)準(zhǔn)的DBMS,這就要求加/解密都在客戶端完成。因此,庫外加密方式正受到越來越多研究者的關(guān)注。
數(shù)據(jù)庫的加密粒度由于數(shù)據(jù)庫系統(tǒng)具有表、記錄、字段等多個結(jié)構(gòu)層次,所以數(shù)據(jù)庫的加密粒度可以分為數(shù)據(jù)庫級、表級、記錄級、和字段級。加密粒度越小,則靈活性越好,且安全性越高,但實現(xiàn)的技術(shù)也就越復(fù)雜。根據(jù)數(shù)據(jù)庫中信息的敏感程度不同,選擇合適加密粒度的加密算法進行加密。
(1)基于數(shù)據(jù)庫級加密:加密的對象是整個數(shù)據(jù)庫。雖然這種加密方法簡單,只需對存儲在硬盤中的數(shù)據(jù)庫文件進行加密處理即可,密鑰的數(shù)量也非常少,一個數(shù)據(jù)庫只需一個密鑰,管理很方便。但是,數(shù)據(jù)庫的一個重要特征是數(shù)據(jù)的高共享性,可以被多個用戶和應(yīng)用所共享使用,以及接受大量的隨機訪問。通常,用戶對數(shù)據(jù)庫進行訪問,是想獲取符合條件的所有記錄。如果采用數(shù)據(jù)庫級加密方式,即使是查詢少量的記錄,也要對整個數(shù)據(jù)庫進行解密,這樣就對系統(tǒng)性能會產(chǎn)生極大的影響。
(2)基于表級加密:加密的對象是數(shù)據(jù)庫中的表。一般來說,數(shù)據(jù)庫中包含多個表,我們只需對其中一些包含敏感信息的表進行加密,以確保它們的安全即可。與數(shù)據(jù)庫級加密粒度相比,采用表加密粒度,系統(tǒng)的查詢效率會有所改善,因為對于未經(jīng)過加密的表的查詢,與傳統(tǒng)查詢方法一樣,查詢不會受到任何影響。而對于加密表的查詢,只需先解密對應(yīng)的加密表,然后再進行查詢,無需解密整個數(shù)據(jù)庫。但是,這種方法與數(shù)據(jù)庫管理系統(tǒng)集成時,需要對數(shù)據(jù)庫管理系統(tǒng)內(nèi)部的一些核心模塊進行修改,而目前一些主流的商用數(shù)據(jù)庫管理系統(tǒng)都不開放源代碼,很難把這種方法與它們集成起來。
(3)基于記錄級加密:數(shù)據(jù)庫系統(tǒng)中的每條記錄都是完整地存儲了一個實體的數(shù)據(jù)。因此,基于記錄級加密是最常用的方式。這種方式是將數(shù)據(jù)庫中每條記錄使用不同的加密密鑰進行加密后存儲在數(shù)據(jù)庫文件中。記錄的長度一般較短,而存儲在數(shù)據(jù)庫中的時間較長,如果使用的密鑰太少,則會導(dǎo)致保密性面臨威脅,密鑰使用太多又會導(dǎo)致密鑰管理的復(fù)雜性。同時和表級加密一樣,這種方法也需要對數(shù)據(jù)庫管理系統(tǒng)的內(nèi)核進行修改。
(4)基于字段(屬性)級加密:加密的對象是數(shù)據(jù)庫表中一條記錄的某個字段?;谧侄渭壖用埽褪且圆煌涗浀牟煌侄螢榛炯用軉卧M行加密,該方法可以對數(shù)據(jù)庫中單個數(shù)據(jù)元素進行加密。其優(yōu)點在于具有最小的加密粒度,具有更好的靈活性和適應(yīng)性。
密文數(shù)據(jù)庫體系結(jié)構(gòu)存放問題
由于數(shù)據(jù)庫系統(tǒng)的內(nèi)部結(jié)構(gòu)非常復(fù)雜,如果對現(xiàn)有的數(shù)據(jù)庫系統(tǒng)(如SQL SERvER、ORAcLE、DB2等)進行修改,將是一件非常困難的事。而且還需要數(shù)據(jù)庫提供商的支持,通用性不強。所以本文采用庫外加/解密的方法,在應(yīng)用程序與數(shù)據(jù)庫之間添加一層加/解密層,專門用來負責(zé)數(shù)據(jù)的加密存儲和解密查詢。這樣就不依賴于數(shù)據(jù)庫提供商,適用于各種數(shù)據(jù)庫,具有較好的通用性。
數(shù)據(jù)加密之后,密文有兩種存儲方式:一種是存儲到原來數(shù)據(jù)庫表中的相應(yīng)位置;另一種是另外建立一個密文空間,將密文存入其中。第一種方法從理論上講,是一種較好的存儲方式,因為它不會增加額外的存儲空間,但是從實踐來看,不具通用性。這是因為加密后的密文,其數(shù)據(jù)類型和長度都發(fā)生了改變,不可能再插入到原來的字段中。雖然建立另外的密文空間會增加存儲空間,但是這種方法很容易實現(xiàn)。因此,本文的存儲是基于第二種方法。
存儲時,在應(yīng)用程序中的數(shù)據(jù)存入數(shù)據(jù)庫之前,需要進行兩方面處理。一方面,由加解密層調(diào)用加密算法對數(shù)據(jù)進行加密處理,然后存儲到密文空間;另一方面,對存儲密文的空間地址進行加密,然后存儲到數(shù)據(jù)庫相應(yīng)的字段,并更新索引樹。
查詢問題
查詢時,一般分為兩種情況:
1)根據(jù)關(guān)鍵字進行查詢。從數(shù)據(jù)庫中找到此記錄對應(yīng)查詢字段的標(biāo)記,如果為明文,則直接返回結(jié)果;否則將該密文解密,用解密后的地址到密文空間取出密文數(shù)據(jù),解密并返回結(jié)果即可。
2)根據(jù)非關(guān)鍵字進行查詢。非關(guān)鍵字在數(shù)據(jù)庫中可能是明文或密文,因此這里假設(shè)從明文索引樹開始查找。若找到相同的結(jié)點,則對應(yīng)返回其記錄關(guān)鍵字,并用該關(guān)鍵字進行查詢,下面的操作將與1)相同。若在明文索引樹中未找到,則需要到密文索引樹中進行查找。首先解密索引樹的根結(jié)點,跟關(guān)鍵字比較之后確定下一個結(jié)點。重復(fù)以上操作,直到找到葉結(jié)點為止。返回滿足條件記錄的關(guān)鍵字,用關(guān)鍵字進行查找,下面的操作將與1)相同。
如圖所示,加/解密層用來修改存儲和查詢語句。存儲時,除了加密數(shù)據(jù)外,還通過規(guī)則修改sQL語句,同時更新索引樹;查詢時,通過修改查詢語句,轉(zhuǎn)換成對索引樹的查詢,然后到密文空間取出密文,解密后返回結(jié)果。加密和解密分別是由加密和解密函數(shù)對數(shù)據(jù)庫中敏感信息進行加解密的功能模塊。
密文存儲結(jié)構(gòu)對于數(shù)據(jù)庫中需要加密的屬性,并不是加密后直接存儲到數(shù)據(jù)庫中,而是存儲到另外的密文空間,數(shù)據(jù)庫存儲的僅是該屬性存儲在密文空間的地址的加密。這是因為加密之后數(shù)據(jù)的類型發(fā)生變化,類型變化會導(dǎo)致數(shù)據(jù)丟失,而且加密后的長度也可能超出數(shù)據(jù)庫設(shè)計的長度。密文空間的存儲結(jié)構(gòu)Enc_Field(Address,DB_name,Tab_name,F(xiàn)ield_name,F(xiàn)ield_content)。其中Address是主鍵,DB_name是數(shù)據(jù)庫名,Tab_name是數(shù)據(jù)庫表名,F(xiàn)ield_name是數(shù)據(jù)庫表中的加密字段,F(xiàn)ield_content是數(shù)據(jù)庫表中加密字段的密文。如表所示,入口地址是存儲密文的首地址,E()為加密函數(shù)。
選用此存儲結(jié)構(gòu)的優(yōu)點:
增強了數(shù)據(jù)庫的安全性。數(shù)據(jù)庫中存儲的只是密文空間的地址,數(shù)據(jù)庫中的加密字段就算被解密,也只是得到密文空間的地址,而沒有泄露數(shù)據(jù)庫中的敏感信息。
便于存儲。由于加密后的數(shù)據(jù)無需排序,不用考慮插入和刪除所帶來的繁瑣操作。因此在存儲時,只要找到足夠的空間進行存儲并記錄存儲地址即可,而不需要移動大段的數(shù)據(jù)。
方便密鑰更換。由于加密后的敏感信息是獨立于數(shù)據(jù)庫的,如果需要進行密鑰更換,僅僅是對密文空間進行操作,而不用涉及到數(shù)據(jù)庫操作便可完成。這樣就減少對數(shù)據(jù)庫的操作,保證了數(shù)據(jù)庫的安全性。