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