宋天煜,楊 庚
(南京郵電大學 計算機學院、軟件學院、網絡空間安全學院, 南京 210023)(*通信作者電子郵箱airsty@163.com)
針對數據機密性、完整性和可用性的保護是數據庫安全的重要內容,對數據庫安全的威脅主要包括兩個方面[1]:一是對數據庫系統的外部攻擊,非法用戶通過重放攻擊或者利用數據庫系統漏洞進入數據庫,破壞隱私數據;二是來自數據庫系統內部的攻擊,具有合法訪問數據庫系統的用戶,利用其權限探查、修改和泄露隱私數據。
為了保障數據庫系統的安全性,將敏感數據加密后存入數據庫中是一種有效的方法[2-3]。目前數據庫加密主要在操作系統層、數據庫管理系統(DataBase Management System, DBMS)內核層和DBMS外層這三種不同層次上實現:
1)操作系統層加密的本質是加解密和密鑰管理都交給操作系統和文件管理系統操作,對于數據庫系統完全是透明的。在安全性方面,由于操作系統不能對數據庫中的數據按照表結構或者字段結構進行區分,因此不能提供不同的加解密算法和加密密鑰;在效率方面,需要對存儲的所有數據進行加密和解密,會大大降低數據庫的處理能力。
2)DBMS內核層的加密的優點是所有的操作都和數據庫的內核進行交互,能夠實現數據庫所有的管理功能。但是也有很大的缺點,首先因為很多數據庫的內核不是開源的,改寫源代碼需要有數據庫供應商的支持;其次加解密的操作都要在數據庫服務器端進行,會加重服務器的負載。
3)DBMS外層實現加密的優點是所有加解密的操作都是在數據庫的外層,不需要對數據庫進行定制開發,并且不會加重數據庫服務器的負擔,但是加密后會對數據庫系統的某些功能造成影響,同時對整個系統的響應產生一定的影響。
現有的三種層次的數據加解密服務都存在著一定的缺陷,為了使用不同加密算法對數據進行加密,實現與數據庫管理系統的松耦合并且不影響系統的速度,研究者提出了數據庫中間件[4]。其中數據庫加密中間件可以部署在數據庫客戶端-服務器這種分布式應用之間,采用請求-響應的同步方式進行通信。目前提出的數據庫加密中間件系統可以提供透明的數據加解密服務和獨立的密鑰管理機制;但是存在著數據傳輸效率不高,對數據庫客戶端工具沒有很好地支持,以及對密文數據庫用戶沒有進行安全的管理等不足。
在現有的數據庫中間件的基礎上,本文設計并實現一種面向密文數據庫的中間件系統。本中間件系統設計了基于MySQL通信協議的密文中間件架構,相較于其他加密中間件使用Java數據庫連接(Java DataBase Connectivity, JDBC)連接數據庫,這種連接方式提高了對密文數據的傳輸效率,支持不同的數據庫客戶端工具,并支持不同用戶使用多個客戶端工具對密文數據庫進行操作。同時,本中間件系統擁有對用戶的認證功能,對數據使用者身份進行認證訪問權限控制來防止其進行越權操作,并通過使用動態認證的方案有效防止非法用戶通過重放攻擊進入密文數據庫。
由于社會信息化和網絡化的發展導致產生的數據爆炸式增長[5],對數據的保護變得越來越重要,特別是防止敏感數據被竊取、破壞和泄露成為當務之急,因此數據以明文的形式存儲在數據庫中已經不能滿足用戶對隱私保護的需求[6]。針對這一需求,數據管理廠商在產品中提供相應的安全功能,Oracle和MS-SQL Server兩家廠商提供的安全功能都是在DBMS中加載加密包,通過擴展存儲過程來調用系統加解密模塊、密鑰管理模塊、密文索引模塊等實現數據庫的加密操作,這種加密方式實現起來比較簡單,適合于對加密要求不高的用戶使用。
通過分析數據庫管理系統廠商提供的安全方案可以發現,使用加載軟件包實現對數據的加密存在著以下四個缺點:1)密鑰和密文保存在同一個服務器中,一旦數據庫被非法侵入時十分危險的,并且密鑰更新成本過高;2)數據庫管理員(DataBase Administrator, DBA)可以輕易接觸到密鑰,也就存在訪問敏感數據的可能性;3)無法對密文直接進行操作;4)對數據庫用戶沒有進行安全管理。面對越來越復雜的數據安全環境,DBMS提供的數據加解密機制已經不能有效地滿足用戶對信息安全的需求。
為了保障密鑰的安全,文獻[7]基于混沌理論生成隨機密鑰,使用中國剩余定理對密鑰進行分配,可以很好地保障主密鑰的安全和降低密鑰更新的成本。文獻[8]中使用了獨立的密鑰管理模塊來負責產生、分發和更新密鑰,可以有效保障密鑰的安全。文獻[9]提出一種模塊化的動態密碼策略生成器(Dynamic Password Policy Generator, DPPG),可以為策略生成不同的安全指標,從而應對各種安全攻擊。
針對無法對密文數據庫直接進行操作的困難,可搜索加密(searchable encryption)便應運而生,并得到了研究者廣泛研究和發展[10-13]。用戶將明文數據加密后存儲在服務器中,當需要檢索數據時,用戶將關鍵字的檢索憑證發給服務器,服務器根據憑證在密文數據上直接檢索,將含有關鍵字的文件返回給用戶,用戶使用解密算法對文件進行解密。但是以上的研究解決的是針對文本文件的檢索并且會加重用戶主機的負擔。為了解決密文數據庫中結構化數據的搜索問題,麻省理工學院(Massachusetts Institute of Technology, MIT)的研究員提出了CryptDB系統[14-15],該系統通過使用洋蔥加密模型實現對密文數據直接進行結構化查詢語言(Structured Query Language, SQL)操作,但是在洋蔥模型對外層解密后,內層的數據將長時間無法得到保護。文獻[16]在CryptDB的基礎上設計并實現了任務分割的數據庫加密系統——MONOMI,通過使用客戶端/服務器的結構,將任務分成客戶端和服務器端兩部分,分析SQL語句后決定任務的分配,緩解服務器端的壓力。
針對密文數據用戶管理困難的問題,文獻[17]基于密文策略屬性基加密(Ciphertext-Policy Attribute-Based Encryption, CP-ABE)算法設計出一種密文訪問控制機制,減少用戶接觸密鑰生成、密鑰發布等任務,可以有效防止非法用戶破壞數據。文獻[18]提出高效安全的訪問控制方案DAC-MACS (Data Access Control for Multi-Authority Cloud Storage),可以對多個數據使用者進行訪問控制和用戶撤銷。文獻[19]提出一種基于用戶行為認證的訪問控制模型,通過結合時態信息和環境信息對用戶行為建模,對用戶行為進行認證,有效提高網絡數據的安全性。文獻[20]針對密文數據存儲中多個數據擁有者的問題,通過對用戶和認證服務器交換的信息不斷更新,實現用戶的動態認證,可以有效防止非法用戶通過重放攻擊進入數據服務器。
DBMS廠商提供的數據庫安全服務在密鑰管理方面存在著不足,而已有的密文數據庫中間件方案無法做到高效的數據傳輸和安全的用戶管理。在此基礎上,本文設計并實現了面向密文數據庫的中間件系統,可以對密文數據庫進行可搜索加密、數據的高效安全傳輸和對用戶的安全管理。
面向密文數據庫的中間件系統的體系結構如圖1所示。中間件系統基于MySQL通信協議進行通信,它運行在用戶主機上,是連接數據庫客戶端和數據庫服務器的軟件。用戶對數據庫進行訪問時,首先需要在中間件進行動態認證和權限分析,認證通過后使用數據庫客戶端對服務器進行訪問操作。中間件解析用戶發送的SQL語句,加密敏感數據后發送給服務器,數據庫服務器返回的密文結果由中間件系統解密后傳給客戶端。

