專利名稱:一種數(shù)據(jù)庫密文查詢的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)數(shù)據(jù)庫及信息安全相關(guān)領(lǐng)域。具體涉及對(duì)數(shù)據(jù)庫中的加密字段實(shí)現(xiàn)高效條件查詢的方法。
背景技術(shù):
由于安全性問題的突出,越來越多的數(shù)據(jù)庫對(duì)敏感數(shù)據(jù)進(jìn)行加密以保障其安全性。由于現(xiàn)在數(shù)據(jù)庫管理系統(tǒng)絕大多數(shù)由國外進(jìn)口,但首先國外支持密文查詢的主要數(shù)據(jù)庫管理系統(tǒng)不對(duì)中國出口,且國外的數(shù)據(jù)庫管理系統(tǒng)源代碼多不公開,很可能存在安全后門和漏洞;其次為了提高效率,越來越多的企業(yè)將軟件和數(shù)據(jù)交由專門的機(jī)構(gòu)管理和維護(hù),如果密鑰管理和加解密過程由數(shù)據(jù)庫管理系統(tǒng)實(shí)施則數(shù)據(jù)庫管理方的權(quán)力過大,不利于整個(gè)系統(tǒng)的安全性,所以有必要開發(fā)一種獨(dú)立于數(shù)據(jù)庫管理系統(tǒng)的支持密文查詢的數(shù)據(jù)庫加解密技術(shù),使安全管理和軟件、數(shù)據(jù)的日常維護(hù)優(yōu)化相分離。由于加密之后,數(shù)據(jù)之間原來具有的偏序關(guān)系就會(huì)喪失,因而無法通過建立索引來加快對(duì)密文數(shù)據(jù)的范圍查詢,因而只能對(duì)未加密的字段進(jìn)行范圍查詢,而不能對(duì)加密的字段進(jìn)行范圍查詢。這極大的影響了數(shù)據(jù)庫的效用。為了解決這一問題,現(xiàn)在一般采用同態(tài)加密和密文索引的方法。
同態(tài)加密是通過設(shè)計(jì)新的加密算法,使密文在一定程度上保持原有明文的偏序關(guān)系,使得對(duì)明文中一個(gè)范圍的查詢可以轉(zhuǎn)換為對(duì)密文中若干個(gè)新范圍的查詢,從而可以通過對(duì)密文建立索引和修改查詢的數(shù)據(jù)庫操作語句實(shí)現(xiàn)快速的密文查詢。這種同態(tài)加密其加密強(qiáng)度較弱,易于被攻破;密文索引是指在數(shù)據(jù)庫之外另外建立一個(gè)索引文件記錄密文的偏序關(guān)系,在查詢時(shí),先由相應(yīng)程序檢索該文件,得出滿足條件的密文項(xiàng)集合,再構(gòu)造數(shù)據(jù)庫操作語句從數(shù)據(jù)庫中檢索出含有這些密文項(xiàng)的記錄。這種方法可以采用高加密強(qiáng)度的算法,但是,由于索引文件不是數(shù)據(jù)庫的一部分,數(shù)據(jù)庫管理系統(tǒng)無法對(duì)它實(shí)行并發(fā)控制和故障恢復(fù),因而無法保證數(shù)據(jù)庫與索引文件之間的一致性,且無法充分利用原數(shù)據(jù)庫管理系統(tǒng)的查詢優(yōu)化機(jī)制,查詢效率較低,且當(dāng)實(shí)現(xiàn)涉及密文字段的范圍查詢的復(fù)合條件查詢時(shí)功能和效率受到較大影響。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種數(shù)據(jù)庫密文查詢的方法,使得原有的不支持密文查詢的數(shù)據(jù)庫系統(tǒng)能對(duì)加密字段進(jìn)行高效范圍和等值查詢,且可以由用戶任意選用加密算法和密鑰,且可以充分利用原有數(shù)據(jù)庫系統(tǒng)的事務(wù)機(jī)制來保證整個(gè)數(shù)據(jù)庫的一致性,保證密文檢索結(jié)果和其它數(shù)據(jù)庫操作的正確性、完整性,并且在實(shí)現(xiàn)涉及密文字段的范圍查詢的復(fù)合條件查詢時(shí)功能和效率不受影響。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案如下本發(fā)明提供的是一種利用輔助數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)數(shù)據(jù)庫快速密文查詢的方法,它包括建立輔助數(shù)據(jù)結(jié)構(gòu)、維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)和進(jìn)行密文查詢的步驟,具體如下(1)建立輔助數(shù)據(jù)結(jié)構(gòu)其步驟包括1)確定數(shù)據(jù)庫中的哪些表中的哪些字段需要進(jìn)行密文查詢,2)對(duì)于確定的每一個(gè)這樣的表a中的字段m,建立相應(yīng)的輔助數(shù)據(jù)結(jié)構(gòu),3)對(duì)于所建立的輔助數(shù)據(jù)結(jié)構(gòu),至少在其數(shù)據(jù)量處于峰值時(shí),應(yīng)具有如下特征(a)至少用數(shù)據(jù)庫中的一個(gè)表存儲(chǔ),(b)至少包含兩個(gè)層次,每一層次至少包含一個(gè)塊,塊和層次是通過預(yù)先設(shè)定的特征識(shí)別在一起的對(duì)象或記錄的集合,所有塊中至少有一塊包含數(shù)目不大于一個(gè)預(yù)先設(shè)定的值的索引項(xiàng),索引項(xiàng)存儲(chǔ)在對(duì)象或記錄中,至少有一個(gè)索引項(xiàng)中包含至少一個(gè)密文字段,層次的高低關(guān)系通過預(yù)先設(shè)定的特征加以確定,(c)至少有一對(duì)高低相鄰的兩個(gè)層次,其中較高層中至少存在一個(gè)滿足以下聯(lián)系關(guān)系的索引項(xiàng)它通過它的至少一個(gè)引用類型字段的指向關(guān)系,或通過它的至少一個(gè)字段與低一層次中等值的字段的關(guān)系,與較低層中的至少一個(gè)塊或一個(gè)塊中的索引項(xiàng)相聯(lián)系,(d)在所有的索引項(xiàng)中至少有一個(gè)索引項(xiàng)x,若x是具有特征(c)所述的聯(lián)系關(guān)系的較高層中的索引項(xiàng),則至少對(duì)于一個(gè)其所聯(lián)系的塊或一個(gè)其所聯(lián)系的索引項(xiàng)所在的塊,設(shè)其為y,那么,y中的至少一個(gè)索引項(xiàng)中的至少一個(gè)密文字段的明文,與索引項(xiàng)x中的至少一個(gè)密文字段的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(e)至少對(duì)于一對(duì)在同一層中的索引項(xiàng)z和w,以及z的一個(gè)密文字段j和w的一個(gè)密文字段k,其中z是具有特征(c)所述的聯(lián)系關(guān)系的較高層中的索引項(xiàng),若j和k的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,則至少對(duì)于z所聯(lián)系的一個(gè)塊或一個(gè)其所聯(lián)系的索引項(xiàng)所在的塊u,u中的至少一個(gè)索引項(xiàng)的至少一個(gè)密文字段的明文與密文字段k的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(f)在最后一層中,至少一個(gè)索引項(xiàng)滿足以下聯(lián)系關(guān)系它通過它的至少一個(gè)引用類型字段的指向關(guān)系,或通過它的至少一個(gè)字段與a表中等值的字段的關(guān)系,與a表中的至少一個(gè)記錄或?qū)ο笙嗦?lián)系,(g)至少對(duì)于最后一層中的一個(gè)索引項(xiàng),設(shè)其為v,若v是滿足條件(f)中聯(lián)系關(guān)系的索引項(xiàng),則v的至少一個(gè)密文字段的明文與這些與其相聯(lián)系的記錄中的至少一條記錄的m字段的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(2)維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)其步驟是對(duì)需要實(shí)現(xiàn)密文查詢的字段進(jìn)行修改,包括插入、刪除、更新時(shí),應(yīng)根據(jù)對(duì)數(shù)據(jù)庫的修改要求,通過對(duì)輔助數(shù)據(jù)結(jié)構(gòu)的查詢來確定并執(zhí)行其維護(hù)操作,并利用數(shù)據(jù)庫的事務(wù)管理機(jī)制保證數(shù)據(jù)庫及輔助數(shù)據(jù)結(jié)構(gòu)的一致性、完整性,
(3)進(jìn)行密文查詢進(jìn)行密文查詢時(shí),至少含有如下的步驟至少利用密鑰、檢索要求,輔助數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)及其特征,輔助數(shù)據(jù)結(jié)構(gòu)與表a的關(guān)系,以及數(shù)據(jù)庫管理系統(tǒng)所支持的操作接口,從數(shù)據(jù)庫中檢索出數(shù)據(jù)。
本發(fā)明與現(xiàn)有技術(shù)相比,具有如下顯著技術(shù)效果使得原有的不支持密文查詢的數(shù)據(jù)庫系統(tǒng)能對(duì)加密字段進(jìn)行高效范圍和等值查詢,且可以由用戶任意選用加密算法和密鑰,且可以充分利用原有數(shù)據(jù)庫系統(tǒng)的事務(wù)機(jī)制來保證整個(gè)數(shù)據(jù)庫的一致性,保證密文檢索結(jié)果和其它數(shù)據(jù)庫操作的正確性、完整性,并且在實(shí)現(xiàn)涉及密文字段的范圍查詢的復(fù)合條件查詢時(shí)功能和效率不受影響。
本發(fā)明可用于對(duì)安全性要求較高的政府、軍隊(duì)和大型企業(yè)的數(shù)據(jù)庫系統(tǒng),能改善系統(tǒng)的安全性能,提高系統(tǒng)的實(shí)用性。
附圖展示了中間件在整個(gè)數(shù)據(jù)庫系統(tǒng)中的位置。
本圖只注明了ODBC,實(shí)際可為ODBC、JDBC、OLE DB等多種形式。
具體實(shí)施例方式
本發(fā)明提供的是一種利用輔助數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)數(shù)據(jù)庫快速密文查詢的方法,其要點(diǎn)是通過為欲實(shí)現(xiàn)密文查詢的字段建立用數(shù)據(jù)庫中的表存儲(chǔ)的輔助的數(shù)據(jù)結(jié)構(gòu),在數(shù)據(jù)庫的日常操作中插入對(duì)輔助數(shù)據(jù)結(jié)構(gòu)的維護(hù)操作,并利用輔助數(shù)據(jù)結(jié)構(gòu)來查詢密文字段。
本方法包括建立輔助數(shù)據(jù)結(jié)構(gòu)、維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)和進(jìn)行密文查詢的步驟,具體如下一.建立輔助數(shù)據(jù)結(jié)構(gòu)其步驟包括1.確定數(shù)據(jù)庫中的哪些表中的哪些字段需要進(jìn)行密文查詢,2.對(duì)于確定的每一個(gè)這樣的表a中的字段m,建立相應(yīng)的輔助數(shù)據(jù)結(jié)構(gòu),3.對(duì)于所建立的輔助數(shù)據(jù)結(jié)構(gòu),至少在其數(shù)據(jù)量處于峰值時(shí),應(yīng)具有如下特征(a)至少用數(shù)據(jù)庫中的一個(gè)表存儲(chǔ),(b)至少包含兩個(gè)層次,每一層次至少包含一個(gè)塊,塊和層次是通過預(yù)先設(shè)定的特征識(shí)別在一起的對(duì)象或記錄的集合,所有塊中至少有一塊包含數(shù)目不大于一個(gè)預(yù)先設(shè)定的值的索引項(xiàng),索引項(xiàng)存儲(chǔ)在對(duì)象或記錄中,至少有一個(gè)索引項(xiàng)中包含至少一個(gè)密文字段,層次的高低關(guān)系通過預(yù)先設(shè)定的特征加以確定,(c)至少有一對(duì)高低相鄰的兩個(gè)層次,其中較高層中至少存在一個(gè)滿足以下聯(lián)系關(guān)系的索引項(xiàng)它通過它的至少一個(gè)引用類型字段的指向關(guān)系,或通過它的至少一個(gè)字段與低一層次中等值的字段的關(guān)系,與較低層中的至少一個(gè)塊或一個(gè)塊中的索引項(xiàng)相聯(lián)系,(d)在所有的索引項(xiàng)中至少有一個(gè)索引項(xiàng)x,若x是具有特征(c)所述的聯(lián)系關(guān)系的較高層中的索引項(xiàng),則至少對(duì)于一個(gè)其所聯(lián)系的塊或一個(gè)其所聯(lián)系的索引項(xiàng)所在的塊,設(shè)其為y,那么,y中的至少一個(gè)索引項(xiàng)中的至少一個(gè)密文字段的明文,與索引項(xiàng)x中的至少一個(gè)密文字段的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(e)至少對(duì)于一對(duì)在同一層中的索引項(xiàng)z和w,以及z的一個(gè)密文字段j和w的一個(gè)密文字段k,其中z是具有特征(c)所述的聯(lián)系關(guān)系的較高層中的索引項(xiàng),若j和k的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,則至少對(duì)于z所聯(lián)系的一個(gè)塊或一個(gè)其所聯(lián)系的索引項(xiàng)所在的塊u,u中的至少一個(gè)索引項(xiàng)的至少一個(gè)密文字段的明文與密文字段k的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(f)在最后一層中,至少一個(gè)索引項(xiàng)滿足以下聯(lián)系關(guān)系它通過它的至少一個(gè)引用類型字段的指向關(guān)系,或通過它的至少一個(gè)字段與a表中等值的字段的關(guān)系,與a表中的至少一個(gè)記錄或?qū)ο笙嗦?lián)系,(g)至少對(duì)于最后一層中的一個(gè)索引項(xiàng),設(shè)其為v,若v是滿足條件(f)中聯(lián)系關(guān)系的索引項(xiàng),則v的至少一個(gè)密文字段的明文與這些與其相聯(lián)系的記錄中的至少一條記錄的m字段的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,在完成建立上述輔助數(shù)據(jù)結(jié)構(gòu)后,應(yīng)在輔助數(shù)據(jù)結(jié)構(gòu)的至少一個(gè)表上建立聚集索引。
輔助數(shù)據(jù)結(jié)構(gòu)和對(duì)應(yīng)欲實(shí)施密文查詢的表是建立在同一個(gè)數(shù)據(jù)庫中。
二.維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)其步驟是對(duì)需要實(shí)現(xiàn)密文查詢的字段進(jìn)行修改,包括插入、刪除、更新時(shí),應(yīng)根據(jù)對(duì)數(shù)據(jù)庫的修改要求,通過對(duì)輔助數(shù)據(jù)結(jié)構(gòu)的查詢來確定并執(zhí)行其維護(hù)操作,并利用數(shù)據(jù)庫的事務(wù)管理機(jī)制保證數(shù)據(jù)庫及輔助數(shù)據(jù)結(jié)構(gòu)的一致性、完整性。
在維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)的步驟中可以使用存儲(chǔ)過程。在存儲(chǔ)過程中至少傳遞一個(gè)函數(shù)值作為參數(shù),這個(gè)函數(shù)值可根據(jù)用戶傳遞的一個(gè)數(shù)的明文的至少一位計(jì)算而得。
在進(jìn)行輔助數(shù)據(jù)結(jié)構(gòu)的維護(hù)時(shí),可以使用介于數(shù)據(jù)庫管理系統(tǒng)和用戶之間的中間件。其至少包括如下步驟(1)攔截用戶的數(shù)據(jù)庫修改請(qǐng)求,(2)分析該數(shù)據(jù)庫修改請(qǐng)求,(3)若數(shù)據(jù)庫修改請(qǐng)求涉及對(duì)密文字段預(yù)先設(shè)定的修改,則從數(shù)據(jù)庫中進(jìn)行至少一次檢索輔助數(shù)據(jù)結(jié)構(gòu)的操作并對(duì)操作結(jié)果進(jìn)行分析,(4)至少根據(jù)第3步的結(jié)果及用戶的數(shù)據(jù)庫修改請(qǐng)求對(duì)輔助數(shù)據(jù)結(jié)構(gòu)進(jìn)行維護(hù)。
上述數(shù)據(jù)庫操作是和用戶的數(shù)據(jù)庫修改操作設(shè)置在一個(gè)數(shù)據(jù)庫事務(wù)中。
三.進(jìn)行密文查詢進(jìn)行密文查詢時(shí),至少含有如下的步驟至少利用密鑰、檢索要求,輔助數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)及其特征,輔助數(shù)據(jù)結(jié)構(gòu)與表a的關(guān)系,以及數(shù)據(jù)庫管理系統(tǒng)所支持的操作接口,從數(shù)據(jù)庫中檢索出數(shù)據(jù)。
在進(jìn)行密文查詢的步驟中可以使用存儲(chǔ)過程。在存儲(chǔ)過程中至少傳遞一個(gè)函數(shù)值作為參數(shù),這個(gè)函數(shù)值可根據(jù)用戶傳遞的一個(gè)數(shù)的明文的至少一位計(jì)算而得。
在進(jìn)行密文查詢時(shí),可以使用介于數(shù)據(jù)庫管理系統(tǒng)和用戶之間的中間件。其至少包括如下步驟
(1)攔截用戶的數(shù)據(jù)庫查詢請(qǐng)求,(2)分析該數(shù)據(jù)庫查詢請(qǐng)求,(3)若該數(shù)據(jù)庫查詢請(qǐng)求涉及對(duì)密文字段預(yù)先設(shè)定的查詢,則從數(shù)據(jù)庫中進(jìn)行至少一次查詢輔助數(shù)據(jù)結(jié)構(gòu)的操作并對(duì)操作結(jié)果進(jìn)行分析,并執(zhí)行步驟(4),(4)至少根據(jù)第3步的結(jié)果重構(gòu)并執(zhí)行用戶的數(shù)據(jù)庫查詢請(qǐng)求。
上述數(shù)據(jù)庫查詢操作是在一個(gè)數(shù)據(jù)庫事務(wù)中。
四.具體實(shí)施例(一)輔助數(shù)據(jù)結(jié)構(gòu)的建立與維護(hù)對(duì)數(shù)據(jù)庫中要實(shí)現(xiàn)密文條件查詢(包括等值條件查詢和范圍條件查詢)的每一個(gè)表a中的密文字段m,在同一個(gè)數(shù)據(jù)庫中建立一個(gè)能用原有的數(shù)據(jù)庫管理系統(tǒng)支持的數(shù)庫操作語句維護(hù)和訪問的表,以存儲(chǔ)用來加快查詢速度的輔助數(shù)據(jù)結(jié)構(gòu),同時(shí),由中間件軟件攔截客戶發(fā)往數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)庫操作語句,對(duì)其中涉及到表a中的字段m的語句加以處理,以維護(hù)該輔助數(shù)據(jù)結(jié)構(gòu),并實(shí)現(xiàn)對(duì)加密字段的高效范圍和等值查詢。下文中提到的所有數(shù),如非特別注明,均指以二進(jìn)制形式表示。明文如非特別說明,均指對(duì)應(yīng)密文項(xiàng)解密后再去掉填充比特所得的有意義的實(shí)際值。對(duì)所有的eb項(xiàng)的明文,填充比特的最后1位恒置為0,加密所需的明文填充位序列去掉最后1位后視為無符號(hào)整數(shù),eb項(xiàng)的填充位的比較、設(shè)置及加1操作等均指對(duì)此無符號(hào)整數(shù)進(jìn)行,er、el、ep的填充位則無此關(guān)于最后1位的約定。且設(shè)填充位設(shè)置足夠長,不可能循環(huán)。eb、et、er、el、ep等密文項(xiàng)的對(duì)應(yīng)明文的有效位數(shù)相等,填充位的長度亦相等。密文項(xiàng)的比較如非另外注明,均指比較其明文的大小,如明文相等則比較其填充位的大小。密文的大小如非另外注明,也是指其明文和填充位整數(shù)如此組合的大小。密文字段m的明文假設(shè)為無符號(hào)整型。
1.輔助數(shù)據(jù)結(jié)構(gòu)的形式輔助數(shù)據(jù)結(jié)構(gòu)1它是關(guān)系型數(shù)據(jù)庫中的輔助數(shù)據(jù)結(jié)構(gòu),其特征如下該數(shù)據(jù)結(jié)構(gòu)由至少兩“層”構(gòu)成,每一“層”由至少一個(gè)“塊”組成,其中,第一層(層號(hào)為最小的一層)僅由一個(gè)塊構(gòu)成,稱其為“根塊”。每個(gè)“塊”由若干條“索引項(xiàng)”組成,每個(gè)塊的索引項(xiàng)條數(shù)均不多于一個(gè)常數(shù)t,亦不少于[t/2];若一個(gè)塊沒有父塊或其父塊沒有其它子塊,則該塊的索引項(xiàng)條數(shù)亦可少于[t/2]。其中,t為一個(gè)常數(shù),由索引項(xiàng)的大小和相應(yīng)數(shù)據(jù)庫的物理塊的大小決定,以使一個(gè)“塊”的大小的最大值略小于數(shù)據(jù)庫的物理塊的大小,一般t設(shè)在100~200之間。所有的索引項(xiàng)都表示為關(guān)系x中的一條記錄。關(guān)系x的每一個(gè)記錄r由以下四個(gè)字段構(gòu)成et,eb,ord1,ord2;其中,et、eb和a表中密文字段m的類型相同,一般為BINARY或VARBINARY,且都是以密文形式存儲(chǔ)在數(shù)據(jù)庫中;同一層中的eb值互不相同,但卻允許有若干項(xiàng)eb值對(duì)應(yīng)的明文相同這是通過對(duì)相同的明文值填充不同的比特序列,再加密來實(shí)現(xiàn)的。ord1表明該記錄所在的塊在輔助數(shù)據(jù)結(jié)構(gòu)中所屬的層的層號(hào);對(duì)于ord2,必須滿足以下條件其大小在同塊中的排序(升序)的序號(hào),等于該記錄的eb項(xiàng)的大小在同塊中的排序(升序)的序號(hào),且同一塊中各記錄的ord2值互不相等。同一個(gè)“塊”中的所有記錄的et項(xiàng)具有相同的值,且其等于該“塊”中的所有記錄的eb項(xiàng)中的最小值。同一層中的任兩個(gè)塊其et值互不相等。除ord1值(即“層”號(hào))最小的一層外,其它每一層中的每一個(gè)“塊”中的所有記錄的et值,都和“層”號(hào)比它所在的層的層號(hào)小1的“層”中的某一條記錄的eb值相等,且只和其中的一條的eb值相等;反之,除ord1值最大的一層外,每一層中的每一條記錄的eb項(xiàng)的值,都與“層”號(hào)比它所在的層的層號(hào)大1的“層”中的一個(gè)“塊”中的所有記錄的et值相等。除一開始初始化的一條其eb值為最小的記錄的eb值外,最后一層中的eb項(xiàng)的值與表a中的m字段的值一一對(duì)應(yīng)。對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)中的一個(gè)記錄n,若其eb字段值與一個(gè)“層”號(hào)比它所在層號(hào)大1的“塊”d的et值相等,則記錄n稱為該塊d的父記錄,記錄n所在的塊稱為該塊d的父塊,而該塊d稱為該記錄n及其所在的塊的子塊,子塊中的所有記錄都稱為父記錄的子記錄。對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)中的一個(gè)記錄L,與L同一塊,且其ord2值大于L記錄的ord2值的記錄中ord2值最小的記錄與L互稱為兄弟記錄;與L同一塊,且其ord2值小于L記錄的ord2值的記錄中ord2值最大的記錄亦與L互稱為兄弟記錄。兄弟記錄的子塊彼此稱為兄弟塊。能通過某個(gè)記錄p一次或多次迭代求子記錄而找到的所有記錄稱為記錄p的子孫記錄,p的子孫記錄所在的塊稱為p及其所在塊的子孫塊。能由p通過一次或多次迭代求父記錄而找到的記錄稱為p的祖先記錄,p的祖先記錄所在的塊稱為p及其所在塊的祖先塊。如果一個(gè)記錄s的eb字段的值小于與它同屬一“層”的記錄k的eb字段的值,那么s的所有子孫記錄的eb字段的值亦小于記錄k的eb字段的值。同一層次中所有的記錄的eb值彼此間均不相等,但卻允許有若干條記錄的eb字段所對(duì)應(yīng)的不包含填充位的明文相同,這可以通過對(duì)相同的明文值在其后填充不同的比特序列后再加密來實(shí)現(xiàn)。建立了該輔助數(shù)據(jù)結(jié)構(gòu)之后,還要在關(guān)系x的屬性組(ord1,et,ord2)上建立聚集索引,以使同屬一個(gè)“塊”的記錄在物理存儲(chǔ)時(shí)也盡量存儲(chǔ)在同一個(gè)物理塊中,并加快對(duì)輔助數(shù)據(jù)結(jié)構(gòu)訪問和維護(hù)的速度。此外,還要在關(guān)系a的以密文形式存儲(chǔ)的屬性m上建立索引,索引可為聚集或非聚集的。
輔助數(shù)據(jù)結(jié)構(gòu)2它是輔助數(shù)據(jù)結(jié)構(gòu)1的一種變形。它可以顯著減少中間件和數(shù)據(jù)庫服務(wù)器之間在查詢和修改密文字段時(shí)的通信次數(shù)和通信量,但其安全性不及輔助數(shù)據(jù)結(jié)構(gòu)1。
在輔助數(shù)據(jù)結(jié)構(gòu)1的基礎(chǔ)上,它在每個(gè)記錄(索引項(xiàng))中又增加三個(gè)字段el、er和ep。對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)中的一條記錄bn,設(shè)ord2值比bn的ord2值小的bn的兄弟記錄為bns,設(shè)bn的eb項(xiàng)的明文與bns的eb項(xiàng)的明文從最高有效位算起的最長公共前綴的長度為kb1位(空公共前綴的長度為0),則bn的el項(xiàng)的值是取該記錄的eb項(xiàng)的明文(包括填充位)從最高有效位算起的前kb1+1位并第在kb1+2位置1,其余位填0,然后再加密所得的密文;若bns不存在,則bn的el項(xiàng)為空;設(shè)ord2值比bn的ord2值大的bn的兄弟記錄為bnb(若bn不存在這種兄弟記錄,則取它的父記錄所在的塊中ord2值比它父記錄的ord2值大的父記錄的兄弟記錄為bnb,以此類推,不斷上溯,如果一直到它在最項(xiàng)層的祖先記錄,若該祖先仍無這樣的兄弟記錄,則不存在bnb記錄,則bn的er項(xiàng)設(shè)為空值),若記錄bn的eb項(xiàng)與bnb的eb項(xiàng)的明文(包括填充位)從最高有效位算起的最長公共前綴長度為kb2位,則bn的el項(xiàng)的值是取該記錄bn的eb項(xiàng)的明文(包括填充位)從最高有效位算起的前kb2+1位,并第在kb2+2位置1,其余位填0,然后再加密所得的密文。bn的ep項(xiàng)僅在bn為同塊中ord2值最大的記錄時(shí)才有意義,設(shè)bn的父記錄bnf的ord2值較bnf的ord2值大的兄弟記錄為bb,如果其父記錄不存在這樣的兄弟記錄,則設(shè)它的父記錄的父記錄bnf2的ord2值較bnf2的ord2大的兄弟記錄為bb,以此類推。如果一直追溯到它在ord1值最小的層中的祖先,該祖先仍無這樣的兄弟記錄,則bn的ep項(xiàng)無意義,為空值。設(shè)bn與bb的eb項(xiàng)的明文(包括填充位)從最高有效位算起的最長公共前綴長度為kb3位,則bn的ep項(xiàng)的值為bb的eb項(xiàng)的明文(包括填充位)從最高有效位算起的前kb3+1位并在第kb3+2位置1,其余位填0,然后再加密所得的密文。該輔助數(shù)據(jù)結(jié)構(gòu)的其它特征、以及索引的建立與輔助數(shù)據(jù)結(jié)構(gòu)1完全相同。
在輔助數(shù)據(jù)結(jié)構(gòu)1和2中,兄弟記錄是同層相鄰兄弟記錄;如果兩個(gè)記錄aa和bb在同一層,且aa是它所在的塊中ord2值最大的記錄,bb是它所在的塊中ord2值最小的記錄,且aa的某個(gè)祖先記錄aac與bb的某個(gè)祖先記錄bbc是同一塊中的兄弟記錄,且aa的所有所在層次低于aac所在層次(層號(hào)大于aac的層號(hào))的祖先記錄(如果沒有這樣的祖先記錄則無此項(xiàng)要求)均為所在塊中ord2值最大的記錄,bb的所有所在層次低于bbc所在層次(層號(hào)大于bbc的層號(hào))的祖先記錄(如果沒有這樣的祖先記錄則無此項(xiàng)要求)均為所在塊中ord2值最小的記錄,且bbc的ord2值比aac的ord2值大,則aa和bb亦互為同層相鄰兄弟記錄。
輔助數(shù)據(jù)結(jié)構(gòu)3它是輔助數(shù)據(jù)結(jié)構(gòu)1的另一種變形,比輔助數(shù)據(jù)結(jié)構(gòu)1和2更為高效,適用于對(duì)象—關(guān)系型數(shù)據(jù)庫。其特征如下使用這種輔助數(shù)據(jù)結(jié)構(gòu)時(shí)將含有加密字段m的表a設(shè)計(jì)為一個(gè)僅含有一個(gè)屬性列的表,該屬性列的類型為對(duì)象或結(jié)構(gòu)類型a,原表a的所有屬性變?yōu)樵搶?duì)象的屬性。對(duì)應(yīng)的輔助數(shù)據(jù)結(jié)構(gòu)亦由數(shù)據(jù)庫中的一個(gè)關(guān)系x存儲(chǔ),該關(guān)系的屬性列僅有一個(gè),類型為對(duì)象或結(jié)構(gòu)類型x。它由至少二“層”構(gòu)成,每一“層”包括至少一個(gè)類型為x的對(duì)象(或結(jié)構(gòu),下同)記錄,其中,第一層(層號(hào)最小的一層)僅有一個(gè)對(duì)象,稱為根對(duì)象。每個(gè)對(duì)象由以下屬性構(gòu)成一個(gè)用來記錄該對(duì)象所在的“層”的層號(hào)的屬性ord1,一個(gè)結(jié)構(gòu)類型j的數(shù)組j-array,一個(gè)用來記錄結(jié)構(gòu)類型j的數(shù)組的有效長度(數(shù)組的元素?cái)?shù)量)的字段num;結(jié)構(gòu)類型j由以下屬性構(gòu)成一個(gè)和m類型相同的密文屬性eb,一個(gè)指向類型為x的對(duì)象的引用類型ref(如果是最后一層則為指向a對(duì)象的引用類型),一個(gè)ord2字段,其值在整個(gè)數(shù)組中的ord2值中的排序(升序)應(yīng)等于相應(yīng)j類結(jié)構(gòu)在數(shù)組中的位置,等于相應(yīng)j類結(jié)構(gòu)的eb項(xiàng)的大小在整個(gè)數(shù)組元素中的排序(升序),j類結(jié)構(gòu)數(shù)組按其eb項(xiàng)明文值依次遞增排列,同一對(duì)象中ord2值不重復(fù)。num的值不大于一個(gè)常數(shù)t,亦不小于[t/2],但是,若一個(gè)對(duì)象沒有父對(duì)象或其父對(duì)象沒有其它子對(duì)象,則其num值亦可小于[t/2]。t是一個(gè)常數(shù),由j類結(jié)構(gòu)的長度和和相應(yīng)數(shù)據(jù)庫的物理塊的大小決定,以使一個(gè)對(duì)象的大小的最大值略小于數(shù)據(jù)庫的物理塊的大小。一般t設(shè)在100~200之間。除“層”號(hào)最大的一層外,所有的ref都指向一個(gè)“層”號(hào)比它自身所在的對(duì)象大1的x類對(duì)象。層號(hào)為最大的一層的x對(duì)象的每一個(gè)j結(jié)構(gòu)的ref指向一個(gè)表a中的a類對(duì)像,除層號(hào)最小的一層外表x中的每一個(gè)x類對(duì)象g都被x表中層號(hào)比之小1的某個(gè)對(duì)象d的某個(gè)j結(jié)構(gòu)的ref屬性指向,且僅被一個(gè)這樣的ref指向。除層號(hào)最大的一層的對(duì)象外,任何x類對(duì)象的任一j類型結(jié)構(gòu)的eb屬性都等于該j類結(jié)構(gòu)的ref所指向的x類對(duì)象的所有j類型結(jié)構(gòu)的eb屬性中的最小值,該最小值是j類結(jié)構(gòu)數(shù)組中最左邊的j類結(jié)構(gòu)的eb值。把一個(gè)對(duì)象的任一j類型結(jié)構(gòu)的ref屬性所指向的x類對(duì)象稱為該對(duì)象和該j類結(jié)構(gòu)的子對(duì)象。對(duì)于一個(gè)j類結(jié)構(gòu)p,若它的ref屬性指向一個(gè)x類對(duì)象o,則p稱為該對(duì)象o的父j類結(jié)構(gòu),p所在的x類對(duì)象稱為o的父對(duì)象??捎梢粋€(gè)對(duì)象或一個(gè)j類結(jié)構(gòu)通過一次或多次求子對(duì)象到達(dá)的對(duì)象稱為該對(duì)象或該j類結(jié)構(gòu)的子孫對(duì)象,子孫對(duì)象的j類結(jié)構(gòu)稱為子孫j類結(jié)構(gòu);可由一個(gè)對(duì)象或一個(gè)j類結(jié)構(gòu)通過一次或多次求父對(duì)象和父j類結(jié)構(gòu)到達(dá)的對(duì)象或j類結(jié)構(gòu),稱為該對(duì)象或該j類結(jié)構(gòu)的祖先對(duì)象或祖先j類結(jié)構(gòu)。若一個(gè)對(duì)象的某個(gè)j類結(jié)構(gòu)屬性的eb屬性小于某個(gè)和它同屬一層的某個(gè)x類對(duì)象的某個(gè)j類結(jié)構(gòu)屬性的eb屬性li,則該j類結(jié)構(gòu)的子孫對(duì)象的所有j類結(jié)構(gòu)的eb屬性均小于li。層號(hào)最大的一層的x類對(duì)象中所包含的eb項(xiàng),除一條一開始初始化的其eb值取最小的j類結(jié)構(gòu)的eb項(xiàng)外,其它值與表a中的記錄的m屬性的值一一對(duì)應(yīng)相等,其所在j類結(jié)構(gòu)ref屬性也相應(yīng)指向?qū)?yīng)的m屬性所在的x表中的記錄。一個(gè)j類結(jié)構(gòu)數(shù)組中彼此相鄰的j類結(jié)構(gòu)互稱為兄弟j類結(jié)構(gòu)。任一層的所有x類對(duì)象所包含的所有eb值彼此兩兩不相等,但卻允許有若干eb值所對(duì)應(yīng)的明文(不包含填充位)相等,這可以通過對(duì)相同的明文值在其后填充不同的比特序列后再加密來實(shí)現(xiàn)。該輔助數(shù)據(jù)結(jié)構(gòu)需要在該對(duì)象的ord1屬性上建立索引,或者用一個(gè)專門的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)層號(hào)最小的那個(gè)對(duì)象的引用。對(duì)于a表也在其屬性m上建立索引。
輔助數(shù)據(jù)結(jié)構(gòu)4它是數(shù)據(jù)結(jié)構(gòu)2的變形,適用于對(duì)象—關(guān)系型數(shù)據(jù)庫。其特征如下它是通過在數(shù)據(jù)結(jié)構(gòu)2的基礎(chǔ)上,在每個(gè)對(duì)象的每個(gè)j類結(jié)構(gòu)添加er和el、ep三個(gè)加密字段來實(shí)現(xiàn)。對(duì)于一個(gè)j類結(jié)構(gòu)bn,設(shè)eb值比bn的eb值小的bn的兄弟j類結(jié)構(gòu)為bns,bn的eb項(xiàng)的明文(包括填充位)與bns的eb項(xiàng)的明文(包括填充位)從最高有效位算起的最長公共前綴長為kb1位,則bn的el項(xiàng)的值是取bn的eb項(xiàng)的明文(包括填充位)從最高有效位算起的前kb1+1位并第在kb1+2位置1,其余位填0,然后再加密所得的密文;若bns不存在,則bn的el值為空;設(shè)eb值比bn的eb值大的bn的兄弟j類結(jié)構(gòu)(若不存在這種j類結(jié)構(gòu),則取它的父j類結(jié)構(gòu)所在的對(duì)象中eb值比它父j類結(jié)構(gòu)的eb值大的父j類結(jié)構(gòu)的兄弟j類結(jié)構(gòu),以此類推,不斷上溯,如果一直到它在最頂層的祖先j類結(jié)構(gòu),若該祖先仍無這樣的兄弟j類結(jié)構(gòu),則bn的er項(xiàng)設(shè)為空值)為bnb,bn的eb項(xiàng)的明文(包括填充位)與bnb的eb項(xiàng)的明文(包括填充位)從最高有效位算起的最長公共前綴長度為kb2位,則bn的er項(xiàng)的值是取bn的eb項(xiàng)的明文(包括填充位)從最高有效位算起的前kb2+1位并在第kb2+2位置1,其余位位填0,然后再加密所得的密文。bn的ep項(xiàng)僅在bn為同對(duì)象中eb值最大的j類結(jié)構(gòu)時(shí)才有意義,設(shè)bn的父j類結(jié)構(gòu)為bnf,eb值比bnf的eb值大的bnf兄弟j類結(jié)構(gòu)為bb(如果bnf不存在這樣的兄弟j類結(jié)構(gòu),則設(shè)bnf的相應(yīng)的兄弟j類結(jié)構(gòu)為bb,以此類推。如果一直追溯到它在最高層中的祖先,該祖先仍無這樣的兄弟j類結(jié)構(gòu),則ep項(xiàng)無意義,為空值),設(shè)bn與bb的eb項(xiàng)的明文(包括填充位)從最高有效位算起的最長公共前綴長度為kb3位,則bn的ep項(xiàng)的值為bb的eb項(xiàng)的明文(包括填充位)從最高有效位算起的前kb3+1位并第在kb3+2位置1,其余位填0,然后再加密所得的密文。該輔助數(shù)據(jù)結(jié)構(gòu)的其它特征,索引的建立與輔助數(shù)據(jù)結(jié)構(gòu)3完全相同。
在輔助數(shù)據(jù)結(jié)構(gòu)3、4中,兄弟j類結(jié)構(gòu)是同層相鄰兄弟j類結(jié)構(gòu);如果兩個(gè)j類結(jié)構(gòu)aa和bb在同一層,且aa是它所在的對(duì)象中eb值最大的j類結(jié)構(gòu),bb是它所在的對(duì)象中eb值最小的j類結(jié)構(gòu),且aa的某個(gè)祖先j類結(jié)構(gòu)aac與bb的某個(gè)祖先j類結(jié)構(gòu)bbc是同一對(duì)象中的兄弟j類結(jié)構(gòu),且aa的所有所在層次低于aac所在層次(層號(hào)大于aac的層號(hào))的祖先j類結(jié)構(gòu)(如果沒有這樣的祖先j類結(jié)構(gòu)則無此項(xiàng)要求)均為所在對(duì)象中eb值最大的j類結(jié)構(gòu),bb的所有所在層次低于bbc所在層次(層號(hào)大于bbc的層號(hào))的祖先j類結(jié)構(gòu)(如果沒有這樣的祖先j類結(jié)構(gòu)則無此項(xiàng)要求)均為所在對(duì)象中eb值最小的j類結(jié)構(gòu),且bbc的eb值比aac的eb值大,則aa和bb亦互為同層相鄰兄弟j類結(jié)構(gòu)。
2.輔助數(shù)據(jù)結(jié)構(gòu)的初始化(1)對(duì)數(shù)據(jù)庫中要實(shí)現(xiàn)密文條件查詢,包括等值條件查詢和范圍條件查詢的每一個(gè)表a中的密文字段m,在同一個(gè)數(shù)據(jù)庫中建立一個(gè)可用普通SQL語句維護(hù)和訪問的關(guān)系x,以存儲(chǔ)用來加快查詢速度的輔助數(shù)據(jù)結(jié)構(gòu)。對(duì)于關(guān)系型數(shù)據(jù)庫,該表可由以下字段組成ord1,ord2,et,eb,el(可選),er(可選),ep(可選);對(duì)于對(duì)象—關(guān)系型數(shù)據(jù)庫,該表可由一個(gè)對(duì)象類型x組成,該對(duì)象類型包含一個(gè)屬性ord1,一個(gè)屬性num,一個(gè)j類結(jié)構(gòu)的數(shù)組j-array,j類結(jié)構(gòu)包含一個(gè)屬性eb和一個(gè)引用類型屬性ref,一個(gè)屬性ord2,一個(gè)屬性er(可選),一個(gè)屬性el(可選),一個(gè)屬性ep(可選)。
(2)對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)1和2,先根據(jù)表a的可能的大小和t值的大小選擇該輔助數(shù)據(jù)結(jié)構(gòu)的層次數(shù)s。選擇的標(biāo)準(zhǔn)應(yīng)使按上述輔助數(shù)據(jù)結(jié)構(gòu)的特征使得最后一層的最小可能容量(記錄數(shù))大于表a的最大可能記錄數(shù)的兩到三倍。一般選擇5~6層即可,除非表a的記錄數(shù)可能特別巨大,如超過10億條。然后,在每一層插入一條記錄,這些記錄的et和eb值均等于用明文所能取得的最小值和整數(shù)1填充值聯(lián)接后再加密的值。這些記錄的ord2字段設(shè)為1,ord1設(shè)為相應(yīng)的層號(hào),其它字段設(shè)為空值。對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)3和4,一開始時(shí)先根據(jù)表a的可能的大小和t值的大小選擇該輔助數(shù)據(jù)結(jié)構(gòu)的層次數(shù)m。選擇的標(biāo)準(zhǔn)應(yīng)使按上述輔助數(shù)據(jù)結(jié)構(gòu)的特征使得最后一層的最小可能容量(j類結(jié)構(gòu)總數(shù))大于表a的最大可能記錄數(shù)的兩到三倍。一般選擇5~6層即可,除非表a的記錄數(shù)可能特別巨大,如超過10億條。然后在每一層插入一個(gè)對(duì)象,這些對(duì)象的ord1值為其所在的層的層號(hào),num值為1,j類結(jié)構(gòu)1項(xiàng),其j類結(jié)構(gòu)的ord2值設(shè)為1,其eb值均設(shè)為用明文所能取得的最小值和整數(shù)1填充值聯(lián)接后再加密的值,其ref值指向他的下一層的那個(gè)對(duì)象,最后一層的那個(gè)對(duì)象的j類結(jié)構(gòu)的ref字段為空,這些對(duì)象的其它屬性均設(shè)為空。
3.輔助數(shù)據(jù)結(jié)構(gòu)的維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)的維護(hù)通過中間件實(shí)現(xiàn)。
(1)中間件它在整個(gè)數(shù)據(jù)庫系統(tǒng)中的位置如附圖所示。它處在數(shù)據(jù)庫應(yīng)用程序與數(shù)據(jù)庫管理系統(tǒng)之間,可以安裝在數(shù)據(jù)庫客戶端或應(yīng)用服務(wù)器端,也可以安裝在數(shù)據(jù)庫服務(wù)器端,還可以安裝在介于數(shù)據(jù)庫客戶端(或應(yīng)用服務(wù)器端)與服務(wù)器端之間的專門的安全服務(wù)器上。一般為了更好的安全性,應(yīng)該安裝于專門的安全服務(wù)器上,以使數(shù)據(jù)庫的維護(hù)與安全管理相分離,同時(shí)使數(shù)據(jù)庫的加密密鑰獨(dú)立于用戶的密鑰,并減輕數(shù)據(jù)庫服務(wù)器的計(jì)算負(fù)擔(dān)。這種體系結(jié)構(gòu)處理最復(fù)雜。下文以這種體系結(jié)構(gòu)為基礎(chǔ)進(jìn)行說明。由于基本原理相同,這種體系結(jié)構(gòu)可以很容易的改造成其它兩種體系結(jié)構(gòu)。
中間件要求數(shù)據(jù)庫客戶端通過ODBC、JDBC、OLE DB等標(biāo)準(zhǔn)接口訪問數(shù)據(jù)庫。它同時(shí)要求在數(shù)據(jù)庫客戶端安裝一個(gè)中間件客戶端。該中間件客戶端包含一個(gè)身份認(rèn)證和密鑰協(xié)商模塊以及一個(gè)針對(duì)ODBC等標(biāo)準(zhǔn)接口的虛擬的數(shù)據(jù)庫管理系統(tǒng)驅(qū)動(dòng)程序。當(dāng)數(shù)據(jù)庫應(yīng)用程序需要訪問數(shù)據(jù)庫時(shí),先通過中間件客戶端中虛擬的數(shù)據(jù)庫管理系統(tǒng)驅(qū)動(dòng)程序及中間件和數(shù)據(jù)庫建立連接,再由中間件客戶端與遠(yuǎn)程的安全服務(wù)器上的中間件進(jìn)行身份認(rèn)證和密鑰協(xié)商,再由用戶發(fā)起一個(gè)對(duì)數(shù)據(jù)庫中一個(gè)虛擬表的讀操作,這個(gè)表在數(shù)據(jù)庫中可以并不實(shí)際存在,中間件客戶端通過這次虛擬的數(shù)據(jù)庫讀操作而將協(xié)商得的密鑰返回給應(yīng)用程序。同時(shí),在遠(yuǎn)程的中間件亦會(huì)將該密鑰與與該用戶中間件客戶端通信的socket號(hào)捆綁起來加以記錄,存儲(chǔ)在協(xié)商密鑰通信表中。然后用戶的數(shù)據(jù)庫應(yīng)用程序,通過ODBC等標(biāo)準(zhǔn)接口向虛擬的數(shù)據(jù)庫管理系統(tǒng)的驅(qū)動(dòng)程序(中間件客戶端)提交標(biāo)準(zhǔn)函數(shù)、數(shù)據(jù)和用SQL語句等表達(dá)的對(duì)數(shù)據(jù)庫的操作,其中的密文字段的值用此前協(xié)商的密鑰加密,這些函數(shù)和SQL語句、數(shù)據(jù)再由虛擬數(shù)據(jù)庫管理系統(tǒng)驅(qū)動(dòng)程序(中間件客戶端)提交給遠(yuǎn)程的安全中間件。
安裝在遠(yuǎn)程安全服務(wù)器上的安全中間件存儲(chǔ)有一個(gè)字典,即數(shù)據(jù)庫加密信息庫,它記載著數(shù)據(jù)庫中哪些關(guān)系的哪些字段是需加密存儲(chǔ)的,這些字段在其關(guān)系中是第幾個(gè)字段,字段名是什么,其相應(yīng)的加密密鑰是什么。同時(shí),它還維護(hù)著一個(gè)協(xié)商密鑰通信表,記載著與每個(gè)socket號(hào)相對(duì)應(yīng)的協(xié)商得的用戶密鑰。中間件截獲用戶的數(shù)據(jù)庫操作,對(duì)其中的SQL語句進(jìn)行簡單的語法分析0,若其中不涉及加密字段,則直接交由數(shù)據(jù)庫執(zhí)行,并將執(zhí)行的結(jié)果返回給用戶。若其中涉及到加密字段,它用協(xié)商密鑰通信表中記錄的相應(yīng)密鑰解密用戶發(fā)過來的加密了的數(shù)據(jù),可以得到數(shù)據(jù)的明文,再用從數(shù)據(jù)庫加密信息庫中查到的相應(yīng)數(shù)據(jù)庫存儲(chǔ)密鑰加密,可以得到相應(yīng)的數(shù)據(jù)庫中的密文。同時(shí),他對(duì)數(shù)據(jù)庫服務(wù)器發(fā)給用戶的檢索結(jié)果中的加密數(shù)據(jù)用數(shù)據(jù)庫的相應(yīng)密鑰解密,再用與用戶協(xié)商得的密鑰加密,再傳送給應(yīng)用程序。他對(duì)用戶發(fā)過來的數(shù)據(jù)庫操作語句,函數(shù)中涉及加密字段的也進(jìn)行一定的處理,再傳給數(shù)據(jù)庫服務(wù)器,以實(shí)現(xiàn)對(duì)加密字段的獨(dú)立于客戶端的加解密,以及維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)的一致性并實(shí)現(xiàn)對(duì)加密字段的高效條件查詢。
(2)對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)1的維護(hù)①添加時(shí)的維護(hù)應(yīng)用程序要在表a中添加一條相應(yīng)加密字段m的明文為plain的記錄時(shí),odbc中間件捕獲該操作后,就按以下步驟在該添加操作所在的事務(wù)中嵌入以下操作,以在x表的最后一層中插入一條記錄,并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)做一定的調(diào)整i.攔截并保存相應(yīng)的SQL語句并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii.用SQL語句檢索出x表中層號(hào)最小的那個(gè)塊中的所有記錄,設(shè)其為塊g;iii.將塊g中的記錄按ord2值升序排序,檢索出塊g中eb項(xiàng)明文(不含填充位)小于等于plain的明文的記錄中ord2值最大的記錄r;若r沒有子塊,則執(zhí)行步驟iv,否則用sql語句取出該子塊,將該子塊的值賦給塊g,重復(fù)執(zhí)行步驟iii;iv.若r的eb項(xiàng)的明文去掉填充位后等于plain,設(shè)r的eb項(xiàng)的明文的填充位為rebk,則將plain填充rebk+1后加密,否則將plain在尾部填充數(shù)1后加密,設(shè)所得的值為neb,構(gòu)造一個(gè)新記錄,它的eb值等于neb,et等于r的et值,ord2等于r的ord2值加1,ord1等于r的ord1值,將它插入到r所在的塊中,同時(shí)將r所在的塊中ord2值比r的ord2值大的所有記錄的ord2值加1;v.若插入之后,r所在的塊rblock的記錄數(shù)等于t+1,則將rblock中的記錄中ord2值最大的[t/2]條記錄移出去,構(gòu)成一個(gè)新塊,新塊的所有記錄的et值改為移出去的記錄中的eb項(xiàng)的最小值,其它字段值不變,若r有父記錄,則將新的et值作為eb值,r的父記錄的ord2值加1作為ord2值,r的父記錄的ord1值作為ord1值,r的父記錄的et值作為et值,構(gòu)造一條記錄插入r的父記錄所在的塊中,并將r的父記錄所在的塊中ord2值比r的父記錄的ord2值大的記錄的ord2值加1,并將r的父記錄看作r重復(fù)執(zhí)行步驟v。若r無父記錄,或r所在的塊中記錄數(shù)小于t+1,則執(zhí)行步驟vi;vi.中間件將被攔截的SQL插入語句中的密文字段置為neb,執(zhí)行被攔截的SQL語句并將執(zhí)行結(jié)果返回給用戶。
②刪除時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中刪除一條相應(yīng)密文字段m的密文值為c的記錄(對(duì)于每一個(gè)對(duì)a表中記錄的刪除操作,中間件都需先在同一事務(wù)中通過查詢確定每一條欲刪除記錄的對(duì)應(yīng)的m字段的值c,下面的幾種刪除情況的處理也是一樣,不再贅述)時(shí),odbc中間件捕獲該操作后,就將刪除時(shí)的維護(hù)操作嵌入在該刪除操作所在的事務(wù)中,以便在x表的最后一層中刪除一條記錄并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)作出一定的調(diào)整。密文值c是指用數(shù)據(jù)庫的存儲(chǔ)密鑰加密后的密文值。刪除時(shí)的維護(hù)操作具體如下i.攔截并保存相應(yīng)的SQL語句并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii.用SQL語句檢索出x表中層號(hào)最小的那個(gè)塊中的所有記錄,設(shè)其為塊g;iii.將塊g按ord2值升序排序,檢索出塊g中eb項(xiàng)明文(包括填充位,下同)小于等于c的明文(包括填充位,下同)的記錄中ord2值最大的記錄r;若r沒有子塊,則執(zhí)行步驟iv,否則將該子塊的值賦給塊g,重復(fù)執(zhí)行步驟iii;iv.若r的eb字段等于c,則刪除r,并將塊g中ord2值比r的ord2值大的記錄其ord2值減1;若r為原g塊中ord2值最小的記錄,則將g塊中所有記錄的et項(xiàng)的值設(shè)為刪除后塊中的ord2值最小的記錄的eb項(xiàng)的值,并將其父記錄的eb項(xiàng)設(shè)為該子塊的新的et值,若它的父記錄也是同塊中eb最小的記錄,則同樣調(diào)整它的父記錄所在的塊,依此類推;v.若刪除后g塊中的記錄數(shù)變?yōu)閇t/2]-1,且g不是根塊,則若其父記錄fa的某個(gè)兄弟記錄br的子塊的記錄數(shù)大于[t/2],為num,則從其父記錄的該兄弟記錄br的子塊t1中取出eb值最小的[(num-[t/2]+2)/2]條記錄(如果br是fa的ord2值較fa的ord2值大的兄弟記錄),或從其父記錄的該兄弟記錄br的子塊中取出eb值最大的[(num-[t/2]+2)/2]條記錄(如果br是fa的ord2值較fa的ord2值小的兄弟記錄),并從該兄弟記錄br的子塊中刪除這[(num-[t/2]+2)/2]條記錄,同時(shí)調(diào)整該兄弟記錄br的子塊t1中的記錄的ord2字段和et字段,使得eb隨ord2值的增加而遞增排列,ord2值不重復(fù),et等于塊中最小的eb值,并使br的eb項(xiàng)等于調(diào)整后的t1的et值。將這[(num-[t/2]+2)/2]條記錄插入到g塊中形成一個(gè)新塊,并調(diào)整這個(gè)新塊中的記錄的ord2值使得其所有記錄的ord2值代表其eb值在新塊中的大小序號(hào)(升序),et值等于新塊中最小的eb值,調(diào)整g塊的父記錄使其eb值等于新g塊的et值。若g塊的父記錄fa的兄弟記錄的子塊的記錄數(shù)均為[t/2],則將該塊g和fa的某個(gè)兄弟記錄br1的子塊t3合并成一個(gè)新塊,并調(diào)整這個(gè)新塊的記錄的ord2和et字段使得其所有記錄的ord2值代表其eb值在新塊中的大小序號(hào)(升序),et值等于新塊中最小的eb值,同時(shí)從g塊的父塊中刪除記錄fa和br1,用一條新的eb值等于新塊的et值的記錄取代之,并相應(yīng)的調(diào)整父塊中的ord2值和et值,使得其所有記錄的ord2值代表其eb值在塊中的大小序號(hào)(升序),et值等于塊中最小的eb值,再將該父塊的值賦給塊g,重復(fù)執(zhí)行步驟v。若g沒有父記錄或父記錄無兄弟記錄或g塊中的記錄數(shù)大于[t/2]-1,則執(zhí)行步驟vi;vi.執(zhí)行被攔截的SQL語句并將執(zhí)行結(jié)果返回給用戶。
③更新時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中更新一條記錄的m字段的值時(shí),設(shè)該字段的原密文值為x,新值的明文為nm,(對(duì)于每一個(gè)對(duì)a表中記錄的m字段的更新操作,中間件都需先在同一事務(wù)中通過查詢確定每一條欲更新記錄的對(duì)應(yīng)的m字段的原值,下面的幾種輔助數(shù)據(jù)結(jié)構(gòu)的更新情況的處理也是一樣,不再贅述)則該語句被中間件攔截后,該中間件在相應(yīng)的操作所在的事務(wù)中插入以下操作先執(zhí)行與刪除m字段密文值為x的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,再執(zhí)行與添加m字段明文值為nm的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,待這些步驟順利完成后再將截獲的語句放行,并將執(zhí)行的結(jié)果返回給應(yīng)用程序。實(shí)現(xiàn)這種操作需要中間件和數(shù)據(jù)庫服務(wù)器之間的L+1次至4L+1次交互(L為輔助數(shù)據(jù)結(jié)構(gòu)的總共的層數(shù)),但因?yàn)檩o助結(jié)構(gòu)的特殊設(shè)計(jì)和輔助數(shù)據(jù)結(jié)構(gòu)的聚集索引的建立,這些交互可以迅速完成。
(3)對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)2的維護(hù)對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)2,需在數(shù)據(jù)庫服務(wù)器端創(chuàng)建一個(gè)存儲(chǔ)過程,該存儲(chǔ)過程完全在數(shù)據(jù)庫服務(wù)器端執(zhí)行,該存儲(chǔ)過程至少接收一個(gè)密文c的的不包括填充序列的明文的所有前綴密文的集合(后面亦稱之為該數(shù)的前綴密文集)。如果一個(gè)數(shù)(用二進(jìn)制表示,下文中提到的所有數(shù)如非特別注明,均以二進(jìn)制表示),從它的最高有效位算起,取它的前k位長度,再在第k+1位填1,其余位填0,再加密,得到的數(shù)稱為該數(shù)的前綴密文,其中,k小于等于該數(shù)的不包括填充比特的二進(jìn)制長度,可為0。
具體步驟如下①添加時(shí)的維護(hù)應(yīng)用程序要在表a中添加一條相應(yīng)加密字段m的明文為plain的記錄時(shí),odbc中間件捕獲該操作后,就按以下步驟在該添加操作所在的事務(wù)中嵌入以下操作,以在x表的最后一層中插入一條記錄,并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)做一定的調(diào)整i.攔截并保存相應(yīng)的SQL語句,并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii.調(diào)用一個(gè)存儲(chǔ)過程,該存儲(chǔ)過程接收plain(不包括填充位,下同)的前綴密文集作為參數(shù),并按以下步驟(3)執(zhí)行iii.用SQL語句檢索出x表中層號(hào)最小的那個(gè)塊中的所有記錄,設(shè)其為塊g,把其中的記錄按ord2值從小到大從左向右排列,成一個(gè)有序集s,然后找出其el值在plain的前綴密文集中的最靠右的記錄elr,再找出s中er值在plain的前綴密文集中的最靠左的記錄erl(如不存在則將最右邊的記錄視為erl),則plain的大小要么處在elr的eb值的明文(比較時(shí)plain的填充位視為最大值,下同)和它的左邊相鄰的記錄lb的eb值之間(開區(qū)間,如果不存在elr則無此條),要么處在erl的eb值和其右邊的相鄰的記錄rb的eb值之間(開區(qū)間,如果erl無右邊的相鄰記錄,則此條改為“要么大于erl記錄的eb值)。把elr的左邊相鄰的記錄lb的子塊取出來,按ord2的升序從左向右排列,構(gòu)成一個(gè)有序集sl(如果不存在elr或lb無子塊,則不進(jìn)行此步驟),用這個(gè)有序集取代s中elr左邊的所有記錄,并用該子塊中ord2值最大的記錄的ep值取代elr的el值;把erl的子塊取出來,按同樣的方法排列,用同樣方法構(gòu)成一個(gè)有序集sr,用erl的el項(xiàng)取代sr中最靠左記錄的el值,再用這個(gè)有序集取代erl,并用該子塊中ord2值最大的記錄的ep項(xiàng)的值取代原erl的右邊相鄰記錄rb的el項(xiàng),同時(shí)去掉rb右邊的所有記錄(如不存在rb則不進(jìn)行此步驟)。完成以上兩步之后,再把新的有序集看作s,再做類似的操作,如此下去,直到所有取代操作不能再執(zhí)行為止。將在最后的s集中找到的elr和rb求其eb值最小的子孫記錄(若無子孫則就取自身)以代替他們自身,則新的記錄在最后一層插入的位置要么與最后的s集中的lb記錄在同一塊中且其ord2值應(yīng)緊接在其后,要么與erl在同一塊中且其ord2值應(yīng)緊接在其后。該存儲(chǔ)過程返回最后的elr(替換后的,下同)、lb、erl、rb(替換后的,下同)及其所有祖先記錄。同時(shí),該存儲(chǔ)過程計(jì)算如按這兩種方式插入如何按類似輔助數(shù)據(jù)結(jié)1的插入后的調(diào)整的方式進(jìn)行整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)的調(diào)整,并按定義分析調(diào)整后哪些記錄的er、ep、el字段需要重新設(shè)置,并將這些記錄及其在插入、調(diào)整后的可能的同層相鄰兄弟記錄、可能的調(diào)整方式一起返回(所有返回的記錄均需指明其在各塊中所在的位置編號(hào),及所在塊的現(xiàn)有記錄數(shù)),由中間件計(jì)算調(diào)整后的新er、el、ep值。
iv.中間件計(jì)算出elr、lb、erl、rb的eb字段的明文,看plain(不包括填充位)是處在lb與elr的eb項(xiàng)的明文(不包括填充位)之間(開區(qū)間),還是處在erl與rb的eb項(xiàng)的明文(不包括填充位)之間(開區(qū)間),還是plain等于erl的eb項(xiàng)的明文(去掉填充位后比較)等于elr的的eb項(xiàng)的明文(去掉填充位后比較);若處在lb與elr的eb項(xiàng)的明文之間,則應(yīng)在lb之同一塊中且在lb之后插入,插入的記錄的eb項(xiàng)為plain后面用整數(shù)1填充后再加密,其它字段的設(shè)置與輔助數(shù)據(jù)結(jié)構(gòu)1中的插入類似;若處在erl與rb的eb項(xiàng)的明文之間,則應(yīng)在erl之同一塊中且在erl之后插入,插入的記錄的eb項(xiàng)為plain用整數(shù)1填充后加密,其它字段的設(shè)置與輔助數(shù)據(jù)結(jié)構(gòu)1中的插入類似;若是第3種情況,則應(yīng)在erl之同一塊中且在erl之后插入,設(shè)erl的填充位為erlt,則插入的記錄的eb項(xiàng)為plain用(erlt+1)填充后加密,其它字段的設(shè)置與輔助數(shù)據(jù)結(jié)構(gòu)1中的插入類似。確定在最后一層插入的位置后,中間件再確定插入后引起的輔助數(shù)據(jù)結(jié)構(gòu)的調(diào)整而需要重新設(shè)置的er、ep、el值,并用這些以及插入的位置、調(diào)整的方法等作為參數(shù)調(diào)用一個(gè)存儲(chǔ)過程完成相應(yīng)的插入、調(diào)整(其因插入引起的調(diào)整步驟完全類似與輔助數(shù)據(jù)結(jié)構(gòu)1)、和er、el、ep字段的重設(shè)工作。
v.中間件將被攔截的SQL插入語句中的密文字段置為在輔助數(shù)據(jù)結(jié)構(gòu)最后一層中插入的記錄的eb值,執(zhí)行被攔截的SQL語句并將執(zhí)行結(jié)果返回給用戶。
②刪除時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中刪除一條相應(yīng)密文字段m的密文值為c的記錄時(shí),odbc中間件捕獲該操作后,就將刪除時(shí)的維護(hù)操作嵌入在該刪除操作所在的事務(wù)中,以便在x表的最后一層中刪除一條記錄并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)作出一定的調(diào)整。密文值c是指用數(shù)據(jù)庫的存儲(chǔ)密鑰加密后的密文值。刪除時(shí)的維護(hù)操作具體如下i.攔截并保存相應(yīng)的SQL語句,并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii調(diào)用一個(gè)存儲(chǔ)過程,該存儲(chǔ)過程在數(shù)據(jù)庫服務(wù)器端執(zhí)行,它接收c的明文的前綴密文集(指其不包括填充位的前綴密文集,下同)及c本身作為參數(shù),并按以下步驟iii執(zhí)行iii.SQL語句檢索出x表中層號(hào)最小的那個(gè)塊中的所有記錄,設(shè)其為塊g,把其中的記錄按ord2值從小到大從左向右排列,成一個(gè)有序集s,然后找出其el值在c的明文的前綴密文集中的或其eb值等于c的最靠右的記錄elr,再找出s中er值在c的明文的前綴密文集中或其eb值等于c的最靠左的記錄erl(如果不存在則將最右邊的一條記錄視為erl),則c的大小要么處在elr的eb值和它的左邊相鄰的記錄lb的eb值之間(閉區(qū)間,若無elr則無此條),要么處在erl的eb值和其右邊的相鄰的記錄rb的eb值之間(閉區(qū)間,如果erl不存在右邊的相鄰記錄,則此條改為“要么大于erl記錄的eb值”)。把elr的左邊相鄰的記錄lb的子塊取出來(若其無子塊或無elr則不進(jìn)行此步驟),按ord2的升序從左向右排列,構(gòu)成一個(gè)有序集sl,用這個(gè)有序集取代s中elr左邊的所有記錄,并用該子塊中ord2值最大的記錄的ep值取代elr的el值(如果elr的eb值為c,則不進(jìn)行此取子塊及替代步驟);把erl的子塊取出來(若其無子塊則不進(jìn)行此步驟),按同樣的方法排列,構(gòu)成一個(gè)有序集sr,用erl的el項(xiàng)取代sr中最左邊的記錄的el項(xiàng),再用這個(gè)有序集sr取代erl,并用該子塊中ord2值最大的記錄的ep項(xiàng)的值取代原erl右邊相鄰記錄rb的el項(xiàng),同時(shí)去掉rb右邊的所有記錄(如不存在rb則不進(jìn)行此步驟)。完成以上兩步之后,再把新的有序集看作s,再做類似的操作,如此下去,直到所有取代操作均不能再執(zhí)行為止。則在最后的s集中必能找到eb項(xiàng)等于c的記錄,再用它在最后一層中的eb值最小的子孫記錄代替它(若無子孫記錄則不進(jìn)行此步驟)。設(shè)該記錄為p,p在最后一個(gè)s集中的左邊兄弟記錄為lbl,lbl在最后一層中的eb值最大的子孫記錄為pl(若lbl無子孫則就取lbl本身),p在最后一個(gè)s集中的右邊的兄弟記錄為rbl,rbl在最后一層中的eb值最小的子孫記錄為pr(若rbl無子孫則就取rbl本身),則返回p、pl和pr及其所有祖先記錄(所有返回的記錄均需指明其在各塊中所在的位置編號(hào),及其所在塊的現(xiàn)有記錄數(shù))。同時(shí),該存儲(chǔ)過程根據(jù)刪除p而需要對(duì)輔助數(shù)據(jù)結(jié)構(gòu)2做的類似于輔助數(shù)據(jù)結(jié)構(gòu)1的調(diào)整,推算出哪些記錄在調(diào)整后需重新設(shè)置其er、el、ep字段的值并把調(diào)整方式及這些記錄及該存儲(chǔ)過程推知的在刪除、調(diào)整后的這些記錄的同層相鄰兄弟記錄返回給中間件(所有返回的記錄均需指明其在各塊中所在的位置編號(hào),及其所在塊的現(xiàn)有記錄數(shù)),由中間件計(jì)算調(diào)整后的新er、el、ep值。
iv.中間件根據(jù)該存儲(chǔ)過程返回的值計(jì)算出調(diào)整后需要重新設(shè)置的ep、el、er值并調(diào)用另一存儲(chǔ)過程在輔助數(shù)據(jù)結(jié)構(gòu)的最后一層中刪除eb值為c的記錄并進(jìn)行其他類似與輔助數(shù)據(jù)結(jié)構(gòu)1的調(diào)整,并設(shè)置調(diào)整后需要重新設(shè)置的el、er和ep值。
v.中間件放行攔截的刪除操作并將執(zhí)行結(jié)果返回給用戶。
③更新時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中更新一條記錄的m字段的值時(shí),設(shè)該字段的原密文值為x,新值的明文為nm,則該語句被中間件攔截后,則該中間件在相應(yīng)的操作所在的事務(wù)中插入以下操作先執(zhí)行與刪除m字段密文值為x的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,再執(zhí)行與添加m字段明文值為nm的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,待這些步驟順利完成后再將截獲的語句放行,并將執(zhí)行的結(jié)果返回給應(yīng)用程序。實(shí)現(xiàn)這種操作需要中間件和數(shù)據(jù)庫服務(wù)器之間的L+1次至4L+1次交互(L為輔助數(shù)據(jù)結(jié)構(gòu)的總共的層數(shù)),但因?yàn)檩o助結(jié)構(gòu)的特殊設(shè)計(jì)和輔助數(shù)據(jù)結(jié)構(gòu)的聚集索引的建立,這些交互可以迅速完成。
(3)對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)3的維護(hù)其維護(hù)過程與輔助數(shù)據(jù)結(jié)構(gòu)1類似,只不過塊換成了對(duì)象,對(duì)塊中記錄的處理變成了對(duì)對(duì)象中j類結(jié)構(gòu)的處理,塊的分裂和合并變成了對(duì)象的分裂和合并。具體步驟如下①添加時(shí)的維護(hù)應(yīng)用程序要在表a中添加一條相應(yīng)加密字段m的明文為plain的記錄時(shí),odbc中間件捕獲該操作后,就按以下步驟在該添加操作所在的事務(wù)中嵌入以下操作,以在x表的最后一層的某個(gè)對(duì)象中插入一個(gè)j類結(jié)構(gòu),并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)做一定的調(diào)整i.攔截并保存相應(yīng)的SQL語句,并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii用SQL語句檢索出x表中層號(hào)最小的那個(gè)對(duì)象,設(shè)其為對(duì)象g;iii.檢索出在對(duì)象g中,其eb項(xiàng)的明文(不包括填充位)小于等于plain的j類結(jié)構(gòu)中ord2值最大的j類結(jié)構(gòu)r;若r沒有子對(duì)象,則執(zhí)行步驟iv,否則將該子對(duì)象的值賦給對(duì)象g,重復(fù)執(zhí)行步驟iii;iv.若r的eb項(xiàng)的明文去掉填充位后等于plain(不包含填充位),設(shè)r的eb項(xiàng)的明文的填充位為rebk,則將plain填充rebk+1后加密,否則將plain在尾部填充整數(shù)1后加密,設(shè)所得的值為neb,構(gòu)造一個(gè)新j類結(jié)構(gòu),他的eb值等于neb,將它插入到r所在的對(duì)象的j類結(jié)構(gòu)數(shù)組中,插在該對(duì)象的j類結(jié)構(gòu)數(shù)組的元素r之后,并將r之后的元素依次往后挪。將該對(duì)象的num值加1并相應(yīng)調(diào)整各j類結(jié)構(gòu)的ord2屬性值以使之等于其所在j類結(jié)構(gòu)的eb項(xiàng)的大小在整個(gè)對(duì)象中的升序排序號(hào)。
v.若插入之后,r所在的對(duì)象rblock的j類結(jié)構(gòu)數(shù)等于t+1,則將rblock中的j類結(jié)構(gòu)中ord2值較大的[t/2]個(gè)j類結(jié)構(gòu)移出去,構(gòu)成一個(gè)新的對(duì)象newo,并相應(yīng)調(diào)整新舊對(duì)象的j類結(jié)構(gòu)的排列和各j類結(jié)構(gòu)的ord2值、對(duì)象的num值,使j類結(jié)構(gòu)按其eb值的大小遞增排列,使num表示對(duì)象中j類結(jié)構(gòu)的數(shù)目,ord2為其所在的j類結(jié)構(gòu)在數(shù)組中的序號(hào),其它字段值不變,若r有父對(duì)象,則將新對(duì)象的j類結(jié)構(gòu)中eb的最小值作為一個(gè)新的j類結(jié)構(gòu)的eb值,ref(newo)作為新的j類結(jié)構(gòu)的ref字段的值,構(gòu)造一個(gè)新的j類結(jié)構(gòu)插入到r的父對(duì)象中去,同時(shí)調(diào)整父對(duì)象中j類結(jié)構(gòu)的排列,使之按其eb值的大小遞增排列,調(diào)整各j類結(jié)構(gòu)的ord2值使之等于其所在j類結(jié)構(gòu)在數(shù)組中的序號(hào),調(diào)整對(duì)象的num值使num表示對(duì)象中j類結(jié)構(gòu)的數(shù)目。并將r的父j類結(jié)構(gòu)看作r,重復(fù)執(zhí)行步驟v。若r無父對(duì)象,或插入之后r所在對(duì)象的j類結(jié)構(gòu)數(shù)小于t+1,則執(zhí)行步驟vi;vi.中間件將被攔截的SQL插入語句中的密文字段置為neb,執(zhí)行被攔截的SQL語句并將執(zhí)行結(jié)果返回給用戶。
vii.中間件將在x表中最后一層插入的j類結(jié)構(gòu)的ref字段的值設(shè)為指向a表中剛插入的記錄。
②刪除時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中刪除一條相應(yīng)密文字段m的密文值為c的記錄時(shí),odbc中間件捕獲該操作后,就將刪除時(shí)的維護(hù)操作嵌入在該刪除操作所在的事務(wù)中,以便在x表的最后一層的某個(gè)對(duì)象中刪除一個(gè)j類結(jié)構(gòu)并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)作出一定的調(diào)整。密文值c是指用數(shù)據(jù)庫的存儲(chǔ)密鑰加密后的密文值。刪除時(shí)的維護(hù)操作具體如下i.攔截并保存相應(yīng)的SQL語句并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii用SQL語句檢索出x表中層號(hào)最小的那個(gè)對(duì)象,設(shè)其為對(duì)象g;iii.檢索出對(duì)象g中eb項(xiàng)明文(包括填充位,下同)小于等于c的明文(包括填充位)的j類型結(jié)構(gòu)中eb項(xiàng)的明文值最大的j類型結(jié)構(gòu)r;若r沒有x類型的子對(duì)象,則執(zhí)行步驟iv,否則將該子對(duì)象的值賦給塊g,重復(fù)執(zhí)行步驟iii;iv.若r的eb屬性等于c,則從g的j類結(jié)構(gòu)數(shù)組中刪除該j類結(jié)構(gòu),并將r后面的j類結(jié)構(gòu)前移,并相應(yīng)的調(diào)整ord2屬性和num屬性的值,使num表示新對(duì)象中j類結(jié)構(gòu)的數(shù)目,ord2為其所在的j類結(jié)構(gòu)在數(shù)組中的序號(hào)(升序),若r是所在對(duì)象中ord2值最小的j類結(jié)構(gòu),則調(diào)整r的父j類結(jié)構(gòu)的eb字段的值,使它等于它的子對(duì)象中最小的eb,若r的父j類結(jié)構(gòu)亦為所在對(duì)象中ord2值最小的j類結(jié)構(gòu),則對(duì)r的父j類結(jié)構(gòu)的父j類結(jié)構(gòu)做類似調(diào)整,依此類推;v.若刪除后g對(duì)象中的j類結(jié)構(gòu)數(shù)變?yōu)閇t/2]-1,且其父j類結(jié)構(gòu)fa的某個(gè)兄弟j類結(jié)構(gòu)br的子對(duì)象的j類結(jié)構(gòu)數(shù)大于[t/2],為num,則從其父j類結(jié)構(gòu)的該兄弟j類結(jié)構(gòu)br的子對(duì)象t1中取出eb值最小的[(num-[t/2]+2)/2]個(gè)j類結(jié)構(gòu)(如果br的eb值比fa的eb值大),或從其父j類結(jié)構(gòu)的該兄弟j類結(jié)構(gòu)br中取出eb值最大的[(num-[t/2]+2)/2]個(gè)j類結(jié)構(gòu)(如果br的eb值比fa的eb值小),將他們插入到g中,并從該兄弟j類結(jié)構(gòu)br的子對(duì)象t1中刪除這[(num-[t/2]+2)/2]個(gè)j類結(jié)構(gòu),同時(shí)重新排列t1和g的j類結(jié)構(gòu)數(shù)組,使之按eb值遞增排列,調(diào)整他們的ord2屬性和num屬性的值,使num表示對(duì)象中j類結(jié)構(gòu)的數(shù)目,ord2為其所在的j類結(jié)構(gòu)在其對(duì)象數(shù)組中的序號(hào),并使br和fa的eb項(xiàng)等于調(diào)整后的其子對(duì)象中所有j類結(jié)構(gòu)中eb項(xiàng)的最小值。若g的父j類結(jié)構(gòu)fa的兄弟j類結(jié)構(gòu)的子對(duì)象的j類結(jié)構(gòu)數(shù)均為[t/2],則將g和fa的某個(gè)兄弟j類結(jié)構(gòu)br1的子對(duì)象t3合并成一個(gè)新對(duì)象,使新對(duì)像的所有j類結(jié)構(gòu)的eb值等于上述兩個(gè)對(duì)象的并集,并調(diào)整這個(gè)新對(duì)象使得其j類結(jié)構(gòu)數(shù)組按其eb屬性的值遞增排列,調(diào)整ord2屬性和num屬性的值,使num表示新對(duì)象中j類結(jié)構(gòu)的數(shù)目,ord2為其所在的j類結(jié)構(gòu)在數(shù)組中的序號(hào),同時(shí)從t對(duì)象的父對(duì)象中刪除j類結(jié)構(gòu)fa和br1,用一個(gè)新的eb值等于新對(duì)象的eb值的最小值的j類結(jié)構(gòu)取代之,并相應(yīng)的調(diào)整父對(duì)象的其他字段的值使之滿足定義要求。再將該父對(duì)象的值賦給對(duì)象g,重復(fù)執(zhí)行步驟v。若g沒有父j類結(jié)構(gòu)或父j類結(jié)構(gòu)無兄弟j類結(jié)構(gòu)或g對(duì)象中的j類結(jié)構(gòu)數(shù)大于[t/2]-1,則執(zhí)行步驟vi;vi.中間件放行攔截的刪除操作并將執(zhí)行結(jié)果返回給用戶。
③更新時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中更新一條記錄的m字段的值時(shí),設(shè)該字段的原密文值為x,新值的明文為nm,則該語句被中間件攔截后,則該中間件在相應(yīng)的操作所在的事務(wù)中插入以下操作先執(zhí)行與刪除m字段密文值為x的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,再執(zhí)行與添加m字段明文值為nm的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,待這些步驟順利完成后再將截獲的語句放行,并將執(zhí)行的結(jié)果返回給應(yīng)用程序。實(shí)現(xiàn)這種操作需要中間件和數(shù)據(jù)庫服務(wù)器之間的L+1次至4L+1次交互(L為輔助數(shù)據(jù)結(jié)構(gòu)的總共的層數(shù)),但因?yàn)檩o助結(jié)構(gòu)的特殊設(shè)計(jì)和輔助數(shù)據(jù)結(jié)構(gòu)的聚集索引的建立,這些交互可以迅速完成。
(4)對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)4的維護(hù)其維護(hù)用與輔助數(shù)據(jù)結(jié)構(gòu)2同樣的方法類比建立存儲(chǔ)過程來解決,只不過塊換成了對(duì)象,對(duì)塊中記錄的處理變成了對(duì)對(duì)象中j類結(jié)構(gòu)的處理,塊的分裂和合并變成了對(duì)象的分裂和合并。具體步驟如下①添加時(shí)的維護(hù)應(yīng)用程序要在表a中添加一條相應(yīng)加密字段m的明文為plain的記錄時(shí),odbc中間件捕獲該操作后,就按以下步驟在該添加操作所在的事務(wù)中嵌入以下操作,以在x表的最后一層的某個(gè)對(duì)象中插入一個(gè)j類結(jié)構(gòu),并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)做一定的調(diào)整i.攔截并保存相應(yīng)的SQL語句,并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii調(diào)用一個(gè)存儲(chǔ)過程,該存儲(chǔ)過程接收plain的前綴密文集(不包括填充位,下同)作為參數(shù),并按以下步驟iii執(zhí)行iii.用SQL語句檢索出x表中層號(hào)最小的那個(gè)對(duì)象,設(shè)其為g,把其中的j類結(jié)構(gòu)按ord2值從小到大從左向右排列,成一個(gè)有序集s,然后找出其el值在plain的前綴密文集中的最靠右的j類結(jié)構(gòu)elr,再找出s中er值在plain的前綴密文集中的最靠左的j類結(jié)構(gòu)erl(如不存在則將最右邊的j類結(jié)構(gòu)視為erl),則plain的大小(比較時(shí)plain的填充位視為最大值,下同)要么處在elr的eb值和它的左邊相鄰的j類結(jié)構(gòu)lb的eb值之間(開區(qū)間,如果不存在elr則無此條),要么處在erl的eb值和其右邊的相鄰的j類結(jié)構(gòu)rb的eb值之間(開區(qū)間,如果erl無右邊的相鄰j類結(jié)構(gòu)則為大于erl的eb值)。把elr的左邊相鄰的j類結(jié)構(gòu)lb的子對(duì)象的所有j類結(jié)構(gòu)取出來,按ord2的升序從左向右排列,構(gòu)成一個(gè)有序集sl(如果不存在lb或lb無子對(duì)象,則不進(jìn)行此步驟),用這個(gè)有序集取代s中elr左邊的所有j類結(jié)構(gòu),并用該子對(duì)象中ord2值最大的j類結(jié)構(gòu)的ep值取代elr的el值;把erl的子對(duì)象的所有j類結(jié)構(gòu)取出來,按同樣的方法排列,按同樣的方法構(gòu)成一個(gè)有序集sr,用erl的el項(xiàng)取代sr中最左邊的j類結(jié)構(gòu)的el項(xiàng),再將sr集合取代erl,并用該子對(duì)象中ord2值最大的j類結(jié)構(gòu)的ep項(xiàng)的值取代原erl的右邊相鄰j類結(jié)構(gòu)rb的el項(xiàng),同時(shí)去掉rb右邊的所有j類結(jié)構(gòu)(如不存在rb則不進(jìn)行此步驟)。完成以上兩步之后,再把新的有序集看作s,再做類似的操作,如此下去,直到所有取代操作均不能再執(zhí)行為止。將在最后的s集中找到的elr,rb求其eb值最小的子孫j類結(jié)構(gòu)(若無子孫則就取自身)以代替他們自身。則新的j類結(jié)構(gòu)在最后一層插入的位置要么在最后的s集中的lbj類結(jié)構(gòu)所在的對(duì)象中且其插入后的ord2值應(yīng)緊接在lb的ord2值之后,要么與erl在同一對(duì)象中且其插入后的ord2值應(yīng)緊接在erl的ord2值之后。該存儲(chǔ)過程返回最后的elr(替換后的,下同)、lb、erl、rb(替換后的,下同)及其所有祖先j類結(jié)構(gòu)。同時(shí),該存儲(chǔ)過程計(jì)算如分別以這兩種方式插入,整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)如何按類似輔助數(shù)據(jù)結(jié)3的插入后的調(diào)整方式進(jìn)行調(diào)整,并按定義分析調(diào)整后哪些j類結(jié)構(gòu)的er、ep、el字段需要重新設(shè)置,并將調(diào)整方式、這些j類結(jié)構(gòu)及其在插入、調(diào)整后的可能的同層相鄰兄弟j類結(jié)構(gòu)一起返回(所有返回的j類結(jié)構(gòu)均需指明其在各對(duì)象中所在的位置編號(hào),及其所在對(duì)象的現(xiàn)有j類結(jié)構(gòu)數(shù)),由中間件計(jì)算調(diào)整后的新er、el、ep值。
iv.中間件計(jì)算出elr、lb、erl、rb的eb字段的明文,看plain(不包括填充位)是處在lb與elr的eb項(xiàng)的明文(不包括填充位)之間(開區(qū)間),還是處在erl與rb的eb項(xiàng)的明文(不包括填充位)之間(開區(qū)間),還是plain等于erl的eb項(xiàng)的明文(去掉填充位后比較)等于elr的eb項(xiàng)的明文(去掉填充位后比較);若處在lb與elr的eb項(xiàng)的明文之間(不包括填充位),則應(yīng)在lb之同一對(duì)象中且在lb之后插入一j類結(jié)構(gòu),插入的j類結(jié)構(gòu)的eb項(xiàng)為plain后面用整數(shù)1填充后再加密,其它字段的設(shè)置與輔助數(shù)據(jù)結(jié)構(gòu)3中的插入類似;若處在erl與rb的eb項(xiàng)的明文之間(不包括填充位),則應(yīng)在erl之同一對(duì)象中且在erl之后插入,插入的j類結(jié)構(gòu)的eb項(xiàng)為plain用整數(shù)1填充后加密,其它字段的設(shè)置與輔助數(shù)據(jù)結(jié)構(gòu)3中的插入類似;若是第3種情況,則應(yīng)在erl之同一對(duì)象中且在erl之后插入,設(shè)erl的填充位為erlt,則插入的j類結(jié)構(gòu)的eb項(xiàng)為plain用(erlt+1)填充后加密,其它字段的設(shè)置與輔助數(shù)據(jù)結(jié)構(gòu)3中的插入類似。確定插入的位置后,中間件再確定插入后引起的輔助數(shù)據(jù)結(jié)構(gòu)的調(diào)整而需要重新設(shè)置的er、ep、el值,并用這些值及插入的位置、調(diào)整的方法作為參數(shù)調(diào)用一個(gè)存儲(chǔ)過程完成相應(yīng)的插入、調(diào)整(其因插入引起的調(diào)整步驟完全類似與輔助數(shù)據(jù)結(jié)構(gòu)3)和er、el、ep字段的重設(shè)工作。
v.中間件將被攔截的SQL插入語句中的密文字段置為在輔助數(shù)據(jù)結(jié)構(gòu)最后一層中插入的j類結(jié)構(gòu)的eb值,執(zhí)行被攔截的SQL語句并將執(zhí)行結(jié)果返回給用戶。
vi.中間件將在x表中最后一層插入的j類結(jié)構(gòu)的ref字段的值設(shè)為指向a表中剛插入的記錄。
②刪除時(shí)的維護(hù)刪除時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中刪除一條相應(yīng)密文字段m的密文值為c的記錄時(shí),odbc中間件捕獲該操作后,就將刪除時(shí)的維護(hù)操作嵌入在該刪除操作所在的事務(wù)中,以便在x表的最后一層的某個(gè)對(duì)象中刪除一個(gè)j類結(jié)構(gòu)并對(duì)整個(gè)輔助數(shù)據(jù)結(jié)構(gòu)作出一定的調(diào)整。密文值c是指用數(shù)據(jù)庫的存儲(chǔ)密鑰加密后的密文值。
i.攔截并保存相應(yīng)的SQL語句,并在該SQL語句所在的事務(wù)中進(jìn)行下列操作ii調(diào)用一個(gè)存儲(chǔ)過程,該存儲(chǔ)過程在數(shù)據(jù)庫服務(wù)器端執(zhí)行,它接收c的明文(不包括填充位)的前綴密文集及c本身作為參數(shù),并按以下步驟iii執(zhí)行iii.用SQL語句檢索出x表中層號(hào)最小的那個(gè)對(duì)象g中的所有j類結(jié)構(gòu),把g中的j類結(jié)構(gòu)按其eb值從小到大從左向右排列,成一個(gè)有序集s,然后找出其el值在c的明文(不包括填充序列)的前綴密文集中的或其eb值等于c的最靠右的j類結(jié)構(gòu)elr,再找出s中er值在c的明文(不包括填充序列)的前綴密文集中或等于c的最靠左的j類結(jié)構(gòu)erl(如不存在則將最右邊的j類結(jié)構(gòu)視為erl),則c的大小要么處在elr的eb值和它的左邊相鄰的j類結(jié)構(gòu)lb的eb值之間(閉區(qū)間,如果不存在elr則無此條),要么處在erl的eb值和其右邊的相鄰的j類結(jié)構(gòu)rb的eb值之間(閉區(qū)間,如果erl不存在右邊的相鄰記錄,則此條改為“要么大于erlj類結(jié)構(gòu)的eb值”)。把elr的左邊相鄰的j類結(jié)構(gòu)lb的子對(duì)象取出來(若其無子對(duì)象或無elr則不進(jìn)行此步驟),將其j類結(jié)構(gòu)按它們?cè)跀?shù)組中的順序排列,構(gòu)成一個(gè)有序集sl,用這個(gè)有序集取代s中elr左邊的所有j類結(jié)構(gòu),并用該子對(duì)象中eb值最大的j類結(jié)構(gòu)的ep值取代elr的el值(如果elr的eb值為c,則不進(jìn)行此取子對(duì)象及取代步驟);把erl的子對(duì)象取出來,按同樣的方法排列,構(gòu)成一個(gè)有序集sr,用erl的el值取代sr中最左j類結(jié)構(gòu)的el值,并將這個(gè)有序集取代erl,并用該子對(duì)象中eb值最大的j類結(jié)構(gòu)的ep項(xiàng)的值取代原erl的右邊相鄰記錄rb的el項(xiàng),同時(shí)去掉rb右邊的所有j類結(jié)構(gòu)(如不存在rb則不進(jìn)行此步驟)。完成以上步驟之后,再把新的有序集看作s,再做類似的操作,如此下去,直到所有取代操作均不能再執(zhí)行為止。則在最后的s集中必能找到eb項(xiàng)等于c的j類結(jié)構(gòu)。設(shè)該j類結(jié)構(gòu)為p,用p在最后一層中的eb值最小的子孫j類結(jié)構(gòu)取代p,設(shè)p在最后一個(gè)s集中的左邊兄弟j類結(jié)構(gòu)的eb值最大的子孫(且層號(hào)為最大值)j類結(jié)構(gòu)為pl,右邊的兄弟j類結(jié)構(gòu)的eb值為最小的子孫(且層號(hào)為最大值)j類結(jié)構(gòu)為pr,則返回p、pl和pr及他們的所有祖先j類結(jié)構(gòu)(所有返回的j類結(jié)構(gòu)均需指明其在各對(duì)象中所在的位置編號(hào),及其所在對(duì)象的現(xiàn)有j類結(jié)構(gòu)數(shù))。同時(shí),該存儲(chǔ)過程根據(jù)刪除p而需要對(duì)輔助數(shù)據(jù)結(jié)構(gòu)4做的類似于輔助數(shù)據(jù)結(jié)構(gòu)3的調(diào)整,推算出哪些j類結(jié)構(gòu)在調(diào)整后需重新設(shè)置其er、el、ep值,并把這些j類結(jié)構(gòu)及該存儲(chǔ)過程推知的在刪除、調(diào)整后這些j類結(jié)構(gòu)的同層相鄰兄弟j類結(jié)構(gòu),以及調(diào)整方式返回給中間件(所有返回的j類結(jié)構(gòu)均需指明其在各對(duì)象中所在的位置編號(hào),及其所在對(duì)象的現(xiàn)有j類結(jié)構(gòu)數(shù)),由中間件計(jì)算調(diào)整后的新er、el、ep值。
iv.中間件根據(jù)該存儲(chǔ)過程返回的值計(jì)算出調(diào)整后需要重新設(shè)置的ep、el、er值并調(diào)用另一存儲(chǔ)過程在輔助數(shù)據(jù)結(jié)構(gòu)的最后一層中刪除eb值為c的j類結(jié)構(gòu)并進(jìn)行其他類似與輔助數(shù)據(jù)結(jié)構(gòu)3的調(diào)整,并設(shè)置調(diào)整后需要重新設(shè)置的el、er和ep值。
v.中間件放行攔截的刪除操作并將執(zhí)行結(jié)果返回給用戶。
③更新時(shí)的維護(hù)當(dāng)應(yīng)用程序要在表a中更新一條記錄的m字段的值時(shí),設(shè)該字段的原密文值為x,新值的明文為nm,則該語句被中間件攔截后,則該中間件在相應(yīng)的操作所在的事務(wù)中插入以下操作先執(zhí)行與刪除m字段密文值為x的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,再執(zhí)行與添加m字段明文值為nm的記錄相同的輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)工作,待這些步驟順利完成后再將截獲的語句放行,并將執(zhí)行的結(jié)果返回給應(yīng)用程序。實(shí)現(xiàn)這種操作需要中間件和數(shù)據(jù)庫服務(wù)器之間的L+1次至4L+1次交互(L為輔助數(shù)據(jù)結(jié)構(gòu)的總共的層數(shù)),但因?yàn)檩o助數(shù)據(jù)結(jié)構(gòu)的特殊設(shè)計(jì)和輔助數(shù)據(jù)結(jié)構(gòu)的聚集索引的建立,這些交互可以迅速完成。
(二)密文的查詢密文的查詢是通過中間件,使用輔助數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)。其中,中間件所處的位置及描述與上述輔助數(shù)據(jù)結(jié)構(gòu)的維護(hù)步驟中相同。
對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)1的密文的查詢當(dāng)應(yīng)用程序發(fā)過來的數(shù)據(jù)庫查詢語句中含有對(duì)表a中密文字段m的范圍條件查詢要求,如m between a and b(a和b在由應(yīng)用程序傳送給中間件服務(wù)器時(shí),用事先協(xié)商好的密鑰加密,中間件得到它后再解密為明文)時(shí),中間件攔截之,在同一事務(wù)中插入以下若干數(shù)據(jù)庫操作語句它先檢索出“層”號(hào)為最小的一層所包含的那一個(gè)塊,判斷其中有哪些記錄的eb值的明文在a與b之間,若沒有一條這樣的記錄,則找到其中eb的值小于a且最接近于a的記錄(在比較時(shí),a的填充序列視為最小值0,b的填充序列視為最大值,下同),再檢索該記錄的子塊,再對(duì)該子塊做類似的處理,如此下去,直到有一塊p其中有1個(gè)或1個(gè)以上的記錄其eb值的明文范圍在a與b值之間,設(shè)這些記錄中ord2值最小的記錄為t,其ord2值為u,ord2值最大的記錄為m,其ord2值為v,則p中ord2值在u與v-1(閉區(qū)間)之間的記錄與下一層w(層號(hào)比p的層號(hào)大1)中的記錄按p.eb=w.et,的方式構(gòu)造一個(gè)聯(lián)接條件,然后再將下一層和下一層的下一層y(層號(hào)比p的層號(hào)大2)中的記錄按w.eb=y(tǒng).et的方式構(gòu)造一個(gè)聯(lián)接條件,如此下去,直到最后聯(lián)接到層號(hào)為最大值的層z中的記錄,再將z中的記錄和和表a中的記錄按z..eb=a.m的方式構(gòu)造一個(gè)聯(lián)接條件,如此可構(gòu)造出一個(gè)聯(lián)接查詢的sql語句sql1,用它可以檢索出大部分符合條件的a中的記錄;設(shè)p中ord2值為比u小的記錄中ord2最大的記錄為g(如果不存在,則不進(jìn)行此步驟),其eb值的明文為gebp,p中ord2值為v的記錄為d,其eb值的明文為debp,則把g的所有子孫塊和d的所有子孫塊分別看作另外兩個(gè)輔助數(shù)據(jù)結(jié)構(gòu),遞歸的運(yùn)用上述方法,則可以得到最多2L-1(L為輔助數(shù)據(jù)結(jié)構(gòu)的總共的層數(shù))條sql語句,將這些sql語句并起來,成為一條sql語句,再由該語句檢索出表a中所有滿足條件的記錄。實(shí)現(xiàn)這種查詢需要中間件和數(shù)據(jù)庫服務(wù)器之間的L+1次交互,但因?yàn)檩o助數(shù)據(jù)結(jié)構(gòu)的特殊設(shè)計(jì)和輔助數(shù)據(jù)結(jié)構(gòu)的聚集索引的建立,前L次交互可以迅速完成。
因?yàn)樵跀?shù)據(jù)庫的sql語言里,聯(lián)接查詢亦可用含in語句的嵌套查詢或含exist的相關(guān)子查詢等表達(dá),如where a.m=x.eb and f(x)(f(x)表示用sql語言表達(dá)的對(duì)x表中記錄的條件限制)可表達(dá)為where a.m in(select eb from x where f(x))或where exist(select*from x where x..eb=a.m and f(x)),所以,上述的聯(lián)接查詢是指廣義上的聯(lián)接查詢,包含其它與聯(lián)接查詢等效的操作。
對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)2的密文的查詢先用類似于對(duì)數(shù)據(jù)結(jié)構(gòu)2的維護(hù)的方法分別得出a和b在輔助數(shù)據(jù)結(jié)構(gòu)中各自的4個(gè)記錄序列,再用這些序列不難得出a和b的大小在輔助數(shù)據(jù)結(jié)構(gòu)各層次的bn項(xiàng)中所處的位置,因而獲得用上述方法構(gòu)造范圍查詢sql語句而需要的相關(guān)參數(shù),從而構(gòu)造出相應(yīng)的sql語句。
對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)3的密文的查詢與輔助數(shù)據(jù)結(jié)構(gòu)1的密文查詢類似,只不過將字段之間的等值聯(lián)接變成對(duì)對(duì)象a的ref屬性進(jìn)行unnest操作后形成的表的ref字段與對(duì)象b的取ref值操作的結(jié)果進(jìn)行等值聯(lián)接。例如如果輔助數(shù)據(jù)結(jié)構(gòu)a表只有兩層,則第一層和第二層之間的聯(lián)接在對(duì)象—關(guān)系型oracle中可表達(dá)為select…from a as al,a asa2,unnest(al.j-array)as a3where a3.ref=ref(a2)and al.ord1=1 and f(a3)。f(a3)表不用sql語言表達(dá)的對(duì)對(duì)象中j類結(jié)構(gòu)的條件限制。
對(duì)于輔助數(shù)據(jù)結(jié)構(gòu)4的密文的查詢先用類似于對(duì)數(shù)據(jù)結(jié)構(gòu)2的維護(hù)的方法分別得出a和b在輔助數(shù)據(jù)結(jié)構(gòu)中各自的4個(gè)j類結(jié)構(gòu)序列,再用這些序列不難得出a和b的大小在輔助數(shù)據(jù)結(jié)構(gòu)各層次的bn項(xiàng)中所處的位置,因而獲得用上述輔助數(shù)據(jù)結(jié)構(gòu)3的密文的查詢方法構(gòu)造范圍查詢sql語句而需要的相關(guān)參數(shù),從而構(gòu)造出相應(yīng)的sql語句。
密文查詢的具體步驟如下(下面只說明了在between查詢語句中的處理情況,這是最復(fù)雜的,在>查詢語句和<查詢語句中可以用相同的技術(shù)使用更少的步驟和處理來完成)(1)當(dāng)應(yīng)用程序發(fā)過來的sql查詢語句中含有對(duì)表a中密文字段m的條件查詢要求,如m between a and b(a和b在由應(yīng)用程序傳送給中間件服務(wù)器時(shí),用事先協(xié)商好的密鑰加密,中間件得到它后再解密為明文)時(shí),中間件攔截之,在同一事務(wù)中執(zhí)行下列操作1、用類似上述輔助數(shù)據(jù)結(jié)構(gòu)維護(hù)中的步驟,確定a和b在輔助數(shù)據(jù)結(jié)構(gòu)的每一層中,其大小(比較時(shí)a的填充位視為最小值0,b的填充位視為最大值)處在哪兩個(gè)同層相鄰記錄(或j類結(jié)構(gòu))的eb值之間(先用上述插入或刪除的步驟,找到對(duì)應(yīng)明文值a或b在每一層中的對(duì)應(yīng)的記錄r或j類結(jié)構(gòu)r,再找出比r的eb值大的r的同層相鄰兄弟記錄或同層相鄰j類結(jié)構(gòu)r’,則在每一層中的對(duì)應(yīng)r和r’即是所求,若b在第x層對(duì)應(yīng)的r不存在這樣的r’,則設(shè)置一個(gè)r’,該r’的其它字段與該層中的r相同,但是其ord2值比該r的ord2值大1),設(shè)a在第i層處在a1i和a2i兩個(gè)同層相鄰兄弟記錄(或j類結(jié)構(gòu))之間(i為從最小層號(hào)到最大層號(hào)之間(閉區(qū)間)的任意值);2、設(shè)b在第i層處在b1i和b2i兩個(gè)同層相鄰兄弟記錄(或j類結(jié)構(gòu))之間,設(shè)輔助數(shù)據(jù)結(jié)構(gòu)的最大層號(hào)為max,若為輔助數(shù)據(jù)結(jié)構(gòu)3、4,設(shè)a1i所在的對(duì)象的引用為refa1i,a2i所在的對(duì)象的引用為refa2i,b1i所在的對(duì)象的引用為refb1i,b2i所在的對(duì)象的引用為refb2i,則按以下步驟構(gòu)造出進(jìn)行高效密文查詢的sql語句(2)找到最小的k,使得當(dāng)i>=k時(shí),二元組(a1i,a2i)不等于(b1i,b2i);(3)構(gòu)造sql語句sql1=select xmax.eb from x as xk,x as xk+1……,x as xmax-1,x as xmaxwhere xk.ord1=k,xk+1.ord1=k+1,……,xmax.ord1=max and xk.eb=xk+1.et and xk+1.eb=xk+2.etand……and xmax-1.eb=xmax.et and xk.ord2 between a2k.ord2 and(b1k.ord2-1)and xk.et=a2k.et,設(shè)其為sql1(若為輔助數(shù)據(jù)結(jié)構(gòu)3或4,則相應(yīng)的sql語句變?yōu)閟elect xjmax.ref from xas xk,unnest(xkj-array)as xjk,x as xk+1,unnest(xk+1.j-array)as xjk+1……,x as xmax-1,unnest(xmax-1.j-array)as xjmax-1,x as xmax,unnest(xmax.j-array)as xjmaxwherexjk.ref=ref(xk+1)and xjk+1.ref=ref(xk+2)and……and xjmax-1.ref=ref(xmax)and xjk.ord2 betweena2k.ord2and(b1k.ord2-1)and refb1k=ref(xk))(若k等于最后一層的層號(hào),則其中的between語句變?yōu)閤k.ord2 between a2k.ord2 and b1k.ord2或者xjk.ord2 between a2k.ord2 andb1k.ord2);(4)若k<max,構(gòu)造sql語句select xmax.eb from x as xk+1,x as xk+2……,x as xmax-1,x asxmaxwhere xk+1.ord1=k+1,xk+2.ord1=k+2,……,xmax.ord1=max and xk+1.eb=xk+2.et andxk+2.eb=xk+3.et and……and xmax-1.eb=xmax.et and xk+1.ord2>a1k+1.ord2 and xk+1.et=alk.eb(若為輔助數(shù)據(jù)結(jié)構(gòu)3、4,則為select xjmax.ref from x as xk+1,unnest(xk+1.j-array)as xjk+1,x as xk+2,unnest(xk+2.j-array)as xjk+2……,x as xmax-1,unnest(xmax-1.j-array)as xjmax-1,x as xmax,unnest(xmax.j-array)as xjmaxwhere xjk+1.ref=ref(xk+2)and xjk+2.ref=ref(xk+3)and……andxjmax-1.ref=ref(xmax)and xjk+1.ord2>alk+1.ord2 and refa1k+1=ref(xk+1)),設(shè)其為sql2,令sql1=(sql1)UNION(sql2);(5)若k<max,構(gòu)造sql語句select xmax.eb from x as xk+1,x as xk+2……,x as xmax-1,x asxmaxwhere xk+1.ord1=k+1,xk+2.ord1=k+2,……,xmax.ord1=max and xk+1.eb=xk+2.et andxk+2.eb=xk+3.et and……and xmax-1.eb=xmax.et and xk+1.ord2<b1k+1.ord2 and xk+1.et=b1k.eb(若為輔助數(shù)據(jù)結(jié)構(gòu)3或4,則為select xjmax.ref from x as xk+1,unnest(xk+1.j-array)as xjk+1,x asxk+2,unnest(xk+2.j-array)as xjk+2……,x as xmax-1,unnest(x max-1.j-array)as xjmax-1,x as xmax,unnest(xmax.j-array)as xjmaxwhere xjk+1.ref=ref(xk+2)and xjk+2.ref=ref(xk+3)and……andxjmax-1.ref=ref(xmax)and xjk+1.ord2<b1k+1.ord2 and refb1k+1=ref(xk+1))(若k+1等于最后一層的層號(hào),則其中的<語句變?yōu)閤k+1.ord2<=b1k+1.ord2或xjk+1.ord2<=b1k+1.ord2),設(shè)其為sql12,令sql1=(sql1)UNION(sql2);(6)若k<max-1,則令k=k+1,跳到步驟(4)繼續(xù)執(zhí)行;若k=max-1,則執(zhí)行步驟(6);(7)將原語句中的密文范圍查詢條件m between a and b用m in(sql1)取代(若為輔助數(shù)據(jù)結(jié)構(gòu)3或4,則用ref(a)in(sql1)替換);(8)將修改后的sql語句執(zhí)行,并將執(zhí)行后的結(jié)果中的m字段解密,用用戶的密鑰加密,再傳送給用戶。
上述密文查詢的步驟中涉及的數(shù)據(jù)庫操作均在同一事務(wù)中。由于等值查詢是一種特殊的范圍查詢,所以可以方便的運(yùn)用上述密文查詢的方法予以實(shí)現(xiàn)。
五.實(shí)施例的補(bǔ)充說明1.本實(shí)施例步驟沒有出錯(cuò)處理,但本專業(yè)的技術(shù)人員可以容易的將其添加進(jìn)去,通常在一個(gè)數(shù)據(jù)庫操作中出現(xiàn)錯(cuò)誤時(shí)需將它所在的事務(wù)回滾并向用戶端報(bào)錯(cuò)。
2.本實(shí)施例所列出的類sql語句只是為了說明問題,并不完全符合標(biāo)準(zhǔn)的sql詞法和語法要求,但本專業(yè)的技術(shù)人員可以根據(jù)它們所表達(dá)的方法容易的寫出能產(chǎn)生符合規(guī)范的sql語句的程序來。
3.本實(shí)施例所述的只是一般的處理方法,根據(jù)具體的數(shù)據(jù)庫管理系統(tǒng)或編程環(huán)境其細(xì)節(jié)或表達(dá)方式會(huì)有所不同,但本專業(yè)的技術(shù)人員可以根據(jù)它所表達(dá)的方法容易的寫出能在具體環(huán)境中加以運(yùn)用的程序來。
4.為敘述方便起見,本實(shí)施例假設(shè)欲實(shí)現(xiàn)密文查詢的數(shù)據(jù)的類型是無符號(hào)整型,但其方法可適用于任何數(shù)據(jù)類型,只需將其操作根據(jù)具體數(shù)據(jù)類型稍加改動(dòng)即可。
權(quán)利要求
1.一種數(shù)據(jù)庫密文查詢的方法,其特征是一種利用輔助數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)數(shù)據(jù)庫快速密文查詢的方法,它包括建立輔助數(shù)據(jù)結(jié)構(gòu)、維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)和進(jìn)行密文查詢的步驟,具體如下(1)建立輔助數(shù)據(jù)結(jié)構(gòu)其步驟包括1)確定數(shù)據(jù)庫中的哪些表中的哪些字段需要進(jìn)行密文查詢,2)對(duì)于確定的每一個(gè)這樣的表a中的字段m,建立相應(yīng)的輔助數(shù)據(jù)結(jié)構(gòu),3)對(duì)于所建立的輔助數(shù)據(jù)結(jié)構(gòu),至少在其數(shù)據(jù)量處于峰值時(shí),應(yīng)具有如下特征(a)至少用數(shù)據(jù)庫中的一個(gè)表存儲(chǔ),(b)至少包含兩個(gè)層次,每一層次至少包含一個(gè)塊,塊和層次是通過預(yù)先設(shè)定的特征識(shí)別在一起的對(duì)象或記錄的集合,所有塊中至少有一塊包含數(shù)目不大于一個(gè)預(yù)先設(shè)定的值的索引項(xiàng),索引項(xiàng)存儲(chǔ)在對(duì)象或記錄中,至少有一個(gè)索引項(xiàng)中包含至少一個(gè)密文字段,層次的高低關(guān)系通過預(yù)先設(shè)定的特征加以確定,(c)至少有一對(duì)高低相鄰的兩個(gè)層次,其中較高層中至少存在一個(gè)滿足以下聯(lián)系關(guān)系的索引項(xiàng)它通過它的至少一個(gè)引用類型字段的指向關(guān)系,或通過它的至少一個(gè)字段與低一層次中等值的字段的關(guān)系,與較低層中的至少一個(gè)塊或一個(gè)塊中的索引項(xiàng)相聯(lián)系,(d)在所有的索引項(xiàng)中至少有一個(gè)索引項(xiàng)x,若x是具有特征(c)所述的聯(lián)系關(guān)系的較高層中的索引項(xiàng),則至少對(duì)于一個(gè)其所聯(lián)系的塊或一個(gè)其所聯(lián)系的索引項(xiàng)所在的塊,設(shè)其為y,那么,y中的至少一個(gè)索引項(xiàng)中的至少一個(gè)密文字段的明文,與索引項(xiàng)x中的至少一個(gè)密文字段的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(e)至少對(duì)于一對(duì)在同一層中的索引項(xiàng)z和w,以及z的一個(gè)密文字段j和w的一個(gè)密文字段k,其中z是具有特征(c)所述的聯(lián)系關(guān)系的較高層中的索引項(xiàng),若j和k的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,則至少對(duì)于z所聯(lián)系的一個(gè)塊或一個(gè)其所聯(lián)系的索引項(xiàng)所在的塊u,u中的至少一個(gè)索引項(xiàng)的至少一個(gè)密文字段的明文與密文字段k的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(f)在最后一層中,至少一個(gè)索引項(xiàng)滿足以下聯(lián)系關(guān)系它通過它的至少一個(gè)引用類型字段的指向關(guān)系,或通過它的至少一個(gè)字段與a表中等值的字段的關(guān)系,與a表中的至少一個(gè)記錄或?qū)ο笙嗦?lián)系,(g)至少對(duì)于最后一層中的一個(gè)索引項(xiàng),設(shè)其為v,若v是滿足條件(f)中聯(lián)系關(guān)系的索引項(xiàng),則v的至少一個(gè)密文字段的明文與這些與其相聯(lián)系的記錄中的至少一條記錄的m字段的明文滿足預(yù)先設(shè)定的數(shù)學(xué)關(guān)系,(2)維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)其步驟是對(duì)需要實(shí)現(xiàn)密文查詢的字段進(jìn)行修改,包括插入、刪除、更新時(shí),應(yīng)根據(jù)對(duì)數(shù)據(jù)庫的修改要求,通過對(duì)輔助數(shù)據(jù)結(jié)構(gòu)的查詢來確定并執(zhí)行其維護(hù)操作,同時(shí)利用數(shù)據(jù)庫的事務(wù)管理機(jī)制保證數(shù)據(jù)庫及輔助數(shù)據(jù)結(jié)構(gòu)的一致性、完整性,(3)進(jìn)行密文查詢至少含有如下的步驟至少利用密鑰、檢索要求,輔助數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)及其特征,輔助數(shù)據(jù)結(jié)構(gòu)與表a的關(guān)系,以及數(shù)據(jù)庫管理系統(tǒng)所支持的操作接口,從數(shù)據(jù)庫中檢索出數(shù)據(jù)。
2.如權(quán)利要求1所述的數(shù)據(jù)庫密文查詢的方法,其特征在于在維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)或進(jìn)行密文查詢的步驟中,使用介于數(shù)據(jù)庫管理系統(tǒng)和用戶之間的中間件。
3.如權(quán)利要求2所述的數(shù)據(jù)庫密文查詢的方法,其特征在于在進(jìn)行密文查詢使用中間件進(jìn)行數(shù)據(jù)庫操作時(shí),至少包括如下步驟(1)攔截用戶的數(shù)據(jù)庫查詢請(qǐng)求,(2)分析該數(shù)據(jù)庫查詢請(qǐng)求,(3)若該數(shù)據(jù)庫查詢請(qǐng)求涉及對(duì)密文字段預(yù)先設(shè)定的查詢,則從數(shù)據(jù)庫中進(jìn)行至少一次查詢輔助數(shù)據(jù)結(jié)構(gòu)的操作并對(duì)操作結(jié)果進(jìn)行分析,并執(zhí)行步驟(4),(4)至少根據(jù)第3步的結(jié)果重構(gòu)并執(zhí)行用戶的數(shù)據(jù)庫查詢請(qǐng)求。
4.如權(quán)利要求3所述的數(shù)據(jù)庫密文查詢的方法,其特征在于數(shù)據(jù)庫操作是在一個(gè)數(shù)據(jù)庫事務(wù)中。
5.如權(quán)利要求2所述的數(shù)據(jù)庫密文查詢的方法,其特征在于維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)使用中間件進(jìn)行數(shù)據(jù)庫操作時(shí),至少包括如下步驟(1)攔截用戶的數(shù)據(jù)庫修改請(qǐng)求,(2)分析該數(shù)據(jù)庫修改請(qǐng)求,(3)若數(shù)據(jù)庫修改請(qǐng)求涉及對(duì)密文字段預(yù)先設(shè)定的修改,則從數(shù)據(jù)庫中進(jìn)行至少一次檢索輔助數(shù)據(jù)結(jié)構(gòu)的操作并對(duì)操作結(jié)果進(jìn)行分析,(4)至少根據(jù)第3步的結(jié)果及用戶的數(shù)據(jù)庫修改請(qǐng)求對(duì)輔助數(shù)據(jù)結(jié)構(gòu)進(jìn)行維護(hù)。
6.如權(quán)利要求5所述的數(shù)據(jù)庫密文查詢的方法,其特征在于數(shù)據(jù)庫操作是和用戶的數(shù)據(jù)庫修改操作設(shè)置在一個(gè)數(shù)據(jù)庫事務(wù)中。
7.如權(quán)利要求1所述的數(shù)據(jù)庫密文查詢的方法,其特征在于在維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)或進(jìn)行密文查詢的步驟中使用存儲(chǔ)過程。
8.如權(quán)利要求7所述的數(shù)據(jù)庫密文查詢的方法,其特征在于在存儲(chǔ)過程中至少傳遞一個(gè)函數(shù)值作為參數(shù),這個(gè)函數(shù)值應(yīng)根據(jù)用戶傳遞的一個(gè)數(shù)的明文的至少一位計(jì)算而得。
9.如權(quán)利要求1所述的數(shù)據(jù)庫密文查詢的方法,其特征在于在完成建立輔助數(shù)據(jù)結(jié)構(gòu)后,應(yīng)在輔助數(shù)據(jù)結(jié)構(gòu)的至少一個(gè)表上建立聚集索引。
10.如權(quán)利要求1所述的數(shù)據(jù)庫密文查詢的方法,其特征在于輔助數(shù)據(jù)結(jié)構(gòu)和對(duì)應(yīng)欲實(shí)施密文查詢的表是建立在同一個(gè)數(shù)據(jù)庫中。
全文摘要
本發(fā)明是一種利用輔助數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)數(shù)據(jù)庫快速密文查詢的方法,它包括建立輔助數(shù)據(jù)結(jié)構(gòu)、維護(hù)輔助數(shù)據(jù)結(jié)構(gòu)和進(jìn)行密文查詢的步驟,其技術(shù)的要點(diǎn)是通過為欲實(shí)現(xiàn)密文查詢的字段建立用數(shù)據(jù)庫中的表存儲(chǔ)的輔助的數(shù)據(jù)結(jié)構(gòu),在數(shù)據(jù)庫的日常操作中插入對(duì)輔助數(shù)據(jù)結(jié)構(gòu)的維護(hù)操作,并利用輔助數(shù)據(jù)結(jié)構(gòu)來查詢密文字段。本發(fā)明可使原有的不支持密文查詢的數(shù)據(jù)庫系統(tǒng)能對(duì)加密字段進(jìn)行高效密文查詢,且能由用戶選用加密算法和密鑰,并可充分利用原有數(shù)據(jù)庫系統(tǒng)的事務(wù)機(jī)制來保證整個(gè)數(shù)據(jù)庫的一致性,以及密文檢索和其它數(shù)據(jù)庫操作的正確性、完整性。本發(fā)明可用于對(duì)安全性要求較高的政府、軍隊(duì)和大型企業(yè)的數(shù)掘庫系統(tǒng),能改善系統(tǒng)的安全性能,提高系統(tǒng)的實(shí)用性。
文檔編號(hào)G06F17/30GK1786963SQ20051013090
公開日2006年6月14日 申請(qǐng)日期2005年12月8日 優(yōu)先權(quán)日2005年7月21日
發(fā)明者曾致中 申請(qǐng)人:曾致中