資料庫加密方式
資料庫的加密方式一般有兩種:一種是
資料庫管理系統內部加密(簡稱庫內加密);一種是資料庫管理系統外部加密(簡稱庫外加密)。
庫內加密
庫內加密是在資料庫管理系統的內部加密的,如圖所示。
![密文資料庫 密文資料庫](/img/5/523/nBnaukDNjlTOlFDMwEDZ4kDZ2czNhVGMjZWM5YWYjFmNzIGN5AjN3YWZhN2LtVGdp9yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
庫內加密一般選擇在將數據存入磁碟或讀取給用戶之前進行加/解密操作,加/解密操作對用戶是完全透明的。也就是說,資料庫管理系統在將數據寫到硬碟之前先進行加密操作,而從硬碟讀取數據時進行相應的解密操作。目前一些主流資料庫廠商已經開始在其資料庫產品中提供加/解密功能,實現對數據的加/解密。如Oracle 10 g支持DES,3DES,AES等加密算法,供用戶調用進行庫內數據加密存儲。
庫內加密的優點在於支持各種不同加密粒度的加密,而且加密的靈活性較好,功能強大。另外,由於是在資料庫管理系統內部實現加/解密,可以更好地與資料庫管理系統內部的各種功能有效結合起來。更重要的是,資料庫可以同時被多個應用程式一起共享,這種方法的加/解密操作都是在資料庫管理系統的內部完成,對用戶是完全透明的。
缺點在於需要修改資料庫管理系統的核心。對於資料庫管理系統這么複雜的軟體,在系統內部進行修改是一件非常困難的事,而且這種方法具有對資料庫提供商的依賴性,只能用於特定的場合,通用性不強。此外,資料庫管理系統負責集中管理和存儲大量數據,如果還要它進行加/解密操作,必然會嚴重影響系統的性能。
庫外加密
庫外加密一般選擇在應用程式和資料庫管理系統之間,添加一個加/解密層來完成數據的存儲和訪問,如圖所示。
![密文資料庫 密文資料庫](/img/b/dcb/nBnauITOyM2MwYjZwQmM2cjM5YDO3YjM2AjYkZGZxEzYycTNzQmMmlDZzYzLtVGdp9yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
與庫內加密相比,庫外加密的優點在於無需修改資料庫管理系統,只需要在應用程式與資料庫之間增加相應的加/解密模組即可。將數據加密之後再存入資料庫,這樣就減少了資料庫管理系統的運行負擔。但是,這種做的缺點在於,對於加密後的數據,資料庫的一些功能受到限制,如資料庫中的索引以及資料庫原有的完整性和一致性等。因此,需要在應用程式中先對數據的完整性和一致性進行檢查,然後再對加密後的數據建立索引,最後才將數據存入資料庫中。這種方法不依賴資料庫提供商,通用性比較強,適合於任何一種資料庫。在目前新興的外包資料庫服務模式中,資料庫伺服器都是由非完全可信的第三方提供,只是用來運行標準的DBMS,這就要求加/解密都在客戶端完成。因此,庫外加密方式正受到越來越多研究者的關注。
資料庫的加密粒度
由於資料庫系統具有表、記錄、欄位等多個結構層次,所以資料庫的加密粒度可以分為資料庫級、表級、記錄級、和欄位級。加密粒度越小,則靈活性越好,且安全性越高,但實現的技術也就越複雜。根據資料庫中信息的敏感程度不同,選擇合適加密粒度的加密算法進行加密。
(1)基於資料庫級加密:加密的對象是整個資料庫。雖然這種加密方法簡單,只需對存儲在硬碟中的資料庫檔案進行加密處理即可,密鑰的數量也非常少,一個資料庫只需一個密鑰,管理很方便。但是,資料庫的一個重要特徵是數據的高共享性,可以被多個用戶和套用所共享使用,以及接受大量的隨機訪問。通常,用戶對資料庫進行訪問,是想獲取符合條件的所有記錄。如果採用資料庫級加密方式,即使是查詢少量的記錄,也要對整個資料庫進行解密,這樣就對系統性能會產生極大的影響。
(2)基於表級加密:加密的對象是資料庫中的表。一般來說,資料庫中包含多個表,我們只需對其中一些包含敏感信息的表進行加密,以確保它們的安全即可。與資料庫級加密粒度相比,採用表加密粒度,系統的查詢效率會有所改善,因為對於未經過加密的表的查詢,與傳統查詢方法一樣,查詢不會受到任何影響。而對於加密表的查詢,只需先解密對應的加密表,然後再進行查詢,無需解密整個資料庫。但是,這種方法與資料庫管理系統集成時,需要對資料庫管理系統內部的一些核心模組進行修改,而目前一些主流的商用資料庫管理系統都不開放原始碼,很難把這種方法與它們集成起來。
(3)基於記錄級加密:資料庫系統中的每條記錄都是完整地存儲了一個實體的數據。因此,基於記錄級加密是最常用的方式。這種方式是將資料庫中每條記錄使用不同的加密密鑰進行加密後存儲在資料庫檔案中。記錄的長度一般較短,而存儲在資料庫中的時間較長,如果使用的密鑰太少,則會導致保密性面臨威脅,密鑰使用太多又會導緻密鑰管理的複雜性。同時和表級加密一樣,這種方法也需要對資料庫管理系統的核心進行修改。
(4)基於欄位(屬性)級加密:加密的對象是資料庫表中一條記錄的某個欄位。基於欄位級加密,就是以不同記錄的不同欄位為基本加密單元進行加密,該方法可以對資料庫中單個數據元素進行加密。其優點在於具有最小的加密粒度,具有更好的靈活性和適應性。
密文資料庫
體系結構
存放問題
由於資料庫系統的內部結構非常複雜,如果對現有的資料庫系統(如SQL SERvER、ORAcLE、DB2等)進行修改,將是一件非常困難的事。而且還需要資料庫提供商的支持,通用性不強。所以本文採用庫外加/解密的方法,在應用程式與資料庫之間添加一層加/解密層,專門用來負責數據的加密存儲和解密查詢。這樣就不依賴於資料庫提供商,適用於各種資料庫,具有較好的通用性。
數據加密之後,密文有兩種存儲方式:一種是存儲到原來資料庫表中的相應位置;另一種是另外建立一個密文空間,將密文存入其中。第一種方法從理論上講,是一種較好的存儲方式,因為它不會增加額外的存儲空間,但是從實踐來看,不具通用性。這是因為加密後的密文,其數據類型和長度都發生了改變,不可能再插入到原來的欄位中。雖然建立另外的密文空間會增加存儲空間,但是這種方法很容易實現。因此,本文的存儲是基於第二種方法。
存儲時,在應用程式中的數據存入資料庫之前,需要進行兩方面處理。一方面,由加解密層調用加密算法對數據進行加密處理,然後存儲到密文空間;另一方面,對存儲密文的空間地址進行加密,然後存儲到資料庫相應的欄位,並更新索引樹。
查詢問題
查詢時,一般分為兩種情況:
1)根據關鍵字進行查詢。從資料庫中找到此記錄對應查詢欄位的標記,如果為明文,則直接返回結果;否則將該密文解密,用解密後的地址到密文空間取出密文數據,解密並返回結果即可。
2)根據非關鍵字進行查詢。非關鍵字在資料庫中可能是明文或密文,因此這裡假設從明文索引樹開始查找。若找到相同的結點,則對應返回其記錄關鍵字,並用該關鍵字進行查詢,下面的操作將與1)相同。若在明文索引樹中未找到,則需要到密文索引樹中進行查找。首先解密索引樹的根結點,跟關鍵字比較之後確定下一個結點。重複以上操作,直到找到葉結點為止。返回滿足條件記錄的關鍵字,用關鍵字進行查找,下面的操作將與1)相同。
如圖所示,加/解密層用來修改存儲和查詢語句。存儲時,除了加密數據外,還通過規則修改sQL語句,同時更新索引樹;查詢時,通過修改查詢語句,轉換成對索引樹的查詢,然後到密文空間取出密文,解密後返回結果。加密和解密分別是由加密和解密函式對資料庫中敏感信息進行加解密的功能模組。
![密文資料庫 密文資料庫](/img/6/aca/nBnaukDMwYmNwUmN4AzY0EDMzEmMmhDM1QTO4AzMmFDOzgjM4AzNwYmMmlzLtVGdp9yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
密文存儲結構
對於資料庫中需要加密的屬性,並不是加密後直接存儲到資料庫中,而是存儲到另外的密文空間,資料庫存儲的僅是該屬性存儲在密文空間的地址的加密。這是因為加密之後數據的類型發生變化,類型變化會導致數據丟失,而且加密後的長度也可能超出資料庫設計的長度。密文空間的存儲結構Enc_Field(Address,DB_name,Tab_name,Field_name,Field_content)。其中Address是主鍵,DB_name是資料庫名,Tab_name是資料庫表名,Field_name是資料庫表中的加密欄位,Field_content是資料庫表中加密欄位的密文。如表所示,入口地址是存儲密文的首地址,E()為加密函式。
![密文資料庫 密文資料庫](/img/8/a8c/nBnauQmZiZDM1EWO4MTOiVmM1ITYiVDOhJjN5MWZidTZwgjYmNTMyEDM4MzLtVGdp9yYpB3LltWahJ2Lt92YuUHZpFmYuMmczdWbp9yL6MHc0RHa.jpg)
選用此存儲結構的優點:
增強了資料庫的安全性。資料庫中存儲的只是密文空間的地址,資料庫中的加密欄位就算被解密,也只是得到密文空間的地址,而沒有泄露資料庫中的敏感信息。
便於存儲。由於加密後的數據無需排序,不用考慮插入和刪除所帶來的繁瑣操作。因此在存儲時,只要找到足夠的空間進行存儲並記錄存儲地址即可,而不需要移動大段的數據。
方便密鑰更換。由於加密後的敏感信息是獨立於資料庫的,如果需要進行密鑰更換,僅僅是對密文空間進行操作,而不用涉及到資料庫操作便可完成。這樣就減少對資料庫的操作,保證了資料庫的安全性。