圖1 中間件系統體系結構Fig. 1 Middleware system architecture
本中間件系統使用MySQL通信協議與密文數據庫進行通信,因此數據傳輸模塊的功能包括:一是完成與數據庫客戶端和服務器的MySQL握手連接;二是獲取客戶端與服務器之間傳輸的數據報文,解析報文獲得需要加解密的信息。
1)完成MySQL握手連接。
中間件系統首先會接收到數據庫服務器發送的握手包,然后將握手包發送給數據庫客戶端工具,客戶端工具接收到握手包后將用戶名和密碼發送給中間件系統,中間件驗證登錄認證信息,如果合法則連接客戶端和服務器端,否則連接失敗。
2)解析數據報文。
數據庫報文解析和修改過程如圖2所示,中間件系統獲取到包含數據報文的字節流后將其分解成報文長度、序號和消息體這三部分。中間件系統首先將消息體部分轉化為字符串,獲取到的字符串就是標準的SQL語句,然后使用加解密模塊對SQL語句進行加密改寫。完成改寫后將SQL字符串轉化為Byte數組,計算其長度并對報文長度進行更新,最后再將修改后的報文長度、序號和新的消息體重新組合成標準格式的數據庫報文。

圖2 數據庫報文解析和修改Fig. 2 Database message parsing and modification
SQL語句改寫模塊的功能是對SQL語句進行解析,改寫模塊獲得由消息體解析的SQL語句后,首先判斷查詢類型,如果是create、select、insert、update、delete這5種用戶輸入的SQL語句,就對SQL語句中明文數據進行加密,并對列名進行修改。下面通過一個例子說明,BenefitsCostSharing是美國醫療保險市場數據集中的一張表。若用戶輸入語句:
select name from BenefitsCostSharing where PlanId=20;
則經過SQL語句改寫模塊輸出語句:
select c1_DEA from BenefitsCostSharing where c2_DEA=′Daefkes==′;
其中:“PlanId=20”屬于等值匹配的操作謂詞,解析函數調用加解密模塊對明文數字20使用等值加密模型進行加密,得到密文“Daefkes==”;并且將列名id改為c2_DEA,代表在密文上將使用等值加密模型的列;select from部分的列名也將被改寫為c1_DEA,表示從等值加密模型中獲取密文。
該模塊中包含了中間件系統的加解密算法,提供了對敏感數據的加密和解密功能。為了實現對密文數據的搜索功能,本中間件系統使用的加解密算法是基于CryptDB的洋蔥加密模型的可搜索加密算法,用戶可以在密文數據上直接進行SQL查詢。
如圖3所示,可搜索加密算法使用了三種加密模型:等值加密模型、保序加密模型和同態加密加密模型。
1)等值加密模型。
該模型使用兩種結構,首先使用確定加密算法(Deterministic Encryption Algorithm, DEA)對明文數據進行加密生成內層密文,內層密文可以直接進行等值比較;然后使用隨機加密算法(Random Encryption Algorithm, REA)對內層的確定加密密文再次進行加密,形成兩層加密的結構。當需要對密文進行等值比較時,中間件系統首先將外層密文解密,完成等值操作后再對內層密文進行隨機加密。使用兩層加密結構不僅能保證數據的安全性,還能實現密文數據的等值比較。

