CN100370460C - 一种数据库密文查询的方法 - Google Patents
一种数据库密文查询的方法 Download PDFInfo
- Publication number
- CN100370460C CN100370460C CNB2006100772854A CN200610077285A CN100370460C CN 100370460 C CN100370460 C CN 100370460C CN B2006100772854 A CNB2006100772854 A CN B2006100772854A CN 200610077285 A CN200610077285 A CN 200610077285A CN 100370460 C CN100370460 C CN 100370460C
- Authority
- CN
- China
- Prior art keywords
- data structure
- secondary data
- value
- database
- piece
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Abstract
本发明是一种利用辅助数据结构实现数据库快速密文查询的方法,它包括建立辅助数据结构、维护辅助数据结构和进行密文查询的步骤,其技术要点是为欲实现密文查询的字段建立用数据库中的表存储的辅助数据结构,在数据库的日常操作中插入对辅助数据结构的维护操作,并利用辅助数据结构来查询密文字段。本发明可使原有的不支持密文查询的数据库系统能对加密字段进行高效密文查询,且能选用高安全性的加密算法和密钥,并可充分利用原有数据库系统的事务机制和存储管理机制进行事务管理和存储管理,降低系统的开发和维护、使用的代价。本发明可用于对安全性要求较高的政府、军队和大型企业的数据库系统,能改善系统的安全性能,提高系统的实用性。
Description
技术领域
本发明属于计算机数据库及信息安全相关领域。具体涉及对数据库中的加密字段实现高效查询的方法。
背景技术
由于安全性问题的突出,越来越多的数据库对敏感数据进行加密以保障其安全性。由于现在数据库管理系统绝大多数由国外进口,但首先国外支持密文查询的主要数据库管理系统不对中国出口,且国外的数据库管理系统源代码多不公开,很可能存在安全后门和漏洞,而且数据库管理系统软件非常复杂,其安全性难于证明;其次为了提高效率,越来越多的企业将软件和数据交由专门的机构管理和维护,如果密钥管理和加解密过程由数据库管理系统实施则数据库管理方的权力过大,不利于整个系统的安全性,所以有必要开发一种独立于数据库管理系统的支持密文查询的数据库加解密技术,使安全管理和软件、数据的日常维护优化相分离。由于加密之后,数据之间原来具有的偏序关系就会丧失,因而无法通过建立索引来加快对密文数据的范围查询,因而只能对未加密的字段进行范围查询,而不能对加密的字段进行范围查询。这极大的影响了数据库的效用。为了解决这一问题,现在一般采用同态加密和密文索引的方法。
同态加密是通过设计新的加密算法,使密文在一定程度上保持原有明文的偏序关系,使得对明文中一个范围的查询可以转换为对密文中若干个新范围的查询,从而可以通过对密文建立索引和修改查询的数据库操作语句实现快速的密文查询。这种同态加密其加密强度往往较弱,易于被攻破,安全性不高;密文索引是指在数据库之外另外建立一个索引文件记录密文的偏序关系,在查询时,先由相应程序检索该文件,得出满足条件的密文项集合,再构造数据库操作语句从数据库中检索出含有这些密文项的记录。这种方法可以采用高加密强度的算法,但是,由于索引文件不是数据库的一部分,数据库管理系统无法对它实行并发控制和故障恢复、死锁检测等。且往往因无法充分利用原数据库管理系统的查询优化机制和存储管理、优化机制,系统效率较低。
发明内容
本发明所要解决的技术问题是:提供一种数据库密文查询的方法,使得原有的不支持密文查询的数据库系统能对加密字段进行高效范围和等值查询,且可以选用高安全性的加密算法和密钥,且可以充分利用原有数据库系统的事务机制来进行事务管理,保证整个数据库的一致性,保证密文检索结果和其它数据库操作的正确性、完整性,检测死锁的发生等,降低系统的开发和维护、使用的难度和代价。
本发明解决其技术问题所采用的技术方案是:利用辅助数据结构,在数据库管理系统软件之外实现数据库快速密文查询的方法,它至少包括建立辅助数据结构、维护辅助数据结构和进行密文查询的步骤。具体如下:
一、建立辅助数据结构:
其步骤包括:
1.确定数据库中的哪些表中的哪些字段需要进行密文查询,以及
2.建立至少一个辅助数据结构,辅助数据结构至少用所述数据库中的一个表存储,
辅助数据结构建立后,其中的数据须满足预先定义的特征以便于快速检索和维护,以及在密文查询字段选用高安全性加密算法和密钥加密的条件下,利用辅助数据结构从数据库中快速检索出符合密文查询条件的数据,在辅助数据结构中至少利用加密手段保证机密数据的安全性,
3.至少在一种对辅助数据结构进行维护的情形和一种利用辅助数据结构进行密文查询的情形时,其操作步骤基于至少具有以下特征的辅助数据结构:
(1)辅助数据结构包含层次,每一层次至少包含一个块,块和层次是通过预先定义的特征识别在一起的数据的集合,所有块中至少有一个块,可以从其中得到至少一个,至多不大于一个可由预先定义的方式得到的值的索引项,
(2)当辅助数据结构包含两个或两个以上的层次时,则至少有一个块x,在从其中得到的索引项中,至少有一个索引项通过预先定义的关系与另一个块y相关联,
(3)当辅助数据结构包含两个或两个以上的层次时,则至少对于一对可从同一层中的块中得出的索引项z和w,若z和w满足预先定义的关系,且它们都有如(2)中所述的相关联的块,则至少对于一个z所关联的块k和一个w所关联的块j,从k和j中可以分别得出一个索引项,这两个索引项满足预先定义的关系,
(4)至少对于一个辅助数据结构,若它可用来辅助实现某个表a中密文字段m的密文查询,则从该辅助数据结构中至少可以得出一个索引项f,它通过预先定义的关系,和表a中的至少一个记录或对象相联系。
二、维护辅助数据结构:
至少在一种涉及欲实现密文查询的字段中存储的数据的数据库修改情形时,对辅助数据结构进行维护,使之满足建立辅助数据结构步骤中所述的辅助数据结构建立后的特征,至少在一种对辅助数据结构的维护情形中,含有以下步骤:
1.对辅助数据结构进行检索,
2.至少利用检索结果对辅助数据结构进行维护,
上述步骤会利用数据库管理系统提供的操作接口和对应的对数据库的修改内容,至少在一种涉及维护辅助数据结构的操作情形时,利用数据库管理系统的事务机制进行事务管理。
三、进行密文查询:
至少在一种涉及密文字段的查询情形时,应该至少利用检索要求、辅助数据结构,以及数据库管理系统所提供的操作接口,从数据库中检索出数据。
本发明与现有技术相比,具有如下显著技术效果:
使得原有的不支持密文查询的数据库系统能对加密字段进行高效范围和等值查询,且可以选用高安全性的加密算法和密钥,且可以充分利用原有数据库系统的事务机制来进行事务管理,保证整个数据库的一致性,保证密文检索结果和其它数据库操作的正确性、完整性,检测死锁的发生,降低系统的开发和维护、使用的难度和代价。
本发明可用于对安全性要求较高的政府、军队和大型企业的数据库系统,能改善系统的安全性能,提高系统的实用性。
附图说明
附图展示了中间件在整个数据库系统中的位置;
该图只注明了ODBC,实际可为ODBC、JDBC、OLE DB等多种形式。
具体实施方式
本发明提供的是一种在数据库管理系统软件之外,利用辅助数据结构实现数据库快速密文查询的方法,其要点是通过为欲实现密文查询的字段建立用数据库中的表存储的辅助的数据结构,在数据库的日常操作中插入对辅助数据结构的维护操作,并利用辅助数据结构来查询密文字段。本方法至少包括建立辅助数据结构、维护辅助数据结构和进行密文查询的步骤,具体如下:
一.建立辅助数据结构
其步骤包括:
1.确定数据库中的哪些表中的哪些字段需要进行密文查询,
2.建立至少一个辅助数据结构,辅助数据结构至少用所述数据库中的一个表存储,
辅助数据结构建立后,其中的数据须满足预先定义的特征以便于快速检索和维护,以及在密文查询字段选用高安全性加密算法和密钥加密的条件下,利用辅助数据结构从数据库中快速检索出符合密文查询条件的数据,在辅助数据结构中至少利用加密手段保证机密数据的安全性,
3.至少在一种对辅助数据结构进行维护的情形和一种利用辅助数据结构进行密文查询的情形时,其操作步骤基于至少具有以下特征的辅助数据结构:
(1)辅助数据结构包含层次,每一层次至少包含一个块,块和层次是通过预先定义的特征识别在一起的数据的集合,所有块中至少有一个块,可以从其中得到至少一个,至多不大于一个可由预先定义的方式得到的值的索引项,
(2)当辅助数据结构包含两个或两个以上的层次时,则至少有一个块x,在从其中得到的索引项中,至少有一个索引项通过预先定义的关系与另一个块y相关联,
(3)当辅助数据结构包含两个或两个以上的层次时,则至少对于一对可从同一层中的块中得出的索引项z和w,若z和w满足预先定义的关系,且它们都有如(2)中所述的相关联的块,则至少对于一个z所关联的块k和一个w所关联的块j,从k和j中可以分别得出一个索引项,这两个索引项满足预先定义的关系,
(4)至少对于一个辅助数据结构,若它可用来辅助实现某个表a中密文字段m的密文查询,则从该辅助数据结构中至少可以得出一个索引项f,它通过预先定义的关系,和表a中的至少一个记录或对象相联系。
在完成建立辅助数据结构后,应在需进行密文查询的字段所在的表上建立索引。
二.维护辅助数据结构
至少在一种涉及欲实现密文查询的字段中存储的数据的数据库修改情形时,对辅助数据结构进行维护,使之满足建立辅助数据结构步骤中所述的辅助数据结构建立后的特征,至少在一种对辅助数据结构的维护情形中,含有以下步骤:
(1)对辅助数据结构进行检索,
(2)至少利用检索结果对辅助数据结构进行维护,
上述步骤会利用数据库管理系统提供的操作接口和对应的对数据库的修改内容,至少在一种涉及维护辅助数据结构的操作情形时,利用数据库管理系统的事务机制进行事务管理。
在维护辅助数据结构的步骤中可以使用存储过程。
在进行辅助数据结构的维护时,可以使用介于数据库管理系统和用户之间的中间件。维护辅助数据结构使用中间件进行数据库操作时,至少在一种维护辅助数据结构的情形时至少含有如下步骤:
(1)拦截用户的数据库修改请求,
(2)分析该数据库修改请求,
(3)进行至少一次检索辅助数据结构的操作,
(4)至少根据步骤(3)的结果及用户的数据库修改请求对辅助数据结构进行维护。
上述步骤中的数据库操作是和用户的数据库修改操作设置在一个数据库事务中。
三.进行密文查询
至少在一种涉及密文字段的查询情形时,应该至少利用检索要求、辅助数据结构,以及数据库管理系统所提供的操作接口,从数据库中检索出数据。并且含有以下处理:对辅助数据结构进行检索和从数据库中检索出数据。
在进行密文查询的步骤中可以使用存储过程。
在进行密文查询时,可以使用介于数据库管理系统和用户之间的中间件。在进行密文查询使用中间件进行数据库操作时,至少在一种密文查询的情形时,至少含有如下步骤:
(1)拦截用户的数据库查询请求,
(2)分析该数据库查询请求,
(3)若该数据库查询请求涉及对密文字段预先设定的查询,则根据用户的查询要求,利用辅助数据结构从数据库中检索出数据。
上述步骤中的数据库操作是设置在一个数据库事务中。
四.具体实施例
(一)辅助数据结构的建立与维护:
辅助数据结构的结构和性质在本质上类似于传统索引结构中的B+树,其主要区别在于:他不是通过直接对原数据库中的表中的字段建立索引,并将索引的维护工作交由数据库管理系统完成,而是通过在数据库中建立表进行存储,并由中间件通过数据库管理系统提供的操作接口自行进行维护,维护工作对数据库管理系统透明,查询时再由中间件利用辅助数据结构快速实现,过程也对数据库管理系统透明,但对于和辅助数据结构相关的并发控制、死锁检测等事务管理以及存储管理和优化的任务则依然交由数据库管理系统完成。具体如下:
对数据库中要实现密文条件查询(包括等值条件查询和范围条件查询)的每一个表a中的密文字段m,在同一个数据库中建立一个能用原有的数据库管理系统支持的数库操作语句维护和访问的表x,以存储用来加快查询速度的辅助数据结构,同时,由中间件软件拦截客户发往数据库服务器的数据库操作语句,对其中涉及到表a中的字段m的语句加以处理,以维护该辅助数据结构,并实现对加密字段的高效范围和等值查询。下文中提到的所有数,如非特别注明,均指以二进制形式表示。明文如非特别说明,均指对应密文项解密后再去掉填充比特所得的有意义的实际值。对所有的eb项的明文,填充比特的最后1位恒置为0,加密所需的明文填充位序列去掉最后1位后视为无符号整数,eb项的填充位的比较、设置及加1操作等均指对此无符号整数进行,er、el、ep的填充位则无此关于最后1位的约定。且设填充位设置足够长,不可能循环。eb、et、er、el、ep等密文项的对应明文的有效位数相等,填充位的长度亦相等。密文项的比较如非另外注明,均指比较其明文的大小,如明文相等则比较其填充位的大小。密文的大小如非另外注明,也是指其明文和填充位整数如此组合的大小。密文字段m的明文假设为无符号整型。
1.辅助数据结构可采用的形式:
辅助数据结构1:
它是关系型数据库中的辅助数据结构,其特征如下:
该数据结构由至少两“层”构成,每一“层”由至少一个“块”组成,其中,第一层(层号为最小的一层)仅由一个块构成,称其为“根块”。每个“块”由若干条“索引项”组成,每个块的索引项条数均不多于一个常数t,亦不少于[t/2];若一个块没有父块或其父块没有其它子块,则该块的索引项条数亦可少于[t/2]。其中,t为一个常数,由索引项的大小和相应数据库的物理块的大小决定,以使一个“块”的大小的最大值略小于数据库的物理块的大小,一般t设在100~200之间。每条索引项都表示为关系x中的一条记录。关系x的每一个记录r由以下四个字段构成:et,eb,ord1,ord2;其中,et、eb和a表中密文字段m的类型相同,一般为BINARY或VARBINARY,且都是以密文形式存储在数据库中;同一层中的各索引项的eb值互不相同,但却允许有若干项eb值对应的明文相同:这是通过对相同的明文值填充不同的比特序列,再加密来实现的。ord1表明该记录所在的块在辅助数据结构中所属的层的层号;对于ord2,必须满足以下条件:其大小在同块中的排序(升序)的序号,等于该记录的eb项的大小在同块中的排序(升序)的序号,且同一块中各记录的ord2值互不相等。同一个“块”中的所有记录的et项具有相同的值,且其等于该“块”中的所有记录的eb项中的最小值。同一层中的任两个块其et值互不相等。除ord1值(即“层”号)最小的一层外,其它每一层中的每一个“块”中的所有记录的et值,都和“层”号比它所在的层的层号小1的“层”中的某一条记录的eb值相等,且只和其中的一条的eb值相等;反之,除ord1值最大的一层外,每一层中的每一条记录的eb项的值,都与“层”号比它所在的层的层号大1的“层”中的一个“块”中的所有记录的et值相等。除一开始初始化的一条其eb值为最小的记录的eb值外,层号最大的一层中的eb项的值与表a中的m字段的值一一对应。对于辅助数据结构中的一个记录n,若其eb字段值与一个“层”号比它所在层号大1的“块”d的et值相等,则记录n称为该块d的父记录,记录n所在的块称为该块d的父块,而该块d称为该记录n及n所在的块的子块,了块中的所有记录都称为父记录的子记录。对于辅助数据结构中的一个记录L,与L同一块,且其ord2值大于L记录的ord2值的记录中ord2值最小的记录与L互称为兄弟记录;与L同一块,且其ord2值小于L记录的ord2值的记录中ord2值最大的记录亦与L互称为兄弟记录。兄弟记录的子块彼此称为兄弟块。能通过某个记录p经过一次或多次迭代求子记录而找到的所有记录称为记录p的子孙记录,p的子孙记录所在的块称为p及其所在块的子孙块。能由p通过一次或多次迭代求父记录而找到的记录称为p的祖先记录,p的祖先记录所在的块称为p及其所在块的祖先块。如果一个记录s的eb字段的值小于与它同属一“层”的记录k的eb字段的值,那么s的所有子孙记录的eb字段的值亦小于记录k的eb字段的值。同一层次中所有的记录的eb值彼此间均不相等,但却允许有若干条记录的eb字段所对应的不包含填充位的明文相同,这可以通过对相同的明文值在其后填充不同的比特序列后再加密来实现。建立了该辅助数据结构之后,还要在关系x的属性组(ord1,et,ord2)上建立聚集索引,以使同属一个“块”的记录在物理存储时也尽量存储在同一个或两个物理块中,以加快对辅助数据结构访问和维护的速度。此外,还要在关系a的以密文形式存储的属性m上建立索引,索引可为聚集或非聚集的。
辅助数据结构的一个理想化的实例如下,其中,Ek(a,b)表示用密钥k对明文a再结合填充位b后再加密得到的密文值,其中t设为4,层数设为3。
块A,一条记录:(Ek(0,0),Ek(0,0),1,1);
块B,块A中第一条记录的子块,包含三条记录:(Ek(0,0),Ek(0,0),2,1),(Ek(0,0),Ek(22,1),2,2),(Ek(0,0),Ek(56,2),2,3);
块C,块B中第一条记录的子块,包含三条记录:(Ek(0,0),Ek(0,0),3,1),(Ek(0,0),Ek(7,2),3,2),(Ek(0,0),Ek(15,2),3,3);
块D,块B中第二条记录的子块,包含三条记录:(Ek(22,2),Ek(22,2),3,1),(Ek(22,2),Ek(30,2),3,2),(Ek(22,1),Ek(45,2),3,3);
块E,块B中第三条记录的子块,包含四条记录:(Ek(56,2),Ek(56,2),3,1),(Ek(56,2),Ek(60,2),3,2),(Ek(56,2),Ek(60,3),3,3),(Ek(56,2),Ek(68,2),3,4);
辅助数据结构2:
它是辅助数据结构1的一种变形。它可以显著减少中间件和数据库服务器之间在查询和修改密文字段时的通信次数和通信量,但其安全性不及辅助数据结构1。
在辅助数据结构1的基础上,它在每个记录(索引项)中又增加三个字段:el、er和ep。对于辅助数据结构中的一条记录bn,设ord2值比bn的ord2值小的bn的兄弟记录为bns,设bn的eb项的明文与bns的eb项的明文从最高有效位算起的最长公共前缀的长度为kb1位(空公共前缀的长度为0),则bn的el项的值是取该记录的eb项的明文(包括填充位)从最高有效位算起的前kb1+1位并第在kb1+2位置1,其余位填0,然后再加密所得的密文;若bns不存在,则bn的el项为空;设ord2值比bn的ord2值大的bn的兄弟记录为bnb(若bn不存在这种兄弟记录,则取它的父记录所在的块中ord2值比它父记录的ord2值大的父记录的兄弟记录为bnb,以此类推,不断上溯,如果一直到它在最顶层的祖先记录,若该祖先仍无这样的兄弟记录,则不存在bnb记录,则bn的er项设为空值),若记录bn的eb项与bnb的eb项的明文(包括填充位)从最高有效位算起的最长公共前缀长度为kb2位,则bn的el项的值是取该记录bn的eb项的明文(包括填充位)从最高有效位算起的前kb2+1位,并第在kb2+2位置1,其余位填0,然后再加密所得的密文。bn的ep项仅在bn为同块中ord2值最大的记录时才有意义,设bn的父记录bnf的ord2值较bnf的ord2值大的兄弟记录为bb,如果其父记录不存在这样的兄弟记录,则设它的父记录的父记录bnf2的ord2值较bnf2的ord2大的兄弟记录为bb,以此类推。如果一直追溯到它在ord1值最小的层中的祖先,该祖先仍无这样的兄弟记录,则bn的ep项无意义,为空值。设bn与bb的eb项的明文(包括填充位)从最高有效位算起的最长公共前缀长度为kb3位,则bn的ep项的值为bb的eb项的明文(包括填充位)从最高有效位算起的前kb3+1位并在第kb3+2位置1,其余位填0,然后再加密所得的密文。该辅助数据结构的其它特征、以及索引的建立与辅助数据结构1完全相同。
在辅助数据结构1和2中,兄弟记录是同层相邻兄弟记录;如果两个记录aa和bb在同一层,且aa是它所在的块中ord2值最大的记录,bb是它所在的块中ord2值最小的记录,且aa的某个祖先记录aac与bb的某个祖先记录bbc是同一块中的兄弟记录,且aa的所有所在层次低于aac所在层次(层号大于aac的层号)的祖先记录(如果没有这样的祖先记录则无此项要求)均为所在块中ord2值最大的记录,bb的所有所在层次低于bbc所在层次(层号大于bbc的层号)的祖先记录(如果没有这样的祖先记录则无此项要求)均为所在块中ord2值最小的记录,且bbc的ord2值比aac的ord2值大,则aa和bb亦互为同层相邻兄弟记录。
辅助数据结构3:
它是辅助数据结构1的另一种变形,比辅助数据结构1和2更为高效,适用于对象-关系型数据库。其特征如下:
使用这种辅助数据结构时将含有加密字段m的表a设计为一个仅含有一个属性列的表,该属性列的类型为对象或结构类型a,原表a的所有属性变为该对象的属性。对应的辅助数据结构亦由数据库中的一个关系x存储,该关系的属性列仅有一个,类型为对象或结构类型x。它由至少二“层”构成,每一“层”包括至少一个类型为x的对象(或结构,下同)记录,其中,第一层(层号最小的一层)仅有一个对象,称为根对象。每个对象由以下属性构成:一个用来记录该对象所在的“层”的层号的属性ord1,一个结构类型j的数组j-array,一个用来记录结构类型j的数组的有效长度(数组的元素数量)的字段num;结构类型j由以下属性构成:一个和m类型相同的密文属性eb,一个指向类型为x的对象的引用类型ref(如果是最后一层则为指向a对象的引用类型),一个ord2字段,其值在整个数组中的ord2值中的排序(升序)应等于相应j类结构在数组中的位置,等于相应j类结构的eb项的大小在整个数组元素中的排序(升序),j类结构数组按其eb项明文值依次递增排列,同一对象中ord2值不重复。num的值不大于一个常数t,亦不小于[t/2],但是,若一个对象没有父对象或其父对象没有其它子对象,则其num值亦可小于[t/2]。t是一个常数,由j类结构的长度和和相应数据库的物理块的大小决定,以使一个对象的大小的最大值略小于数据库的物理块的大小。一般t设在100~200之间。除“层”号最大的一层外,所有的ref都指向一个“层”号比它自身所在的对象大1的x类对象。层号为最大的一层的x对象的每一个j结构的ref指向一个表a中的a类对像,除层号最小的一层外表x中的每一个x类对象g都被x表中层号比之小1的某个对象d的某个j结构的ref属性指向,且仅被一个这样的ref指向。除层号最大的一层的对象外,任何x类对象的任一j类型结构的eb属性都等于该j类结构的ref所指向的x类对象的所有j类型结构的eb属性中的最小值,该最小值是j类结构数组中最左边的j类结构的eb值。把一个对象的任一j类型结构的ref属性所指向的x类对象称为该对象和该j类结构的子对象。对于一个j类结构p,若它的ref属性指向一个x类对象o,则p称为该对象o的父j类结构,p所在的x类对象称为o的父对象。可由一个对象或一个j类结构通过一次或多次求子对象到达的对象称为该对象或该j类结构的子孙对象,子孙对象的j类结构称为子孙j类结构;可由一个对象或一个j类结构通过一次或多次求父对象和父j类结构到达的对象或j类结构,称为该对象或该j类结构的祖先对象或祖先j类结构。若一个对象的某个j类结构属性的eb属性小于某个和它同属一层的某个x类对象的某个j类结构属性的eb属性li,则该j类结构的子孙对象的所有j类结构的eb属性均小于li。层号最大的一层的x类对象中所包含的eb项,除一条一开始初始化的其eb值取最小的j类结构的eb项外,其它值与表a中的记录的m属性的值一一对应相等,其所在j类结构ref属性也相应指向对应的m属性所在的x表中的记录。一个j类结构数组中彼此相邻的j类结构互称为兄弟j类结构。任一层的所有x类对象所包含的所有eb值彼此两两不相等,但却允许有若干eb值所对应的明文(不包含填充位)相等,这可以通过对相同的明文值在其后填充不同的比特序列后再加密来实现。该辅助数据结构需要在该对象的ord1属性上建立索引,或者用一个专门的数据结构存储层号最小的那个对象的引用。对于a表也在其属性m上建立索引。
辅助数据结构4:
它是数据结构2的变形,适用于对象一关系型数据库。其特征如下:
它是通过在数据结构2的基础上,在每个对象的每个j类结构添加er和el、ep三个加密字段来实现。对于一个j类结构bn,设eb值比bn的eb值小的bn的兄弟j类结构为bns,bn的eb项的明文(包括填充位)与bns的eb项的明文(包括填充位)从最高有效位算起的最长公共前缀长为kb1位,则bn的el项的值是取bn的eb项的明文(包括填充位)从最高有效位算起的前kb1+1位并第在kb1+2位置1,其余位填0,然后再加密所得的密文;若bns不存在,则bn的el值为空;设eb值比bn的eb值大的bn的兄弟j类结构(若不存在这种j类结构,则取它的父j类结构所在的对象中eb值比它父j类结构的eb值大的父j类结构的兄弟j类结构,以此类推,不断上溯,如果一直到它在最顶层的祖先j类结构,若该祖先仍无这样的兄弟j类结构,则bn的er项设为空值)为bnb,bn的eb项的明文(包括填充位)与bnb的eb项的明文(包括填充位)从最高有效位算起的最长公共前缀长度为kb2位,则bn的er项的值是取bn的eb项的明文(包括填充位)从最高有效位算起的前kb2+1位并在第kb2+2位置1,其余位位填0,然后再加密所得的密文。bn的ep项仅在bn为同对象中eb值最大的j类结构时才有意义,设bn的父j类结构为bnf,eb值比bnf的eb值大的bnf兄弟j类结构为bb(如果bnf不存在这样的兄弟j类结构,则设bnf的相应的兄弟j类结构为bb,以此类推。如果一直追溯到它在最高层中的祖先,该祖先仍无这样的兄弟j类结构,则ep项无意义,为空值),设bn与bb的eb项的明文(包括填充位)从最高有效位算起的最长公共前缀长度为kb3位,则bn的ep项的值为bb的eb项的明文(包括填充位)从最高有效位算起的前kb3+1位并第在kb3+2位置1,其余位填0,然后再加密所得的密文。该辅助数据结构的其它特征,索引的建立与辅助数据结构3完全相同。
在辅助数据结构3、4中,兄弟j类结构是同层相邻兄弟j类结构;如果两个j类结构aa和bb在同一层,且aa是它所在的对象中eb值最大的j类结构,bb是它所在的对象中eb值最小的j类结构,且aa的某个祖先j类结构aac与bb的某个祖先j类结构bbc是同一对象中的兄弟j类结构,且aa的所有所在层次低于aac所在层次(层号大于aac的层号)的祖先j类结构(如果没有这样的祖先j类结构则无此项要求)均为所在对象中eb值最大的j类结构,bb的所有所在层次低于bbc所在层次(层号大于bbc的层号)的祖先j类结构(如果没有这样的祖先j类结构则无此项要求)均为所在对象中eb值最小的j类结构,且bbc的eb值比aac的eb值大,则aa和bb亦互为同层相邻兄弟j类结构。
2.辅助数据结构的初始化:
(1)对数据库中要实现密文条件查询,包括等值条件查询和范围条件查询的每一个表a中的密文字段m,在同一个数据库中建立一个可用普通SQL语句维护和访问的关系x,以存储用来加快查询速度的辅助数据结构。对于关系型数据库,该表可由以下字段组成:ord1,ord2,et,eb,el(可选),er(可选),ep(可选);对于对象-关系型数据库,该表可由一个对象类型x组成,该对象类型包含一个属性ord1,一个属性num,一个j类结构的数组j-array,j类结构包含一个属性eb和一个引用类型属性ref,一个属性ord2,一个属性er(可选),一个属性el(可选),一个属性ep(可选)。
(2)对于辅助数据结构1和2,先根据表a的可能的大小和t值的大小选择该辅助数据结构的层次数s。选择的标准应使按上述辅助数据结构的特征使得最后一层的最小可能容量(记录数)大于表a的最大可能记录数的两到三倍。一般选择5~6层即可,除非表a的记录数可能特别巨大,如超过10亿条。然后,在每一层插入一条记录,这些记录的et和eb值均等于用明文所能取得的最小值和整数0填充值联接后再加密的值。这些记录的ord2字段设为1,ord1设为相应的层号,其它字段设为空值。对于辅助数据结构3和4,一开始时先根据表a的可能的大小和t值的大小选择该辅助数据结构的层次数m。选择的标准应使按上述辅助数据结构的特征使得最后一层的最小可能容量(j类结构总数)大于表a的最大可能记录数的两到三倍。一般选择5~6层即可,除非表a的记录数可能特别巨大,如超过10亿条。然后在每一层插入一个对象,这些对象的ord1值为其所在的层的层号,num值为1,j类结构1项,其j类结构的ord2值设为1,其eb值均设为用明文所能取得的最小值和整数0填充值联接后再加密的值,其ref值指向他的下一层的那个对象,最后一层的那个对象的j类结构的ref字段为空,这些对象的其它属性均设为空。
3.辅助数据结构的维护:
辅助数据结构的维护通过中间件实现,其维护中的分裂、合并操作类似于B+树索引中的相应维护操作。在维护过程中,只能是针对删除、插入、更新一条记录的情况进行。若户自行的是批量的插入、删除、修改,则需利用中间件通过查询确定修改的记录所涉及的记录的集合,再将该修改操作转化为若干次对单条记录的修改行为并进行相应的维护。
(1)中间件:
它在整个数据库系统中的位置如附图所示。它处在数据库应用程序与数据库管理系统之间,可以安装在数据库客户端或应用服务器端,也可以安装在数据库服务器端,还可以安装在介于数据库客户端(或应用服务器端)与服务器端之间的专门的安全服务器上。一般为了更好的安全性,应该安装于专门的安全服务器上,以使数据库的维护与安全管理相分离,同时使数据库的加密密钥独立于用户的密钥,并减轻数据库服务器的计算负担。这种体系结构处理最复杂。下文以这种体系结构为基础进行说明。由于基本原理相同,这种体系结构可以很容易的改造成其它两种体系结构。
中间件要求数据库客户端通过ODBC、JDBC、OLE DB等标准接口访问数据库。它同时要求在数据库客户端安装一个中间件客户端。该中间件客户端包含一个身份认证和密钥协商模块以及一个针对ODBC等标准接口的虚拟的数据库管理系统驱动程序。当数据库应用程序需要访问数据库时,先通过中间件客户端中虚拟的数据库管理系统驱动程序及中间件和数据库建立连接,再由中间件客户端与远程的安全服务器上的中间件进行身份认证和密钥协商,再由用户发起一个对数据库中一个虚拟表的读操作,这个表在数据库中可以并不实际存在,中间件客户端通过这次虚拟的数据库读操作而将协商得的密钥返回给应用程序。同时,在远程的中间件亦会将该密钥与与该用户中间件客户端通信的socket号捆绑起来加以记录,存储在协商密钥通信表中。然后用户的数据库应用程序,通过ODBC等标准接口向虚拟的数据库管理系统的驱动程序(中间件客户端)提交标准函数、数据和用SQL语句等表达的对数据库的操作,其中的密文字段的值用此前协商的密钥加密,这些函数和SQL语句、数据再由虚拟数据库管理系统驱动程序(中间件客户端)提交给远程的安全中间件。
安装在远程安全服务器上的安全中间件存储有一个字典,即数据库加密信息库,它记载着数据库中哪些关系的哪些字段是需加密存储的,这些字段在其关系中是第几个字段,字段名是什么,其相应的加密密钥是什么。同时,它还维护着一个协商密钥通信表,记载着与每个socket号相对应的协商得的用户密钥。中间件截获用户的数据库操作,对其中的SQL语句进行简单的语法分析,若其中不涉及加密字段,则直接交由数据库执行,并将执行的结果返回给用户。若其中涉及到加密字段,它用协商密钥通信表中记录的相应密钥解密用户发过来的加密了的数据,可以得到数据的明文,再用从数据库加密信息库中查到的相应数据库存储密钥加密,可以得到相应的数据库中的密文。同时,他对数据库服务器发给用户的检索结果中的加密数据用数据库的相应密钥解密,再用与用户协商得的密钥加密,再传送给应用程序。他对用户发过来的数据库操作语句,函数中涉及加密字段的也进行一定的处理,再传给数据库服务器,以实现对加密字段的独立于客户端的加解密,以及维护辅助数据结构的一致性并实现对加密字段的高效条件查询。
(2)对于辅助数据结构1的维护:
①添加时的维护:应用程序要在表a中添加一条相应加密字段m的明文为plain的记录时,odbc中间件捕获该操作后,就按以下步骤在该添加操作所在的事务中嵌入以下操作,以在x表的最后一层中插入一条记录,并对整个辅助数据结构做一定的调整:
i.拦截并保存相应的SQL语句并在该SQL语句所在的事务中进行下列操作:
ii.用SQL语句检索出x表中层号最小的那个块中的所有记录,设其为块g;
iii.将块g中的记录按ord2值升序排序,检索出块g中eb项明文(不含填充位)小于等于plain的明文的记录中ord2值最大的记录r;若r没有子块,则执行步骤iv,否则用sql语句取出该子块,将该子块的值赋给块g,重复执行步骤iii;
iv.若r的eb项的明文去掉填充位后等于plain,设r的eb项的明文的填充位为rebk,则将plain填充rebk+1后加密,否则将plain在尾部填充数2后加密,设所得的值为neb,构造一个新记录,它的eb值等于neb,et等于r的et值,ord2等于r的ord2值加1,ord1等于r的ord1值,将它插入到r所在的块中,同时将r所在的块中ord2值比r的ord2值大的所有记录的ord2值加1;
v.若插入之后,r所在的块rblock的记录数等于t+1,则将rblock中的记录中ord2值最大的[t/2]条记录移出去,构成一个新块,新块的所有记录的et值改为移出去的记录中的eb项的最小值,其它字段值不变,若r有父记录,则将新的et值作为eb值,r的父记录的ord2值加1作为ord2值,r的父记录的ord1值作为ord1值,r的父记录的et值作为et值,构造一条记录插入r的父记录所在的块中,并将r的父记录所在的块中ord2值比r的父记录的ord2值大的记录的ord2值加1,并将r的父记录看作r重复执行步骤v。若r无父记录,或r所在的块中记录数小于t+1,则执行步骤vi;
vi.中间件将被拦截的SQL插入语句中的密文字段置为neb,执行被拦截的SQL语句并将执行结果返回给用户。
②删除时的维护:当应用程序要在表a中删除一条相应密文字段m的密文值为c的记录(对于每一个对a表中记录的删除操作,中间件都需先在同一事务中通过查询确定每一条欲删除记录的对应的m字段的值c,下面的几种删除情况的处理也是一样,不再赘述)时,odbc中间件捕获该操作后,就将删除时的维护操作嵌入在该删除操作所在的事务中,以便在x表的最后一层中删除一条记录并对整个辅助数据结构作出一定的调整。密文值c是指用数据库的存储密钥加密后的密文值。删除时的维护操作具体如下:
i.拦截并保存相应的SQL语句并在该SQL语句所在的事务中进行下列操作:
ii.用SQL语句检索出x表中层号最小的那个块中的所有记录,设其为块g;
iii.将块g按ord2值升序排序,检索出块g中eb项明文(包括填充位,下同)小于等于c的明文(包括填充位,下同)的记录中ord2值最大的记录r;若r没有子块,则执行步骤iv,否则将该子块的值赋给块g,重复执行步骤iii;
iv.若r的eb字段等于c,则删除r,并将块g中ord2值比r的ord2值大的记录其ord2值减1;若r为原g块中ord2值最小的记录,则将g块中所有记录的et项的值设为删除后块中的ord2值最小的记录的eb项的值,并将其父记录的eb项设为该子块的新的et值,若它的父记录也是同块中eb最小的记录,则同样调整它的父记录所在的块,依此类推;
v.若删除后g块中的记录数变为[t/2]-1,且g不是根块,则若其父记录fa的某个兄弟记录br的子块的记录数大于[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]条记录,同时调整该兄弟记录br的子块t1中的记录的ord2字段和et字段,使得eb随ord2值的增加而递增排列,ord2值不重复,et等于块中最小的eb值,并使br的eb项等于调整后的t1的et值。将这[(num-[t/2]+2)/2]条记录插入到g块中形成一个新块,并调整这个新块中的记录的ord2值使得其所有记录的ord2值代表其eb值在新块中的大小序号(升序),et值等于新块中最小的eb值,调整g块的父记录使其eb值等于新g块的et值。若g块的父记录fa的兄弟记录的子块的记录数均为[t/2],则将该块g和fa的某个兄弟记录br1的子块t3合并成一个新块,并调整这个新块的记录的ord2和et字段使得其所有记录的ord2值代表其eb值在新块中的大小序号(升序),et值等于新块中最小的eb值,同时从g块的父块中删除记录fa和brl,用一条新的eb值等于新块的et值的记录取代之,并相应的调整父块中的ord2值和et值,使得其所有记录的ord2值代表其eb值在块中的大小序号(升序),et值等于块中最小的eb值,再将该父块的值赋给块g,重复执行步骤v。若g没有父记录或父记录无兄弟记录或g块中的记录数大于[t/2]-1,则执行步骤vi;
vi.执行被拦截的SQL语句并将执行结果返回给用户。
③更新时的维护:
当应用程序要在表a中更新一条记录的m字段的值时,设该字段的原密文值为x,新值的明文为nm,(对于每一个对a表中记录的m字段的更新操作,中间件都需先在同一事务中通过查询确定每一条欲更新记录的对应的m字段的原值,下面的几种辅助数据结构的更新情况的处理也是一样,不再赘述)则该语句被中间件拦截后,该中间件在相应的操作所在的事务中插入以下操作:先执行与删除m字段密文值为x的记录相同的辅助数据结构维护工作,再执行与添加m字段明文值为nm的记录相同的辅助数据结构维护工作,待这些步骤顺利完成后再将截获的语句放行,并将执行的结果返回给应用程序。实现这种操作需要中间件和数据库服务器之间的L+1次至4L+1次交互(L为辅助数据结构的总共的层数),但因为辅助结构的特殊设计和辅助数据结构的聚集索引的建立,这些交互可以迅速完成。
(3)对于辅助数据结构2的维护:
对于辅助数据结构2,需在数据库服务器端创建一个存储过程,该存储过程完全在数据库服务器端执行,该存储过程至少接收一个密文c的的不包括填充序列的明文的所有前缀密文的集合(后面亦称之为该数的前缀密文集)。如果一个数(用二进制表示,下文中提到的所有数如非特别注明,均以二进制表示),从它的最高有效位算起,取它的前k位长度,再在第k+1位填1,其余位填0,再加密,得到的数称为该数的前缀密文,其中,k小于等于该数的不包括填充比特的二进制长度,可为0。
具体步骤如下:
①添加时的维护:应用程序要在表a中添加一条相应加密字段m的明文为plain的记录时,odbc中间件捕获该操作后,就按以下步骤在该添加操作所在的事务中嵌入以下操作,以在x表的最后一层中插入一条记录,并对整个辅助数据结构做一定的调整:
i.拦截并保存相应的SQL语句,并在该SQL语句所在的事务中进行下列操作:
ii.调用一个存储过程,该存储过程接收plain(不包括填充位,下同)的前缀密文集作为参数,并按以下步骤(3)执行:
iii.用SQL语句检索出x表中层号最小的那个块中的所有记录,设其为块g,把其中的记录按ord2值从小到大从左向右排列,成一个有序集s,然后找出其el值在plain的前缀密文集中的最靠右的记录elr,再找出s中er值在plain的前缀密文集中的最靠左的记录erl(如不存在则将最右边的记录视为erl),则plain的大小要么处在elr的eb值的明文(比较时plain的填充位视为最大值,下同)和它的左边相邻的记录lb的eb值之间(开区间,如果不存在elr则无此条),要么处在erl的eb值和其右边的相邻的记录rb的eb值之间(开区间,如果erl无右边的相邻记录,则此条改为“要么大于erl记录的eb值)。把elr的左边相邻的记录lb的子块取出来,按ord2的升序从左向右排列,构成一个有序集sl(如果不存在elr或lb无子块,则不进行此步骤),用这个有序集取代s中elr左边的所有记录,并用该子块中ord2值最大的记录的ep值取代elr的el值;把erl的子块取出来,按同样的方法排列,用同样方法构成一个有序集sr,用erl的el项取代sr中最靠左记录的el值,再用这个有序集取代erl,并用该子块中ord2值最大的记录的ep项的值取代原erl的右边相邻记录rb的el项,同时去掉rb右边的所有记录(如不存在rb则不进行此步骤)。完成以上两步之后,再把新的有序集看作s,再做类似的操作,如此下去,直到所有取代操作不能再执行为止。将在最后的s集中找到的elr和rb求其eb值最小的子孙记录(若无子孙则就取自身)以代替他们自身,则新的记录在最后一层插入的位置要么与最后的s集中的lb记录在同一块中且其ord2值应紧接在其后,要么与erl在同一块中且其ord2值应紧接在其后。该存储过程返回最后的elr(替换后的,下同)、lb、erl、rb(替换后的,下同)及其所有祖先记录。同时,该存储过程计算如按这两种方式插入如何按类似辅助数据结1的插入后的调整的方式进行整个辅助数据结构的调整,并按定义分析调整后哪些记录的er、ep、el字段需要重新设置,并将这些记录及其在插入、调整后的可能的同层相邻兄弟记录、可能的调整方式一起返回(所有返回的记录均需指明其在各块中所在的位置编号,及所在块的现有记录数),由中间件计算调整后的新er、el、ep值。
iv.中间件计算出elr、lb、erl、rb的eb字段的明文,看plain(不包括填充位)是处在lb与elr的eb项的明文(不包括填充位)之间(开区间),还是处在erl与rb的eb项的明文(不包括填充位)之间(开区间),还是plain等于erl的eb项的明文(去掉填充位后比较)等于elr的的eb项的明文(去掉填充位后比较);若处在lb与elr的eb项的明文之间,则应在lb之同一块中且在lb之后插入,插入的记录的eb项为plain后面用整数1填充后再加密,其它字段的设置与辅助数据结构1中的插入类似;若处在erl与rb的eb项的明文之间,则应在erl之同一块中且在erl之后插入,插入的记录的eb项为plain用整数2填充后加密,其它字段的设置与辅助数据结构1中的插入类似;若是第3种情况,则应在erl之同一块中且在erl之后插入,设erl的填充位为erlt,则插入的记录的eb项为plain用(erlt+1)填充后加密,其它字段的设置与辅助数据结构1中的插入类似。确定在最后一层插入的位置后,中间件再确定插入后引起的辅助数据结构的调整而需要重新设置的er、ep、el值,并用这些以及插入的位置、调整的方法等作为参数调用一个存储过程完成相应的插入、调整(其因插入引起的调整步骤完全类似与辅助数据结构1)、和er、el、ep字段的重设工作。
v.中间件将被拦截的SQL插入语句中的密文字段置为在辅助数据结构最后一层中插入的记录的eb值,执行被拦截的SQL语句并将执行结果返回给用户。
②删除时的维护:当应用程序要在表a中删除一条相应密文字段m的密文值为c的记录时,odbc中间件捕获该操作后,就将删除时的维护操作嵌入在该删除操作所在的事务中,以便在x表的最后一层中删除一条记录并对整个辅助数据结构作出一定的调整。密文值c是指用数据库的存储密钥加密后的密文值。删除时的维护操作具体如下:
i.拦截并保存相应的SQL语句,并在该SQL语句所在的事务中进行下列操作:
ii.调用一个存储过程,该存储过程在数据库服务器端执行,它接收c的明文的前缀密文集(指其不包括填充位的前缀密文集,下同)及c本身作为参数,并按步骤iii执行:
iii.SQL语句检索出x表中层号最小的那个块中的所有记录,设其为块g,把其中的记录按ord2值从小到大从左向右排列,成一个有序集s,然后找出其el值在c的明文的前缀密文集中的或其eb值等于c的最靠右的记录elr,再找出s中er值在c的明文的前缀密文集中或其eb值等于c的最靠左的记录erl(如果不存在则将最右边的一条记录视为erl),则c的大小要么处在elr的eb值和它的左边相邻的记录lb的eb值之间(闭区间,若无elr则无此条),要么处在erl的eb值和其右边的相邻的记录rb的eb值之间(闭区间,如果erl不存在右边的相邻记录,则此条改为“要么大于erl记录的eb值”)。把elr的左边相邻的记录lb的子块取出来(若其无子块或无elr则不进行此步骤),按ord2的升序从左向右排列,构成一个有序集sl,用这个有序集取代s中elr左边的所有记录,并用该子块中ord2值最大的记录的ep值取代elr的el值(如果elr的eb值为c,则不进行此取子块及替代步骤);把erl的子块取出来(若其无子块则不进行此步骤),按同样的方法排列,构成一个有序集sr,用erl的el项取代sr中最左边的记录的el项,再用这个有序集sr取代erl,并用该子块中ord2值最大的记录ep项的值取代原erl右边相邻记录rb的el项,同时去掉rb右边的所有记录(如不存在rb则不进行此步骤)。完成以上两步之后,再把新的有序集看作s,再做类似的操作,如此下去,直到所有取代操作均不能再执行为止。则在最后的s集中必能找到eb项等于c的记录,再用它在最后一层中的eb值最小的子孙记录代替它(若无子孙记录则不进行此步骤)。设该记录为p,p在最后一个s集中的左边兄弟记录为lbl,lbl在最后一层中的eb值最大的子孙记录为pl(若lbl无子孙则就取lbl本身),p在最后一个s集中的右边的兄弟记录为rbl,rbl在最后一层中的eb值最小的子孙记录为pr(若rbl无子孙则就取rbl本身),则返回p、pl和pr及其所有祖先记录(所有返回的记录均需指明其在各块中所在的位置编号,及其所在块的现有记录数)。同时,该存储过程根据删除p而需要对辅助数据结构2做的类似于辅助数据结构1的调整,推算出哪些记录在调整后需重新设置其er、el、ep字段的值并把调整方式及这些记录及该存储过程推知的在删除、调整后的这些记录的同层相邻兄弟记录返回给中间件(所有返回的记录均需指明其在各块中所在的位置编号,及其所在块的现有记录数),由中间件计算调整后的新er、el、ep值。
iv.中间件根据该存储过程返回的值计算出调整后需要重新设置的ep、el、er值并调用另一存储过程在辅助数据结构的最后一层中删除eb值为c的记录并进行其他类似与辅助数据结构1的调整,并设置调整后需要重新设置的el、er和ep值。
v.中间件放行拦截的删除操作并将执行结果返回给用户。
③更新时的维护:
当应用程序要在表a中更新一条记录的m字段的值时,设该字段的原密文值为x,新值的明文为nm,则该语句被中间件拦截后,则该中间件在相应的操作所在的事务中插入以下操作:先执行与删除m字段密文值为x的记录相同的辅助数据结构维护工作,再执行与添加m字段明文值为nm的记录相同的辅助数据结构维护工作,待这些步骤顺利完成后再将截获的语句放行,并将执行的结果返回给应用程序。实现这种操作需要中间件和数据库服务器之间的L+1次至4L+1次交互(L为辅助数据结构的总共的层数),但因为辅助结构的特殊设计和辅助数据结构的聚集索引的建立,这些交互可以迅速完成。
(3)对于辅助数据结构3的维护:
其维护过程与辅助数据结构1类似,只不过块换成了对象,对块中记录的处理变成了对对象中j类结构的处理,块的分裂和合并变成了对象的分裂和合并。具体步骤如下:
①添加时的维护:应用程序要在表a中添加一条相应加密字段m的明文为plain的记录时,odbc中间件捕获该操作后,就按以下步骤在该添加操作所在的事务中嵌入以下操作,以在x表的最后一层的某个对象中插入一个j类结构,并对整个辅助数据结构做一定的调整:
i.拦截并保存相应的SQL语句,并在该SQL语句所在的事务中进行下列操作:
ii.用SQL语句检索出x表中层号最小的那个对象,设其为对象g;
iii.检索出在对象g中,其eb项的明文(不包括填充位)小于等于plain的j类结构中ord2值最大的j类结构r;若r没有子对象,则执行步骤iv,否则将该子对象的值赋给对象g,重复执行步骤iii;
iv.若r的eb项的明文去掉填充位后等于plain(不包含填充位),设r的eb项的明文的填充位为rebk,则将plain填充rebk+1后加密,否则将plain在尾部填充整数2后加密,设所得的值为neb,构造一个新j类结构,他的eb值等于neb,将它插入到r所在的对象的j类结构数组中,插在该对象的j类结构数组的元素r之后,并将r之后的元素依次往后挪。将该对象的num值加1并相应调整各j类结构的ord2属性值以使之等于其所在j类结构的eb项的大小在整个对象中的升序排序号。
v.若插入之后,r所在的对象rblock的j类结构数等于t+1,则将rblock中的j类结构中ord2值较大的[t/2]个j类结构移出去,构成一个新的对象newo,并相应调整新旧对象的j类结构的排列和各j类结构的ord2值、对象的num值,使j类结构按其eb值的大小递增排列,使num表示对象中j类结构的数目,ord2为其所在的j类结构在数组中的序号,其它字段值不变,若r有父对象,则将新对象的j类结构中eb的最小值作为一个新的j类结构的eb值,ref(newo)作为新的j类结构的ref字段的值,构造一个新的j类结构插入到r的父对象中去,同时调整父对象中j类结构的排列,使之按其eb值的大小递增排列,调整各j类结构的ord2值使之等于其所在j类结构在数组中的序号,调整对象的num值使num表示对象中j类结构的数目。并将r的父j类结构看作r,重复执行步骤v。若r无父对象,或插入之后r所在对象的j类结构数小于t+1,则执行步骤vi;
vi.中间件将被拦截的SQL插入语句中的密文字段置为neb,执行被拦截的SQL语句并将执行结果返回给用户。
vii.中间件将在x表中最后一层插入的j类结构的ref字段的值设为指向a表中刚插入的记录。
②删除时的维护:当应用程序要在表a中删除一条相应密文字段m的密文值为c的记录时,odbc中间件捕获该操作后,就将删除时的维护操作嵌入在该删除操作所在的事务中,以便在x表的最后一层的某个对象中删除一个j类结构并对整个辅助数据结构作出一定的调整。密文值c是指用数据库的存储密钥加密后的密文值。删除时的维护操作具体如下:
i.拦截并保存相应的SQL语句并在该SQL语句所在的事务中进行下列操作:
ii.用SQL语句检索出x表中层号最小的那个对象,设其为对象g;
iii.检索出对象g中eb项明文(包括填充位,下同)小于等于c的明文(包括填充位)的j类型结构中eb项的明文值最大的j类型结构r;若r没有x类型的子对象,则执行步骤iv,否则将该子对象的值赋给块g,重复执行步骤iii;
iv.若r的eb属性等于c,则从g的j类结构数组中删除该j类结构,并将r后面的j类结构前移,并相应的调整ord2属性和num属性的值,使num表示新对象中j类结构的数目,ord2为其所在的j类结构在数组中的序号(升序),若r是所在对象中ord2值最小的j类结构,则调整r的父j类结构的eb字段的值,使它等于它的子对象中最小的eb,若r的父j类结构亦为所在对象中ord2值最小的j类结构,则对r的父j类结构的父j类结构做类似调整,依此类推;
v.若删除后g对象中的j类结构数变为[t/2]-1,且其父j类结构fa的某个兄弟j类结构br的子对象的j类结构数大于[t/2],为num,则从其父j类结构的该兄弟j类结构br的子对象t1中取出eb值最小的[(num-[t/2]+2)/2]个j类结构(如果br的eb值比fa的eb值大),或从其父j类结构的该兄弟j类结构br中取出eb值最大的[(num-[t/2]+2)/2]个j类结构(如果br的eb值比fa的eb值小),将他们插入到g中,并从该兄弟j类结构br的子对象t1中删除这[(num-[t/2]+2)/2]个j类结构,同时重新排列t1和g的j类结构数组,使之按eb值递增排列,调整他们的ord2属性和num属性的值,使num表示对象中j类结构的数目,ord2为其所在的j类结构在其对象数组中的序号,并使br和fa的eb项等于调整后的其子对象中所有j类结构中eb项的最小值。若g的父j类结构fa的兄弟j类结构的子对象的j类结构数均为[t/2],则将g和fa的某个兄弟j类结构brl的子对象t3合并成一个新对象,使新对像的所有j类结构的eb值等于上述两个对象的并集,并调整这个新对象使得其j类结构数组按其eb属性的值递增排列,调整ord2属性和num属性的值,使num表示新对象中j类结构的数目,ord2为其所在的j类结构在数组中的序号,同时从t对象的父对象中删除j类结构fa和brl,用一个新的eb值等于新对象的eb值的最小值的j类结构取代之,并相应的调整父对象的其他字段的值使之满足定义要求。再将该父对象的值赋给对象g,重复执行步骤v。若g没有父j类结构或父j类结构无兄弟j类结构或g对象中的j类结构数大于[t/2]-1,则执行步骤vi;
vi.中间件放行拦截的删除操作并将执行结果返回给用户。
③更新时的维护:
当应用程序要在表a中更新一条记录的m字段的值时,设该字段的原密文值为x,新值的明文为nm,则该语句被中间件拦截后,则该中间件在相应的操作所在的事务中插入以下操作:先执行与删除m字段密文值为x的记录相同的辅助数据结构维护工作,再执行与添加m字段明文值为nm的记录相同的辅助数据结构维护工作,待这些步骤顺利完成后再将截获的语句放行,并将执行的结果返回给应用程序。实现这种操作需要中间件和数据库服务器之间的L+1次至4L+1次交互(L为辅助数据结构的总共的层数),但因为辅助结构的特殊设计和辅助数据结构的聚集索引的建立,这些交互可以迅速完成。
(4)对于辅助数据结构4的维护:
其维护用与辅助数据结构2同样的方法类比建立存储过程来解决,只不过块换成了对象,对块中记录的处理变成了对对象中j类结构的处理,块的分裂和合并变成了对象的分裂和合并。具体步骤如下:
①添加时的维护:应用程序要在表a中添加一条相应加密字段m的明文为plain的记录时,odbc中间件捕获该操作后,就按以下步骤在该添加操作所在的事务中嵌入以下操作,以在x表的最后一层的某个对象中插入一个j类结构,并对整个辅助数据结构做一定的调整:
i.拦截并保存相应的SQL语句,并在该SQL语句所在的事务中进行下列操作:
ii.调用一个存储过程,该存储过程接收plain的前缀密文集(不包括填充位,下同)作为参数,并按以下步骤iii执行:
iii.用SQL语句检索出x表中层号最小的那个对象,设其为g,把其中的j类结构按ord2值从小到大从左向右排列,成一个有序集s,然后找出其el值在plain的前缀密文集中的最靠右的j类结构elr,再找出s中er值在plain的前缀密文集中的最靠左的j类结构erl(如不存在则将最右边的j类结构视为erl),则plain的大小(比较时plain的填充位视为最大值,下同)要么处在elr的eb值和它的左边相邻的j类结构lb的eb值之间(开区间,如果不存在elr则无此条),要么处在erl的eb值和其右边的相邻的j类结构rb的eb值之间(开区间,如果erl无右边的相邻j类结构则为大于erl的eb值)。把elr的左边相邻的j类结构lb的子对象的所有j类结构取出来,按ord2的升序从左向右排列,构成一个有序集sl(如果不存在lb或lb无子对象,则不进行此步骤),用这个有序集取代s中elr左边的所有j类结构,并用该子对象中ord2值最大的j类结构的ep值取代elr的el值;把erl的子对象的所有j类结构取出来,按同样的方法排列,按同样的方法构成一个有序集sr,用erl的el项取代sr中最左边的j类结构的el项,再将sr集合取代erl,并用该子对象中ord2值最大的j类结构的ep项的值取代原erl的右边相邻j类结构rb的el项,同时去掉rb右边的所有j类结构(如不存在rb则不进行此步骤)。完成以上两步之后,再把新的有序集看作s,再做类似的操作,如此下去,直到所有取代操作均不能再执行为止。将在最后的s集中找到的elr,rb求其eb值最小的子孙j类结构(若无子孙则就取自身)以代替他们自身。则新的j类结构在最后一层插入的位置要么在最后的s集中的lbj类结构所在的对象中且其插入后的ord2值应紧接在lb的ord2值之后,要么与erl在同一对象中且其插入后的ord2值应紧接在erl的ord2值之后。该存储过程返回最后的elr(替换后的,下同)、lb、erl、rb(替换后的,下同)及其所有祖先j类结构。同时,该存储过程计算如分别以这两种方式插入,整个辅助数据结构如何按类似辅助数据结3的插入后的调整方式进行调整,并按定义分析调整后哪些j类结构的er、ep、el字段需要重新设置,并将调整方式、这些j类结构及其在插入、调整后的可能的同层相邻兄弟j类结构一起返回(所有返回的j类结构均需指明其在各对象中所在的位置编号,及其所在对象的现有j类结构数),由中间件计算调整后的新er、el、ep值。
iv.中间件计算出elr、lb、erl、rb的eb字段的明文,看plain(不包括填充位)是处在lb与elr的eb项的明文(不包括填充位)之间(开区间),还是处在erl与rb的eb项的明文(不包括填充位)之间(开区间),还是plain等于erl的eb项的明文(去掉填充位后比较)等于elr的eb项的明文(去掉填充位后比较);若处在lb与elr的eb项的明文之间(不包括填充位),则应在lb之同一对象中且在lb之后插入一j类结构,插入的j类结构的eb项为plain后面用整数1填充后再加密,其它字段的设置与辅助数据结构3中的插入类似;若处在erl与rb的eb项的明文之间(不包括填充位),则应在erl之同一对象中且在erl之后插入,插入的j类结构的eb项为plain用整数2填充后加密,其它字段的设置与辅助数据结构3中的插入类似;若是第3种情况,则应在erl之同一对象中且在erl之后插入,设erl的填充位为erlt,则插入的j类结构的eb项为plain用(erlt+1)填充后加密,其它字段的设置与辅助数据结构3中的插入类似。确定插入的位置后,中间件再确定插入后引起的辅助数据结构的调整而需要重新设置的er、ep、el值,并用这些值及插入的位置、调整的方法作为参数调用一个存储过程完成相应的插入、调整(其因插入引起的调整步骤完全类似与辅助数据结构3)和er、el、ep字段的重设工作。
v.中间件将被拦截的SQL插入语句中的密文字段置为在辅助数据结构最后一层中插入的j类结构的eb值,执行被拦截的SQL语句并将执行结果返回给用户。
vi.中间件将在x表中最后一层插入的j类结构的ref字段的值设为指向a表中刚插入的记录。
②删除时的维护:删除时的维护:当应用程序要在表a中删除一条相应密文字段m的密文值为c的记录时,odbc中间件捕获该操作后,就将删除时的维护操作嵌入在该删除操作所在的事务中,以便在x表的最后一层的某个对象中删除一个j类结构并对整个辅助数据结构作出一定的调整。密文值c是指用数据库的存储密钥加密后的密文值。
i.拦截并保存相应的SQL语句,并在该SQL语句所在的事务中进行下列操作:
ii.调用一个存储过程,该存储过程在数据库服务器端执行,它接收c的明文(不包括填充位)的前缀密文集及c本身作为参数,并按以下步骤iii执行:
iii.用SQL语句检索出x表中层号最小的那个对象g中的所有j类结构,把g中的j类结构按其eb值从小到大从左向右排列,成一个有序集s,然后找出其el值在c的明文(不包括填充序列)的前缀密文集中的或其eb值等于c的最靠右的j类结构elr,再找出s中er值在c的明文(不包括填充序列)的前缀密文集中或等于c的最靠左的j类结构erl(如不存在则将最右边的j类结构视为erl),则c的大小要么处在elr的eb值和它的左边相邻的j类结构lb的eb值之间(闭区间,如果不存在elr则无此条),要么处在erl的eb值和其右边的相邻的j类结构rb的eb值之间(闭区间,如果erl不存在右边的相邻记录,则此条改为“要么大于erl j类结构的eb值”)。把elr的左边相邻的j类结构lb的子对象取出来(若其无子对象或无elr则不进行此步骤),将其j类结构按它们在数组中的顺序排列,构成一个有序集sl,用这个有序集取代s中elr左边的所有j类结构,并用该子对象中eb值最大的j类结构的ep值取代elr的el值(如果elr的eb值为c,则不进行此取子对象及取代步骤);把erl的子对象取出来,按同样的方法排列,构成一个有序集sr,用erl的el值取代sr中最左j类结构的el值,并将这个有序集取代erl,并用该子对象中eb值最大的j类结构的ep项的值取代原erl的右边相邻记录rb的el项,同时去掉rb右边的所有j类结构(如不存在rb则不进行此步骤)。完成以上步骤之后,再把新的有序集看作s,再做类似的操作,如此下去,直到所有取代操作均不能再执行为止。则在最后的s集中必能找到eb项等于c的j类结构。设该j类结构为p,用p在最后一层中的eb值最小的子孙j类结构取代p,设p在最后一个s集中的左边兄弟j类结构的eb值最大的子孙(且层号为最大值)j类结构为pl,右边的兄弟j类结构的eb值为最小的子孙(且层号为最大值)j类结构为pr,则返回p、pl和pr及他们的所有祖先j类结构(所有返回的j类结构均需指明其在各对象中所在的位置编号,及其所在对象的现有j类结构数)。同时,该存储过程根据删除p而需要对辅助数据结构4做的类似于辅助数据结构3的调整,推算出哪些j类结构在调整后需重新设置其er、el、ep值,并把这些j类结构及该存储过程推知的在删除、调整后这些j类结构的同层相邻兄弟j类结构,以及调整方式返回给中间件(所有返回的j类结构均需指明其在各对象中所在的位置编号,及其所在对象的现有j类结构数),由中间件计算调整后的新er、el、ep值。
iv.中间件根据该存储过程返回的值计算出调整后需要重新设置的ep、el、er值并调用另一存储过程在辅助数据结构的最后一层中删除eb值为c的j类结构并进行其他类似与辅助数据结构3的调整,并设置调整后需要重新设置的el、er和ep值。
v.中间件放行拦截的删除操作并将执行结果返回给用户。
③更新时的维护:
当应用程序要在表a中更新一条记录的m字段的值时,设该字段的原密文值为x,新值的明文为nm,则该语句被中间件拦截后,则该中间件在相应的操作所在的事务中插入以下操作:先执行与删除m字段密文值为x的记录相同的辅助数据结构维护工作,再执行与添加m字段明文值为nm的记录相同的辅助数据结构维护工作,待这些步骤顺利完成后再将截获的语句放行,并将执行的结果返回给应用程序。实现这种操作需要中间件和数据库服务器之间的L+1次至4L+1次交互(L为辅助数据结构的总共的层数),但因为辅助数据结构的特殊设计和辅助数据结构的聚集索引的建立,这些交互可以迅速完成。
(二)密文的查询
密文的查询是通过中间件,使用辅助数据结构来实现。其中,中间件所处的位置及描述与上述辅助数据结构的维护步骤中相同。
对于辅助数据结构1的密文的查询:当应用程序发过来的数据库查询语句中含有对表a中密文字段m的范围条件查询要求,如:m between a and b(a和b在由应用程序传送给中间件服务器时,用事先协商好的密钥加密,中间件得到它后再解密为明文)时,中间件拦截之,在同一事务中插入以下若干数据库操作语句:它先检索出“层”号为最小的一层所包含的那一个块,判断其中有哪些记录的eb值的明文在a与b之间,若没有一条这样的记录,则找到其中eb的值小于a且最接近于a的记录(在比较时,a的填充序列视为最小值0,b的填充序列视为最大值,下同),再检索该记录的子块,再对该子块做类似的处理,如此下去,直到有一块p其中有1个或1个以上的记录其eb值的明文范围在a与b值之间,设这些记录中ord2值最小的记录为t,其ord2值为u,ord2值最大的记录为m,其ord2值为v,则p中ord2值在u与v-1(闭区间)之间的记录与下一层w(层号比p的层号大1)中的记录按p.eb=w.et,的方式构造一个联接条件,然后再将下一层和下一层的下一层y(层号比p的层号大2)中的记录按w.eb=y.et的方式构造一个联接条件,如此下去,直到最后联接到层号为最大值的层z中的记录,再将z中的记录和和表a中的记录按z..eb=a.m的方式构造一个联接条件,如此可构造出一个联接查询的sql语句sql1,用它可以检索出大部分符合条件的a中的记录;设p中ord2值为比u小的记录中ord2最大的记录为g(如果不存在,则不进行此步骤),其eb值的明文为gebp,p中ord2值为v的记录为d,其eb值的明文为debp,则把g的所有子孙块和d的所有子孙块分别看作另外两个辅助数据结构,递归的运用上述方法,则可以得到最多2L-1(L为辅助数据结构的总共的层数)条sql语句,将这些sql语句并起来,成为一条sql语句,再由该语句检索出表a中所有满足条件的记录。实现这种查询需要中间件和数据库服务器之间的L+1次交互,但因为辅助数据结构的特殊设计和辅助数据结构的聚集索引的建立,前L次交互可以迅速完成。
因为在数据库的sql语言里,联接查询亦可用含in语句的嵌套查询或含exist的相关子查询等表达,如where a.m=x.eb and f(x)(f(x)表示用sql语言表达的对x表中记录的条件限制)可表达为where a.min(select eb from x where f(x))或where exist(select*from x where x..eb=a.m and f(x)),所以,上述的联接查询是指广义上的联接查询,包含其它与联接查询等效的操作。
对于辅助数据结构2的密文的查询:先用类似于对数据结构2的维护的方法分别得出a和b在辅助数据结构中各自的4个记录序列,再用这些序列不难得出a和b的大小在辅助数据结构各层次的bn项中所处的位置,因而获得用上述方法构造范围查询sql语句而需要的相关参数,从而构造出相应的sql语句。
对于辅助数据结构3的密文的查询:与辅助数据结构1的密文查询类似,只不过将字段之间的等值联接变成对对象a的ref属性进行unnest操作后形成的表的ref字段与对象b的取ref值操作的结果进行等值联接。例如如果辅助数据结构a表只有两层,则第一层和第二层之间的联接在对象-关系型oracle中可表达为select……from a as al,a asa2,unnest(al.j-array)as a3 where a3.ref=ref(a2)and al.ord1=1 and f(a3)。f(a3)表示用sql语言表达的对对象中j类结构的条件限制。
对于辅助数据结构4的密文的查询:先用类似于对数据结构2的维护的方法分别得出a和b在辅助数据结构中各自的4个j类结构序列,再用这些序列不难得出a和b的大小在辅助数据结构各层次的bn项中所处的位置,因而获得用上述辅助数据结构3的密文的查询方法构造范围查询sql语句而需要的相关参数,从而构造出相应的sql语句。
密文查询的具体步骤如下(下面只说明了在between查询语句中的处理情况,这是最复杂的,在>查询语句和<查询语句中可以用相同的技术使用更少的步骤和处理来完成):
当应用程序发过来的sql查询语句中含有对表a中密文字段m的条件查询要求,如:m between a and b(a和b在由应用程序传送给中间件服务器时,用事先协商好的密钥加密,中间件得到它后再解密为明文)时,中间件拦截之,在同一事务中执行下列操作:1、用类似上述辅助数据结构维护中的步骤,确定a和b在辅助数据结构的每一层中,其大小(比较时a的填充位视为1,b的填充位视为最大值)处在哪两个同层相邻记录(或j类结构)的eb值之间(先用上述插入或删除的步骤,找到对应明文值a或b在每一层中的对应的记录r或j类结构r,再找出比r的eb值大的r的同层相邻兄弟记录或同层相邻j类结构r’,则在每一层中的对应r和r’即是所求,若b在第x层对应的r不存在这样的r’,则构造一个虚拟的r’,该r’的其它字段与该层中的r相同,但是其ord2值比该r的ord2值大1),设a在第i层处在a1i和a2i两个同层相邻兄弟记录(或j类结构)之间(i为从最小层号到最大层号之间(闭区间)的任意值);2、设b在第i层处在b1i和b2i两个同层相邻兄弟记录(或j类结构)之间,设辅助数据结构的最大层号为max,若为辅助数据结构3、4,设a1i所在的对象的引用为refa1i,a2i所在的对象的引用为refa2i,b1i所在的对象的引用为refb1i,b2i所在的对象的引用为refb2i,则按以下步骤构造出进行高效密文查询的sql语句:
(1)找到最小的k,使得当i>=k时,二元组(a1i,a2i)不等于(b1i,b2i);
(2)构造sql语句sql1=select xmax.eb from x as xk,x as xk+1,……,x as xmax-1,x as xmaxwhere xk.ord1=k and xk+1.ord1=k+1,……and xmax.ord1=max and(xk.eb=xk+1.et andxk+1.eb=xk+2.et and……and xmax-1.eb=xmax.et)①and xk.ord2 between a2k.ord2 and(blk.ord2-1)and xk.et=a2k.et,设其为sql1(若为辅助数据结构3或4,则相应的sql语句变为selectxjmax.ref from x as xk,unnest(xk.j-array)as xjk,x as xk+1 unnest(xk+1.j-array)as xjk+1……,xas xmax-1,unnest(xmax-1.j-array)as xj max-1,x as xmax,unnest(x max.j-array)as xjmax where(xjk.ref=ref(xk+1)and xjk+1.ref=ref(xk+2)and……and xjmax-1.ref=ref(xmax)and)②xjk.ord2between a2k.ord2 and(b1k.ord2-1)and refb1k=ref(xk))(若k等于最后一层的层号,则sql语句中无标号①、②所指明的括号中的内容,且两个sql语句中的between语句分别变为xk.ord2 between a2k.ord2 and b1k.ord2和xjk.ord2 between a2k.ord2 and b1k.ord2);
(3)若k<max,构造sql语句select xmax.eb from x as xk+1,x as xk+2,……,x as xmax-1,x asxmax where 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=a1k.eb(若为辅助数据结构3、4,则为select xjmax.reffrom x as xk+1,unnest(xk+1.j-array)as xjk+1.xas xk+2,unnest(xk+2.j-array)as xjk+2……,x as xmax-1,unnest(xmax-1.j-array)as xj max-1,x as xmax,unnest(x max.j-array)as xj max where(xjk+1.ref=ref(xk+2)and xjk+2.ref=ref(xk+3)and……andxjmax-1.ref=ref(xmax)and)④xjk+1.ord2>a1k+1.ord2 and refa1k+1=ref(xk+1))(若k+1等于最后一层的层号,则sql语句中无标号③、④所指明的括号中的内容),设其为sql2,令sql1=(sql1)UNION(sql2);
(4)若k<max,构造sql语句select xmax.eb from x as xk+1,x as xk+2,……,x as xmax-1,x asxmax where 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(若为辅助数据结构3或4,则为select xjmax.ref from x as xk+1,unnest(xk+1.j-array)asxjk+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,xas xmax,unnest(xmax.j-array)as xj max where(xjk+1.ref=ref(xk+2)and xjk+2.ref=ref(xk+3)and……and xjmax-1.ref=ref(xmax)and)⑥xjk+1.ord2<b1k+1.ord2 and refb1k+1=ref(xk+1))(若k+1等于最后一层的层号,则sql语句中无标号⑤、⑥所指明的括号中的内容,且两个sql语句中的<语句分别变为xk+1.ord2<=b1k+1.ord2和xjk+1.ord2<=b1k+1.ord2),设其为sql2,令sql1=(sql1)UNION(sql2);
(5)若k<max-1,则令k=k+1,跳到步骤(4)继续执行;若k=max-1,则执行步骤(6);
(6)将原语句中的密文范围查询条件m between a and b用min(sql1)取代(若为辅助数据结构3或4,则用ref(a)in(sql1)替换);
(7)将修改后的sql语句执行,并将执行后的结果中的m字段解密,用用户的密钥加密,再传送给用户。
例如,当辅助数据结构为类型1,其数据内容为上述辅助数据结构实例所述时,对于用户发来的select*from a where a.m between Ekc(15,random1)and Ek(57,random2)查询语句,其中random1、random2是随机产生的填充位,kc是用户的通信密钥,则可按上述方法导出对应的密文查询语句为select*from a where a.min((select x3.eb from x as x2,x asx3 where x2.ord1=2and x3.ord1=3 and x2.eb=x3.et and x2.ord2 between 2 and 2 and x2.et=Ek(0,0))UNION(select x3.eb from x as x3 where x3.ord1=3and x3.ord2>=3and x3.et=Ek(0,0))UNION(select x3.eb from x as x3 where x3.ord1=3and x3.ord2<=1 and x3.et=Ek(56,2)))。
上述密文查询的步骤中涉及的数据库操作均在同一事务中。由于等值查询是一种特殊的范围查询,所以可以方便的运用上述密文查询的方法予以实现。
五.实施例的补充说明
1.本实施例步骤没有出错处理,但本专业的技术人员可以容易的将其添加进去,通常在一个数据库操作中出现错误时需将它所在的事务回滚并向用户端报错。
2.本实施例所列出的类sql语句只是为了说明问题,并不完全符合标准的sql词法和语法要求,但本专业的技术人员可以根据它们所表达的方法容易的写出能产生符合规范的sql语句的程序来。
3.本实施例所述的只是一般的处理方法,根据具体的数据库管理系统或编程环境其细节或表达方式会有所不同,但本专业的技术人员可以根据它所表达的方法容易的写出能在具体环境中加以运用的程序来。
4.为叙述方便起见,本实施例假设欲实现密文查询的数据的类型是无符号整型,但其方法可适用于任何数据类型,只需将其操作根据具体数据类型稍加改动即可。
Claims (9)
1.一种数据库密文查询的方法,其特征是一种利用辅助数据结构,在数据库管理系统软件之外实现数据库快速密文查询的方法,它至少包括建立辅助数据结构、维护辅助数据结构和进行密文查询的步骤,具体如下:
(一)建立辅助数据结构:
其步骤包括:
(1)确定数据库中的哪些表中的哪些字段需要进行密文查询,以及
(2)建立至少一个辅助数据结构,辅助数据结构至少用所述数据库中的一个表存储,
辅助数据结构建立后,其中的数据须满足预先定义的特征以便于快速检索和维护,以及在密文查询字段选用高安全性加密算法和密钥加密的条件下,利用辅助数据结构从数据库中快速检索出符合密文查询条件的数据,在辅助数据结构中至少利用加密手段保证机密数据的安全性,
(3)至少在一种对辅助数据结构进行维护的情形和一种利用辅助数据结构进行密文查询的情形时,其操作步骤基于至少具有以下特征的辅助数据结构:
①辅助数据结构包含层次,每一层次至少包含一个块,块和层次是通过预先定义的特征识别在一起的数据的集合,所有块中至少有一个块,可以从其中得到至少一个,至多不大于一个可由预先定义的方式得到的值的索引项,
②当辅助数据结构包含两个或两个以上的层次时,则至少有一个块x,在从其中得到的索引项中,至少有一个索引项通过预先定义的关系与另一个块y相关联,
③当辅助数据结构包含两个或两个以上的层次时,则至少对于一对可从同一层中的块中得出的索引项z和w,若z和w满足预先定义的关系,且它们都有如②中所述的相关联的块,则至少对于一个z所关联的块k和一个w所关联的块j,从k和j中可以分别得出一个索引项,这两个索引项满足预先定义的关系,
④至少对于一个辅助数据结构,若它可用来辅助实现某个表a中密文字段m的密文查询,则从该辅助数据结构中至少可以得出一个索引项f,它通过预先定义的关系,和表a中的至少一个记录或对象相联系,
(二)维护辅助数据结构:
至少在一种涉及欲实现密文查询的字段中存储的数据的数据库修改情形时,对辅助数据结构进行维护,使之满足建立辅助数据结构步骤中所述的辅助数据结构建立后的特征,至少在一种对辅助数据结构的维护情形中,含有以下步骤:
(1)对辅助数据结构进行检索,
(2)至少利用检索结果对辅助数据结构进行维护,
上述步骤会利用数据库管理系统提供的操作接口和对应的对数据库的修改内容,至少在一种涉及维护辅助数据结构的操作情形时,利用数据库管理系统的事务机制进行事务管理,
(三)进行密文查询:
至少在一种涉及密文字段的查询情形时,应该至少利用检索要求、辅助数据结构,以及数据库管理系统所提供的操作接口,从数据库中检索出数据。
2.如权利要求1所述的数据库密文查询的方法,其特征在于:在进行密文查询时,其含有以下处理:对辅助数据结构进行检索和从数据库中检索出数据。
3.如权利要求1所述的数据库密文查询的方法,其特征在于:至少在一种维护辅助数据结构或进行密文查询的情形中,使用介于数据库管理系统和用户之间的中间件。
4.如权利要求3所述的数据库密文查询的方法,其特征在于:在进行密文查询使用中间件进行数据库操作时,至少在一种密文查询的情形时,至少含有如下步骤:
(1)拦截用户的数据库查询请求,
(2)分析该数据库查询请求,
(3)若该数据库查询请求涉及对密文字段预先设定的查询,则根据用户的查询要求,利用辅助数据结构从数据库中检索出数据,
5.如权利要求4所述的数据库密文查询的方法,其特征在于:其数据库操作是在一个数据库事务中。
6.如权利要求3所述的数据库密文查询的方法,其特征在于:维护辅助数据结构使用中间件进行数据库操作时,至少在一种维护辅助数据结构的情形时至少含有如下步骤:
(1)拦截用户的数据库修改请求,
(2)分析该数据库修改请求,
(3)进行至少一次检索辅助数据结构的操作,
(4)至少根据步骤(3)的结果及用户的数据库修改请求对辅助数据结构进行维护。
7.如权利要求6所述的数据库密文查询的方法,其特征在于:其操作步骤中的数据库操作是和用户的数据库修改操作设置在一个数据库事务中。
8.如权利要求1所述的数据库密文查询的方法,其特征在于:在维护辅助数据结构或进行密文查询的步骤中使用存储过程。
9.如权利要求1所述的数据库密文查询的方法,其特征在于:在完成建立辅助数据结构后,应在需进行密文查询的字段所在的表上建立索引。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006100772854A CN100370460C (zh) | 2005-07-21 | 2006-04-24 | 一种数据库密文查询的方法 |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200510019134.9 | 2005-07-21 | ||
CN200510019134 | 2005-07-21 | ||
CNB2006100772854A CN100370460C (zh) | 2005-07-21 | 2006-04-24 | 一种数据库密文查询的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1920824A CN1920824A (zh) | 2007-02-28 |
CN100370460C true CN100370460C (zh) | 2008-02-20 |
Family
ID=37778550
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2006100772854A Expired - Fee Related CN100370460C (zh) | 2005-07-21 | 2006-04-24 | 一种数据库密文查询的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100370460C (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101276445B (zh) * | 2008-05-16 | 2012-11-21 | 金蝶软件(中国)有限公司 | 快速定位工厂日历的方法和系统 |
CN103577551B (zh) * | 2013-10-16 | 2017-04-05 | 聚好看科技股份有限公司 | 一种数据批量提交到数据库的方法和装置 |
CN104735474A (zh) * | 2013-12-20 | 2015-06-24 | 乐视网信息技术(北京)股份有限公司 | 一种消息推送方法和装置 |
CN106022159B (zh) * | 2016-05-13 | 2018-11-02 | 上海说道文化传播有限公司 | 基于云计算的erp数据处理方法 |
CN109409129A (zh) * | 2018-10-23 | 2019-03-01 | 杭州弗兰科信息安全科技有限公司 | 一种基于sql改写实现的数据库同态加密方法 |
CN117349898B (zh) * | 2023-12-05 | 2024-03-08 | 中国电子科技集团公司第十研究所 | 一种访问模式隐藏的密文k近邻查询方法与系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2000022496A2 (en) * | 1998-10-14 | 2000-04-20 | Aegis Systems Inc. | System and method of sending and receiving secure data using anonymous keys |
WO2001001223A1 (en) * | 1999-06-25 | 2001-01-04 | Centura Software | Two-layer encryption of databases |
CN1295688A (zh) * | 1998-01-27 | 2001-05-16 | 何伯容 | 用于机密记录的安全数据库管理系统 |
CN1588366A (zh) * | 2004-08-02 | 2005-03-02 | 中国科学院计算机网络信息中心 | 密文数据库检索技术 |
-
2006
- 2006-04-24 CN CNB2006100772854A patent/CN100370460C/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1295688A (zh) * | 1998-01-27 | 2001-05-16 | 何伯容 | 用于机密记录的安全数据库管理系统 |
WO2000022496A2 (en) * | 1998-10-14 | 2000-04-20 | Aegis Systems Inc. | System and method of sending and receiving secure data using anonymous keys |
WO2001001223A1 (en) * | 1999-06-25 | 2001-01-04 | Centura Software | Two-layer encryption of databases |
CN1588366A (zh) * | 2004-08-02 | 2005-03-02 | 中国科学院计算机网络信息中心 | 密文数据库检索技术 |
Also Published As
Publication number | Publication date |
---|---|
CN1920824A (zh) | 2007-02-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101504668B (zh) | 一种支持密文索引的数据库透明加密方法 | |
CN100370460C (zh) | 一种数据库密文查询的方法 | |
Kim et al. | Forward secure dynamic searchable symmetric encryption with efficient updates | |
Demertzis et al. | Fast searchable encryption with tunable locality | |
CN101694672B (zh) | 一种分布式安全检索系统 | |
CN101859323B (zh) | 密文全文检索系统 | |
CN102122285B (zh) | 一种数据缓存系统中的数据查询系统和数据查询方法 | |
CN101512525B (zh) | 加密的数据搜索 | |
US7685437B2 (en) | Query optimization in encrypted database systems | |
Iyer et al. | A framework for efficient storage security in RDBMS | |
US8055678B2 (en) | Query processing system and method for database with encrypted column by query encryption transformation | |
CN102938767A (zh) | 基于云数据外包系统的高效可验证的模糊关键词搜索方法 | |
CN104881280A (zh) | 一种支持多查询的密文数据库中间件的设计方法 | |
CN114153374B (zh) | 一种元数据与数据共同存储的分布式存储系统 | |
CN114531220A (zh) | 一种基于前向和后向隐私的高效容错动态短语搜索方法 | |
Zhan et al. | MDOPE: Efficient multi-dimensional data order preserving encryption scheme | |
CN109492410A (zh) | 数据可搜索加密和关键词搜索方法、系统及终端、设备 | |
Peng et al. | LS-RQ: A lightweight and forward-secure range query on geographically encrypted data | |
CN114254344A (zh) | 一种基于区块链的共享数据库的隐私数据范围查询方法 | |
CN108984631A (zh) | 一种大数据的生成及调用方法和装置 | |
CN102855292B (zh) | 密文全文检索系统的安全覆盖网构建方法及对应的全文检索方法 | |
Liu et al. | A method of query over encrypted data in database | |
Nasereddin et al. | An object oriented programming on encrypted database system (CryptDB) | |
CN112231752B (zh) | 一种无交互频率隐藏的密文插入查询删除方法 | |
Balamurugan et al. | Multi-Keyword Graded Exploration in Encrypted Cloud Data for Industries Based on Rc4+ and Forest |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20080220 Termination date: 20110424 |