圖3 中間件系統中的加密模型Fig. 3 Encryption model in middleware system
2)保序加密模型。
該模型使用單層加密模型,使用保序加密算法(Order Preserving Encryption Algorithm, OPEA)[21]對明文進行加密,可以在不對密文數據進行解密的情況下直接比較順序。
3)同態加密模型
該模型采用單層加密,使用同態加密算法(Homomorphic Encryption Algorithm, HEA)[22]進行加密,這種加密算法的特征是密文的加乘運算結果解密后與在明文上直接進行加乘運算結果相同,可以直接在密文上完成數據庫操作中的求和以及求平均數操作。
該模塊主要實現三個功能,分別是數據使用者的權限判斷、身份動態認證和用戶身份的撤銷與更新。為了保證對數據使用者的有效管理,中間件系統需要在數據庫中創建用戶權限表和用戶認證表。
1)用戶權限判斷功能。
用戶權限判斷主要針對的是首次請求訪問密文數據庫的數據使用者,中間件系統進行用戶權限判斷之前首先要獲取數據使用者的n個身份屬性atti(0

2)用戶動態認證功能。
如圖4所示,用戶動態認證包括以下6個步驟:
①數據使用者對密文數據庫進行第i+1(i≥1)次訪問,通過Eni=(ci⊕ti)ki對認證信息進行加密,將加密的認證信息Eni傳遞給中間件。其中:ki為加密密鑰,ci表示數據使用者擁有的認證信息,ti表示數據使用者認證的次數,⊕表示異或操作。
②數據使用者通過ki+1=ki⊕H(ci⊕ti)對密鑰進行更新,保存新的密鑰ki+1,其中H(ci⊕ti)表示對ci⊕ti的哈希函數。
③中間件通過Dei=D(ki,Eni)對Eni進行解密,將Dei與用戶認證表中的認證信息進行比較,如果不相同則提示數據使用者認證失敗。
④中間件通過ki+1=ki⊕H(ci⊕ti+1)更新密鑰,以及ci+1=H(ci⊕ti)生成新的認證信息ci+1,并對用戶認證表中的信息進行更新。
⑤使用新密鑰ki+1對ci+1進行加密,得到新的加密認證信息Eni+1=(ci+1⊕ti+1)ki+1,中間件將新的加密認證信息發送給數據使用者。
⑥數據使用者使用密鑰ki+1對加密的認證信息Eni+1解密,保存新的認證信息ci+1。
數據使用者通過認證后,中間件系統為其在密文數據庫中創建臨時用戶,臨時用戶的用戶名為數據使用者的用戶名userName,密碼為新的認證信息ci+1,數據使用者通過用戶名和密碼進入密文數據庫。

圖4 用戶動態認證流程Fig. 4 Flow chart of user dynamic authentication
3)數據使用者撤銷與更新功能。
由于數據使用者在使用密文數據庫的過程中并沒有接觸到密文數據庫的任何密鑰,所以在撤銷和更新數據使用者時不需要對密文數據密鑰進行大量的更新。當某一數據使用者被撤銷或更新時,中間件系統只需要修改用戶屬性表和用戶認證表中的信息。
密鑰管理模塊的功能包括:一是根據數據擁有者提供的信息生成主密鑰,主密鑰不僅作為等值加密模型的工作密鑰,還用于用戶認證的功能;二是對于加解密模型中保序和同態加密,在創建數據表的時候針對數值型的列產生相應的列密鑰。面向密文數據庫系統采用兩種密鑰管理方案。
1)數據擁有者主密鑰產生方案。主密鑰在數據擁有者創建數據表的時候生成,密鑰產生方案為:
Kdom,c=KeyGen(DataOwnerMessagem, ColumnNamec)
其中:m是數據擁有者提供的信息;c是列名。密鑰管理器通過用戶提供的信息和列名動態生成一個工作密鑰,用于等值加密算法。
2)對于保序加密和同態加密模型,密鑰通過主密鑰加密后成為二級密鑰存儲在數據庫獨立的表中,在中間件對數據進行加解密前,會從密鑰表中獲取密鑰。
生成密鑰后,將密鑰保存在獨立的密鑰數據庫中,以便在對數據進行加解密時使用。
該系統編程語言采用Java,數據庫為MySQL。
開發環境如下:1)硬件:處理器為Intel Core i5-5257U,內存為8 GB。2)軟件:操作系統為macOS,Java開發環境為JDK1.8,MySQL版本為5.7。
實驗硬件環境為:CPU為Intel Xeon E3,Memory為16 GB 1 333 MHz Dual Ranked;Disk為1 TB 3.5-inch 7.2 K RPM SATA II Hard Drive。
實驗平臺為:Ubuntu-12.04。
3.2.1 測試方案
實驗使用的數據集是美國醫療保險市場數據,首先運行中間件系統,創建三張數據庫表:第一張表T1包含10個int類型字段,第二張表T2包含10個varchar字段,第三張表T3包含5個int型字段、5個varchar字段。從美國醫療保險市場數據中選取相應數據改寫生成SQL語句,加密存儲完成后對數據進行操作并記錄時間。測試的對象是分別使用MySQL通信協議和Java數據庫連接(Java DataBase Connectivity, JDBC)的中間件系統。
3.2.2 測試結果以及分析
圖5描述了中間件使用MySQL通信協議對三個不同類型數據庫表執行insert語句的時間消耗。由于需要對int類型的數據進行保序和同態加密,所以10個int類型字段的表插入速度最慢,對varchar類型數據只要進行確定加密,所以執行完成時間是最少的,而混合著int類型和varchar類型的表插入速度在前兩者之間。

圖5 不同類型數據表執行insert語句時間消耗對比Fig. 5 Time consumption comparison for different types of dataTables to execute insert statement
數據庫表中有5個int類型字段和varchar類型字段的情況下,對兩種連接方式執行insert語句的時間消耗對比如圖6所示。

圖6 兩種方式連接數據庫時執行insert語句時間消耗對比Fig. 6 Time consumption comparison of executing insert statement with two ways of connecting to the database
圖7描述了當插入數據量一定時,相比使用JDBC連接數據庫方式,隨著數據表中int類型的減少,使用MySQL通信協議連接的中間件完成操作消耗時間越少,且隨著int類型數量的減小,兩種連接方式消耗時間差距越來越大。
兩種連接方式分別對數據庫執行1 000條select、join等語句的時間對比如圖8所示。由圖8可知,相比于JDBC方式,使用MySQL通信協議連接在對數據庫的操作時間消耗上有著較大的效率優勢。

圖7 insert語句操作中int類型數量占比對測試對象時間的影響Fig. 7 Influence of number of int types in insert statement operation on time of test object

圖8 兩種連接數據庫方式執行SQL語句消耗時間對比Fig. 8 Time consumption comparison of executing SQL statement with two ways of connecting to the database
測試結果表明,使用MySQL通信協議連接數據庫的中間件系統較使用JDBC連接方式而言,在對密文數據庫進行操作時有著較為明顯的速度優勢,同時隨著數據庫表中數值類型數量的增多優勢更加明顯。
數據庫面臨的威脅一般來自這幾個角色:數據庫管理員、數據庫合法用戶,以及試圖竊取數據庫存儲介質的非法用戶。
3.3.1 數據庫管理員
數據庫管理員作為數據庫系統的管理者,擁有訪問其管理的數據的最高權限。數據經過中間件加密后存儲在密文數據庫中,查看這些信息需要解密操作。由于密鑰和敏感數據存儲在不同的數據庫中,密文數據庫管理員無法獲得密鑰對敏感數據進行解密。對于管理密鑰數據庫的管理員,密鑰都是經過主密鑰加密后以二級密鑰的形式存儲的,因此數據庫管理員即使獲得了密鑰也無法對其解密。
3.3.2 數據庫合法用戶
由于中間件對用戶權限進行了限制,合法用戶只能訪問密文數據庫中在其權限范圍之內的數據,即使他突破了訪問限制,由于沒有密鑰,他也無法查看其他敏感數據。
3.3.3 試圖竊取數據庫存儲介質的非法用戶
非法用戶想要使用中間件系統,首先需要進行身份認證。由于中間件系統使用了動態認證機制,即使非法用戶獲得了認證密碼,每次合法用戶認證完成后都會更新認證密碼,并且能使用認證密碼的數據庫臨時賬戶也會被銷毀。如果非法用戶想直接竊取數據,他必須成功同時竊取到密文數據庫和密鑰服務器中的存儲介質,即使他竊取到了密鑰,獲得的也是二級密鑰,無法對密文數據進行解密。而且在確定加密中加入了隨機加密策略,因此除非非法用戶使用中間件系統對數據進行解密,否則無法查看到敏感數據。
綜上分析,經過中間件加密后的數據庫可以有效地防止來自數據庫內部和外部的攻擊,并且對合法用戶的權限也能有很好的限制。
通過對明文數據庫進行加密使其變為密文數據庫是保證數據機密性的重要手段。本文提出了一種面向密文數據庫的中間件系統的設計方案,通過在安全主機上部署中間件,可以實現密文數據庫的可搜索加密操作。相較于其他的數據庫中間件系統,該方案的特點在于:使用MySQL通信協議連接數據庫客戶端和服務器端,保證數據高效安全傳輸,并對數據庫客戶端工具有著更好的支持;動態用戶認證機制可以有效防止非法用戶的攻擊;實現了密文數據庫的可搜索操作。實驗結果表明,所提中間件系統可以高效地進行數據加解密操作,表明該系統是有效的、可行的。