一种可验证的密文数据范围查询方法与流程

文档序号:14750425发布日期:2018-06-22 12:40阅读:411来源:国知局

本发明涉及云计算领域,特别涉及一种可验证的密文数据范围查询方法。



背景技术:

最近几年,在高速发展的互联网技术的带动下,我们的生活无时无刻不享受着互联网技术所带来的种种便利。在数据存储方面,数据外包模式如云存储得到了越来越多用户的认可。云存储服务从部署方式上可以分为公有云和私有云两种。私有云在企业内部使用,提供数据的上传,存储以及共享服务。由于是在企业内部使用,所以私有云对于用户访问数据的行为是可控的。在企业内部,只有经过管理者授权的用户才可以去访问云服务器存储的数据,管理者可以随时停止某些用户的访问权限,由于服务器在本地且不与外界联网,数据可以被信任。但在使用公有云时,用户的数据访问不能被有效地进行限制,且用户不能完全信任云服务器。但公有云的有很多优点是私有云所不具备的。对于企业用户来说,在使用时只需要根据自己的需求向云服务提供商购买服务,服务商会提供给企业相应的基础设施,在企业使用过程中提供技术支持,企业可以有效地降低成本。公有云本身的特点使用户不再受限于地理位置,在有网络的环境下能够随时随地通过各种终端去访问数据。公有云服务端提供商技术已经相对成熟,对于数据可以提供可靠的保障,用户不需要担心数据的丢失问题

随着云计算技术的普及,越来越多的用户使用云服务器来存储数据。但是对于用户而言,云服务器是不存在“绝对可信”的。为了既能及时搜索到需要的数据,同时又能防止云服务器盗取涉及到隐私的数据,用户往往会采用可搜索加密的方法去存储数据。用户将数据加密后上传到云服务器储存,当用户需要数据时,发送搜索命令到云服务器,服务器根据条件进行搜索。由于软件错误、通讯传输故障或是服务器为了节省计算资源只搜索部分数据,导致用户得到的是错误或是不完整的结果,然而用户无法验证结果是否完整。由于在很多应用场景中,用户对于自己存储在云服务器中的数据既有隐私保护的需要,又有查询的需要,同时对于查询到的数据希望是正确和完整的。例如在医院可以统计患者的年龄、身高、体重等可以用数值表示的病例数据。为了保证患者的病例不被泄露,经过处理后上传到云服务器中存储。当医生需要查询符合某些范围的病人时,可以发送查询范围至云服务器,在范围查询后得到返回的数据。当病例的样本不完整时,就会使得分析出现偏差,不能得到正确的结论。



技术实现要素:

本发明的目的在于克服现有技术的缺点与不足,提供一种高安全性以及高效率的可验证的密文数据范围查询方法,该方法通过在PBtree的叶节点存储额外信息的方式,使得用户查询后得到的结果是可以验证的,防止云服务器返回的结果不完整。

本发明的目的通过下述技术方案实现:一种可验证的密文数据范围查询方法,步骤如下:

步骤S1、针对于数据拥有者需要上传至云服务器的各本地数据,首先在数据拥有者终端根据从大到小或者从小到大的顺序针对需要上传至云服务器的各本地数据进行排序,然后针对于各本地数据,同时记录下各本地数据的前后数据,得到各本地数据的三元组数据;同时将各本地数据转换成前缀集合,并且根据各本地数据的排序,将各本地数据的前缀集合存储在一个树状的PBtree中;

步骤S2、针对于各本地数据加密:将各本地数据对应的三元组数据进行非对称加密,然后将加密后的密文存储在PBtree中对应存储该本地数据前缀集合的叶节点中;

针对于PBtree中各节点存储的前缀进行加密:针对于PBtree中每个节点,将该节点存储的各前缀集合进行并集,得到并集后的前缀集合,针对于该节点并集后的前缀集合,将其中的各前缀进行哈希函数的加密处理,将通过哈希函数加密处理后的各前缀对应存储于各布隆过滤器上;

将数据拥有者终端将上述处理后得到的PBtree发送给云服务器;

步骤S3、当数据使用者需要查询某范围所包含的数据时,首将该查询范围转换为一个最小的前缀集合,针对于前缀集合中的各前缀,分别计算其多个哈希值,然后将各前缀的多个哈希值组合形成一个矩阵,作为该查询范围的陷门;最后将该查询范围的陷门通过终端发送至云服务器;

步骤S4、当云服务器接收到陷门时,使用该陷门在PBtree中从根节点开始从上至下开始搜索,其中针对于各节点,通过陷门以及该节点中对应存储加密后的各前缀的各布隆过滤器检查是否满足以下条件:该节点中存储的并集后的前缀集合和该陷门对应查询范围最小的前缀集合的交集不为空集;若满足,则针对于该节点的后续节点再检测是否满足上述条件,直到寻找到满足上述条件的所有叶节点,将搜索到的满足上述条件的叶节点中存储的密文作为查询结果返回给数据使用者的终端;

步骤S5、数据使用者终端接收到云服务器返回的各密文后,通过私钥进行解密,得到各组解密后的数据,数据使用者根据各组解密后的数据判断其所获取到的数据大小是否连续,若连续,则表示云服务器返回的查询结果是完整的;否则表示云服务器返回的查询结果是不完整的;

若数据使用者通过终端发送陷门给云服务器后,云服务器没有查询到结果,则云服务器返回PBtree根节点存储的数据给数据使用者终端,数据使用者终端验证云服务器范围的PBtree根节点存储的数据和陷门所对应的查询范围的交集是否为空集,若否,表示服务器未返回符合范围的数据。

优选的,所述步骤S1中,将各本地数据转换成前缀集合的过程如下:首先针对于各本地数据,获取其二进制数;然后根据其二进制数获取到前缀集合:

F(x)={b1b2…bw,b1b2…bw-1*,…,b1*…*,**…*};

其中b1b2…bw为本地数据x的二进制数,w为本地数据x的二进制位数,*为二进制0或1。

优选的,所述步骤S1中,根据各本地数据的排序将各本地数据的前缀集合存储在一个树状的PBtree中的具体过程如下:

步骤S11、首先按照各本地数据的排序对各本地数据的前缀集合进行排序,由排序后的前缀集合构成根节点,然后将根节点中的前缀集合拆分成左子集Sleft和右子集Sright;进步骤S12;

其中本步骤中,当根节点中前缀集合总数为偶数时,左子集Sleft和右子集Sright中前缀集合的个数相同;当根节点中前缀集合总数为奇数时,左子集Sleft中前缀集合的个数比右子集Sright中前缀集合的个数多一个;进入步骤S12;

步骤S12、针对于各左子集Sleft进行以下处理:由当前获取到的各左子集Sleft构成各左子树的根节点,然后针对于各左子树的根节点,将该左子树的根节点中的前缀集合拆分成左子集Sleft和右子集Sright;其中当该左子树根节点中前缀集合总数为偶数时,所拆分的左子集Sleft和右子集Srigh中前缀集合的个数相同;当该左子树根节点中前缀集合总数为奇数时,所拆分的左子集Sleft中前缀集合的个数比右子集Srigh中前缀集合的个数多一个;

针对于各右子集Sright进行以下处理:由各右子集Sright分别构成各右子树的根节点;然后针对于各右子树的根节点,将该右子树各根节点中的前缀集合拆分成左子集Sleft和右子集Sright;其中当该右子树根节点中前缀集合总数为偶数时,所拆分的左子集Sleft和右子集Sright中前缀集合的个数相同;当该右子树根节点中前缀集合总数为奇数时,所拆分的左子集Sleft中前缀集合的个数比右子集Sright中前缀集合的个数多一个;

步骤S13、针对于步骤S12获取到的各左子集Sleft和各右子集Sright,分别判断其中的前缀集合个数是否为1,针对于前缀集合个数不为1的各左子集Sright和各右子集Sright,则再进行步骤S12的处理;而前缀集合个数为1的各左子集Sright和各右子集Sright分别构成PBtree的各叶节点;最后将PBtree所有的叶节点用一个链表连接。

优选的,所述步骤S2中,针对于各本地数据进行加密的过程如下:

步骤S21、选择一对不同且大于一定值的素数p和q,计算n=pq;

步骤S22、计算g(n)=(p-1)(q-1),然后找一个与g(n)互质的数e,且1<e<g(n);

步骤S23、计算d,其中d为:d≡e-1mod g(n);

步骤S24、设置公钥为pk=(e,n),私钥为sk=(d,n);然后各本地数据及其前后数据构成的三元组进行加密,得到密文为:

Ci=(di-1||di||di+1)e(mod n);

其中Ci为本地数据di及其前面数据di-1和后面数据di+1构成的三元组数据进行加密得到的密文。

优选的,所述步骤S2中,针对于PBtree中每个节点中的前缀进行加密的过程如下:

步骤S2a、首先将该节点存储的各前缀集合进行并集,得到并集后的前缀集合;

步骤S2b、获取数据拥有者和数据使用者共享的r个密钥;针对于该节点并集后的前缀集合中的每个前缀,与r个密钥组合使用哈希函数计算得到:

HMAC(k1,pi),…,HMAC(kr,pi);

其中k1,…,kr为数据拥有者和数据使用者共享的r个密钥,pi为该节点并集后的前缀集合中的第i个前缀;

步骤S2c、针对于该节点,生成一个与密钥比特位长度相同的随机数,再使用该随机数依次计算出该节点并集后的前缀集合中的每个前缀的r个哈希值:

HMAC(vx.R,HMAC(k1,pi)),…,HMAC(vx.R,HMAC(kr,pi));

其中vx.R即为针对于节点vx生成一个与密钥比特位长度相同的随机数;

步骤S2d、针对于该节点,通过步骤S2c获取到该节点并集后的前缀集合中的各前缀的r个哈希值后,即得到经过哈希函数加密后的各前缀,然后通过以下操作,将通过哈希函数加密处理后的各前缀对应存储于各布隆过滤器上:

vx.Bi[HMAC(vx.R,HMAC(kj,pi))mod M]:=1;

x=1,2,3,…X;j=1,2,3,…r;i=1,2,3,…I,

其中vx.Bi[HMAC(vx.R,HMAC(kj,pi))mod M]:=1表示将节点vx并集后的前缀集合中通过哈希函数加密后的第i个前缀pi在布隆过滤器Bi中对应所存储的位置置为1;X为PBtree中节点总数,I为节点vx并集后的前缀集合中前缀的总数;M为布隆过滤器的长度,在布隆过滤器上将相应存储加密后的前缀的位置置为1。

更进一步的,所述步骤S3中,生成陷门的过程如下:

步骤S31、针对于数据使用者给出的查询范围,首先将该查询范围转换成一个最小的前缀集合,针对于该前缀集合中的各前缀,分别通过数据拥有者和数据使用者共享的r个密钥计算出r个哈希值:

HMAC(k1,qy),…,HMAC(kr,qy);

其中qy为该查询范围最小的前缀集合中的第y个前缀,1,2,3,…Y,Y为该查询范围最小的前缀集合中前缀的总数;其中k1,…,kr为数据拥有者和数据使用者共享的r个密钥;

步骤S32、将步骤S31获取到的该查询范围最小的前缀集合中各前缀的多个哈希值组合形成一个矩阵,作为该查询范围的陷门:

其中q1至qY分别为该查询范围最小的前缀集合中的第1至Y个前缀,其中陷门中第y行对应查询范围最小的前缀集合中的第y个前缀的r个哈希值。

更进一步的,所述步骤S4中,当云服务器接收到陷门后,查询的过程具体如下:

步骤S41、首先从PBtree中根节点开始从上至下进行搜索,针对PBtree中的各节点,通过陷门以及该节点中对应存储加密后的各前缀的各布隆过滤器检查是否满足该节点中存储的并集后的前缀集合和该陷门对应查询范围最小的前缀集合的交集不为空集的条件,具体为:针对于陷门中每一行,检查该节点中对应存储加密后的各前缀的各布隆过滤器中是否有布隆过滤器与该行中任一元素计算均满足以下条件的:

vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=1;

x=1,2,3,…X;j=1,2,3,…r;i=1,2,3,…I,y=1,2,3,…Y;

若是,则表示该节点中并集后的前缀集合中包含陷门该行对应的前缀;即该节点中并集后的前缀集合和陷门所对应查询范围最小的前缀集合S([a,b])交集不为空集;

步骤S42、针对于满足上述条件的各节点,则针对于该节点的后续节点再检测是否满足上述条件,直到寻找到满足上述条件的所有叶节点,将搜索到的满足上述条件的叶节点中存储的密文作为查询结果返回给数据使用者的终端。

更进一步的,所述步骤S42中,针对PBtree中的每一节点,检查该节点对应存储加密后的各前缀的各布隆过滤器中是否存在所有布隆过滤器与陷门的某一行其中一个元素计算满足以下条件:vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=0;若是,则表示该节点中并集后的前缀集合不包含陷门该行中哈希值对应的前缀,此时针对于PBtree中该节点后续的节点进行搜索时,将陷门中该行元素进行移除当搜索到叶节点或陷门中所有行元素均被移除时,则停止搜索。

优选的,所述步骤S1中,当根据从大到小的顺序针对需要上传至云服务器的各本地数据进行排序时,则第一个本地数据与正无穷大符号和第二个本地数据构成三元组数据,最后一个本地数据与倒数第二个本地数据以及负无穷小符号构成三元组数据;

当根据从小到大的顺序针对需要上传至云服务器的各本地数据进行排序时,则第一个本地数据与负无穷大符号和第二个本地数据构成三元组数据,最后一个本地数据与倒数第二个本地数据以及正无穷大符号构成三元组数据。

优选的,所述步骤S5中,数据使用者根据各组解密后的数据判断其所获取到的数据大小是否连续的的过程如下:判断前一组解密后的第三个数据是否和后一组解密后的第一个数据相同;第一组解密后的第一个数据以及最后一组解密后的第三个数据是否在查询范围之外,若上述均为是,则判断数据使用者所获取到的数据大小是连续的。

本发明相对于现有技术具有如下的优点及效果:

(1)本发明一种可验证的密文数据范围查询方法,首先针对于各本地数据进行处理,包括对各本地数据进行排序得到各本地数据及其前后数据的三元组数据以及获取到各本地数据的前缀集合,并且将各本地数据的前缀集合存储在PBtree中;然后分别针对各本地数据对应的三元组数据以及PBtree中各节点存储并集后的前缀集合中的各前缀进行加密,将各节点中加密后的各前缀分别对应存储在各布隆过滤器中,同时将加密后的各本地数据分别存储于PBtree中对应存储该本地数据前缀集合的叶节点中;上述处理后的PBtree发送至云服务器中;当数据使用者需要查询某范围所包含的数据时,通过该查询范围生成陷门,云服务器接收到陷门后,使用陷门在PBtree中搜索,最后将对应搜索到的叶节点中的密文数据返回给数据使用者,数据使用者接收到密文数据后,对密文数据进行解密,根据各组解密后的数据判断其所获取到的数据大小是否连续,以确认云服务器返回的查询结果是完整的。另外若数据使用者通过终端发送陷门给云服务器后,云服务器没有查询到结果,则返回PBtree根节点存储的数据给数据使用者终端,数据使用者终端验证PBtree根节点存储的数据和陷门所对应的查询范围的交集是否为空集,从而判断出服务器是否返回符合范围的数据。由上述可知,本发明通过在PBtree的各叶节点存储时加入本地相邻大小的数据,当查询结果返回给用户时,用户通过解密后得到所查询数据以及相邻数据,即可验证数据是否完整;因此本发明中,数据使用者可以根据查询结果自行验证云服务器查询结果是否完整,具有查询安全性高以及效率高的优点。

(2)本发明可验证的密文数据范围查询方法中,通过PBtree存储各本地数据对应的前缀集合,可以有效提高数据搜索时的速度。

(3)本发明可验证的密文数据范围查询方法中,针对于PBtree中每个节点,在前缀集合进行加密的过程加入了随机数vx.R,通过该随机数生成依次计算出该节点并集后的前缀集合中的每个前缀的r个哈希值。本发明中上述加入的随机数能够有效消除在存储时相同的数值在不同的布隆过滤器的关联性。如果不使用随机数vx.R,那么若前缀pi在v1,v2两个节点都有存储时,U(v1)和U(v2)将都包含有前缀pi,当使用密钥计算哈希值存储在布隆过滤器时,HMAC(k1,pi)mod M,…,HMAC(kr,pi)mod M在两个节点中的布隆过滤器置为1的位置都一样,尽管在两个布隆过滤器中某些相同位置都为1时并不是说明U(v1)和U(v2)里必然包含相同的前缀,但是如果不使用随机数,两个布隆过滤器在相同位置上为1的概率会比较高,那么从敌手的角度来看,它们有很大的几率含有相同的前缀。

(4)本发明可验证的密文数据范围查询方法中,针对PBtree中的每一节点,检查该节点对应存储加密后的各前缀的各布隆过滤器中是否存在所有布隆过滤器与陷门的某一行其中一个元素计算满足以下条件:vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=0;若是,则表示该节点中并集后的前缀集合不包含陷门该行中哈希值对应的前缀;那么针对于PBtree中该节点后续的节点进行搜索时,将陷门中该行元素进行移除,即在该节点后续的节点搜索过程中,将不再匹配陷门该行所对应的前缀,即默认后续节点与该前缀的交集为空,这将大大提高了云服务器搜索的速度。

附图说明

图1是本发明方法中PBtree结构图。

图2是本发明方法中PBtree中节点vx中并集后的前缀集合中每个前缀pi的r个哈希值存储到布隆过滤器的对应位置的示意图。

具体实施方式

下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。

实施例

本实施例公开了一种可验证的密文数据范围查询方法,步骤如下:

步骤S1、针对于数据拥有者需要上传至云服务器的各本地数据,首先在数据拥有者终端根据从大到小或者从小到大的顺序针对需要上传至云服务器的各本地数据进行排序,然后针对于各本地数据,同时记录下各本地数据的前后数据,得到各本地数据的三元组数据;同时将各本地数据转换成前缀集合,并且根据各本地数据的排序,将各本地数据的前缀集合存储在一个树状的PBtree中;

其中,在本步骤中当根据从大到小的顺序针对需要上传至云服务器的各本地数据进行排序时,则第一个本地数据与正无穷大符号和第二个本地数据构成三元组数据,最后一个本地数据与倒数第二个本地数据以及负无穷小符号构成三元组数据;其中,在本步骤中当根据从小到大的顺序针对需要上传至云服务器的各本地数据进行排序时,则第一个本地数据与负无穷大符号和第二个本地数据构成三元组数据,最后一个本地数据与倒数第二个本地数据以及正无穷大符号构成三元组数据。例如需要上传至云服务器的各本地数据的集合为S={1,9,4,8,14,11,16,21,26,10},则按照从小到大的数据排序后,变为S'={1,4,8,9,10,11,14,16,21,26},针对于本地数据4,则由其前后相邻的数据1和8构成三元组数据P(4)={1,4,8}。当本地数据为第一个时,即处于队列头部时,则得到对应三元组数组为P(1)={-∞,1,4};当本地数据为最后一个时,则得到对应三元组数据为P(26)={21,26,∞}。

在本步骤中,将各本地数据转换成前缀集合的过程如下:首先针对于各本地数据,获取其二进制数;然后根据其二进制数获取到前缀集合:

F(x)={b1b2…bw,b1b2…bw-1*,…,b1*…*,**…*};

其中b1b2…bw为本地数据x的二进制数,w为本地数据x的二进制位数,*为二进制0或1。

在本步骤中,根据各本地数据的排序将各本地数据的前缀集合存储在一个树状的PBtree中的具体过程如下:

步骤S11、首先按照各本地数据的排序对各本地数据的前缀集合进行排序,由排序后的前缀集合构成根节点,然后将根节点中的前缀集合拆分成左子集Sleft和右子集Sright;进步骤S12;

其中本步骤中,当根节点中前缀集合总数为偶数时,左子集Sleft和右子集Sright中前缀集合的个数相同;当根节点中前缀集合总数为奇数时,左子集Sleft中前缀集合的个数比右子集Sright中前缀集合的个数多一个;进入步骤S12;

步骤S12、针对于各左子集Sleft进行以下处理:由当前获取到的各左子集Sleft构成各左子树的根节点,然后针对于各左子树的根节点,将该左子树的根节点中的前缀集合拆分成左子集Sleft和右子集Sright;其中两个子集中前缀集合的个数相同或相差一个,在本实施例中,当该左子树根节点中前缀集合总数为偶数时,所拆分的左子集Sleft和右子集Srigh中前缀集合的个数相同;当该左子树根节点中前缀集合总数为奇数时,所拆分的左子集Sleft中前缀集合的个数比右子集Srigh中前缀集合的个数多一个;

针对于各右子集Sright进行以下处理:由各右子集Sright分别构成各右子树的根节点;然后针对于各右子树的根节点,将该右子树各根节点中的前缀集合拆分成左子集Sleft和右子集Sright;其中两个子集中前缀集合的个数相同或相差一个;在本实施例中,当该右子树根节点中前缀集合总数为偶数时,所拆分的左子集Sleft和右子集Sright中前缀集合的个数相同;当该右子树根节点中前缀集合总数为奇数时,所拆分的左子集Sleft中前缀集合的个数比右子集Sright中前缀集合的个数多一个;

步骤S13、针对于步骤S12获取到的各左子集Sleft和各右子集Sright,分别判断其中的前缀集合个数是否为1,针对于前缀集合个数不为1的各左子集Sright和各右子集Sright,则再进行步骤S12的处理;而前缀集合个数为1的各左子集Sright和各右子集Sright分别构成PBtree的各叶节点;最后将PBtree所有的叶节点用一个链表连接。如图1所示为排序后的本地数据d1,…,d9的前缀集合F(d1),…,F(d9)存储在一个树状的PBtree后的结构图。图1中第一级即为根节点,由所有的前缀集合F(d1),…,F(d9)构成,针对于每一级的每个节点,将该节点中的前缀集合分成两个子集合,由这两个子集合分别构成下一级的两个节点,其中两个子集合中前缀集合的个数相同或相差1个;例如针对于根节点,将其拆分成左右子集后,左子集由前缀集合F(d1),F(d2),F(d3),F(d4)组成,右子集由前缀集合F(d6),F(d7),F(d8),F(d9)组成,上述左子集和右子集分别构成第二级的两个节点,以此类推,得到各级的节点,当节点中只包含一个前缀集合时,则停止针对该节点的拆分。

步骤S2、针对于各本地数据加密:将各本地数据对应的三元组数据进行非对称加密,然后将加密后的密文存储在PBtree中对应存储该本地数据前缀集合的叶节点中;在实施例中,针对于各本地数据进行加密的过程如下:

步骤S21、选择一对不同且大于一定值的素数p和q,计算n=pq;

步骤S22、计算g(n)=(p-1)(q-1),然后找一个与g(n)互质的数e,且1<e<g(n)。

步骤S23、计算d,其中d为:d≡e-1mod g(n)。

步骤S24、设置公钥为pk=(e,n),私钥为sk=(d,n);然后各本地数据及其前后数据构成的三元组进行加密,得到密文为:

Ci=(di-1||di||di+1)e(mod n);

其中Ci为本地数据di及其前面数据di-1和后面数据di+1构成的三元组数据进行加密得到的密文。

针对于PBtree中各节点存储的前缀进行加密:针对于PBtree中每个节点,将该节点存储的各前缀集合进行并集,得到并集后的前缀集合,针对于该节点并集后的前缀集合,将其中的各前缀进行哈希函数的加密处理,将通过哈希函数加密处理后的各前缀对应存储于各布隆过滤器上,其中每个前缀对应使用一个布隆过滤器进行存储,即在每个节点中,所使用的并集后的布隆过滤器数量和该节点并集后的前缀集合中前缀的个数相同。

其中,在本实施例中,针对于PBtree中每个节点中的前缀进行加密的过程如下:

步骤S2a、首先将该节点存储的各前缀集合进行并集,得到并集后的前缀集合;

步骤S2b、获取数据拥有者和数据使用者共享的r个密钥;针对于该节点并集后的前缀集合中的每个前缀,与r个密钥组合使用哈希函数计算得到:

HMAC(k1,pi),…,HMAC(kr,pi);

其中k1,…,kr为数据拥有者和数据使用者共享的r个密钥,pi为该节点并集后的前缀集合中的第i个前缀;

步骤S2c、针对于该节点,生成一个与密钥比特位长度相同的随机数,再使用该随机数依次计算出该节点并集后的前缀集合中的每个前缀的r个哈希值:

HMAC(vx.R,HMAC(k1,pi)),…,HMAC(vx.R,HMAC(kr,pi));

其中vx.R即为针对于节点vx生成一个与密钥比特位长度相同的随机数;

步骤S2d、针对于该节点,通过步骤S2c获取到该节点并集后的前缀集合中的各前缀的r个哈希值后,即得到经过哈希函数加密后的各前缀,然后通过以下操作,将通过哈希函数加密处理后的各前缀对应存储于各布隆过滤器上:

vx.Bi[HMAC(vx.R,HMAC(kj,pi))mod M]:=1;

x=1,2,3,…X;j=1,2,3,…r;i=1,2,3,…I,

其中vx.Bi[HMAC(vx.R,HMAC(kj,pi))mod M]:=1表示将节点vx并集后的前缀集合中通过哈希函数加密后的第i个前缀pi在布隆过滤器Bi中对应所存储的位置置为1;X为PBtree中节点总数,I为节点vx并集后的前缀集合中前缀的总数;M为布隆过滤器的长度,在布隆过滤器上将相应存储加密后前缀的位置置为1,由于每个前缀分别与r个秘钥组合,针对于同一个前缀,将得到r个经过加密后的前缀。如图2所示,将分别经过秘钥k1,…,kr加密后的前缀pi分别置于布隆过滤器r个位置上,本实施例中每个布隆过滤器将由r个位置被置为1。

将数据拥有者终端将上述处理后得到的PBtree发送给云服务器;上述处理后的PBtree指的叶节点添加了三元组数据密文以及各节点并集后的前缀集合中经过哈希函数加密后的各前缀存储到对应布隆过滤器上的PBtree。

步骤S3、当数据使用者需要查询某范围所包含的数据时,首将该查询范围转换为一个最小的前缀集合,针对于前缀集合中的各前缀,分别计算其多个哈希值;然后将各前缀的多个哈希值组合形成一个矩阵,作为该查询范围的陷门;最后将该查询范围的陷门通过终端发送至云服务器;

在本实施例本步骤中,生成陷门的具体过程如下:

步骤S31、针对于数据使用者给出的查询范围,首先将该查询范围转换成一个最小的前缀集合,针对于该前缀集合中的各前缀,分别通过数据拥有者和数据使用者共享的r个密钥计算出r个哈希值:

HMAC(k1,qy),…,HMAC(kr,qy);

其中qy为该查询范围最小的前缀集合中的第y个前缀,1,2,3,…Y,Y为该查询范围最小的前缀集合中前缀的总数;其中k1,…,kr为数据拥有者和数据使用者共享的r个密钥;

步骤S32、将步骤S31获取到的该查询范围最小的前缀集合中各前缀的多个哈希值组合形成一个矩阵M[a,b],作为该查询范围的陷门:

其中q1至qY分别为该查询范围最小的前缀集合中的第1至Y个前缀,其中陷门中第y行对应查询范围最小的前缀集合中的第y个前缀的r个哈希值。

步骤S4、当云服务器接收到陷门时,使用该陷门在PBtree中从根节点开始从上至下开始搜索,其中针对于各节点,通过陷门以及该节点中存储加密后的各前缀的各布隆过滤器上检查是否满足以下条件:该节点中存储的并集后的各前缀集合和该陷门对应查询范围最小的前缀集合的交集不为空集;若满足,则针对于该节点的后续节点再检测是否满足上述条件,直到寻找到满足上述条件的所有叶节点,将搜索到的满足上述条件的叶节点中存储的密文作为查询结果返回给数据使用者的终端;其中本实施例本步骤中,当云服务器接收到陷门后,查询的过程具体如下:

步骤S41、首先从PBtree中根节点开始从上至下进行搜索,针对PBtree中的各节点,通过陷门以及该节点中对应存储各加密后的前缀的各布隆过滤器检查是否满足该节点中存储的并集后的前缀集合和该陷门对应查询范围最小的前缀集合的交集不为空集的条件,具体为:针对于陷门中每一行(即j=1,2,3,…r),检查该节点中对应存储加密后的各前缀的各布隆过滤器中是否有布隆过滤器与该行中任一元素计算均满足以下条件的:

vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=1;

x=1,2,3,…X;j=1,2,3,…r;i=1,2,3,…I,y=1,2,3,…Y;

若是,则表示该节点中并集后的前缀集合中包含陷门该行对应的前缀;即该节点中并集后的前缀集合和陷门所对应查询范围最小的前缀集合S([a,b])交集不为空集;其中上述公式中,当j去1到r时,针对于节点vx以及节点vx中的其中一个布隆过滤器Bi均满足上述关系时,则表示此时节点vx中存储的各前缀集合的并集U(vx)中包含有前缀qy,即节点vx中存储的各前缀集合的并集U(vx)和陷门所对应查询范围最小的前缀集合S([a,b])交集不为空集,即其中S([a,b])={q1,…,qY}。

步骤S42、针对于满足上述条件的各节点,则针对于该节点的后续节点再检测是否满足上述条件,直到寻找到满足上述条件的叶节点,将搜索到的满足上述条件的叶节点中存储的密文作为查询结果返回给数据使用者的终端;例如当搜索到某一叶节点vx时,依然满足上述步骤S41中的条件:vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=1,则说明叶节点vx存储的本地数据属于查询范围S([a,b]),则将叶节点vx中存储的密文数据作为查询结果范围数据使用者。

其中,在本步骤中,针对PBtree中的每一节点vx,检查该节点对应存储加密后的各前缀的各布隆过滤器中是否存在所有布隆过滤器与陷门的某一行其中一个元素计算满足以下条件:

vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=0;

若是,此时表示节点vx中存储的各前缀集合的并集U(vx)中不包含有前缀qy;那么针对于PBtree的该节点vx,其后续的节点中存储的各前缀集合的并集均不包含陷门该行的哈希值所对应的前缀,此时针对于PBtree中该节点vx后续的节点vm进行搜索时,将陷门中该行即第y行元素进行移除,即针对于该节点vx后续的这些节点,将不再检查这些节点中是否有布隆过滤器与陷门该行即第y行任意一元素计算是否均满足以下关系:

vm.Bi[HMAC(vm.R,HMAC(kj,qy))mod M]:=1;

其中vm指的是vx后续的节点,m=1,2,3,…Z,Z为vx后续的节点总数,vm.R表示的是针对于节点vm生成一个与密钥比特位长度相同的随机数;

当搜索到叶节点或陷门中所有行元素均被移除时,则停止搜索。

在本实施例中,检查vx.Bi[HMAC(vx.R,HMAC(kj,qy))mod M]:=1是否成立指的是根据陷门中的前缀qy计算的哈希值所表示的布隆过滤器Bi中的位置是否为1。如果为1,则表示该布隆过滤器Bi中存储的前缀与qy是相同的,即qy存在于PBtree中;如果为0,则表示qy不存在于布隆过滤器Bi中。

本实施例中,某节点后续节点指的是以该节点为根节点经过各级依次拆分之后得到的各节点。

步骤S5、数据使用者终端接收到云服务器返回的各密文后,通过私钥进行解密,得到各组解密后的数据,数据使用者根据各组解密后的数据判断其所获取到的数据大小是否连续,若连续,则表示云服务器返回的查询结果是完整的;否是,则表示云服务器返回的查询结果是不完整的;在本实施例中,数据使用者根据各组解密后的数据判断其所获取到的数据大小是否连续的的过程如下:判断前一组解密后的第三个数据是否和后一组解密后的第一个数据相同,第一组解密后的第一个数据以及最后一组解密后的第三个数据是否在查询范围之外,若上述均为是,则判断数据使用者所获取到的数据大小是连续的。

另外,若数据使用者通过终端发送陷门给云服务器后,云服务器没有查询到结果,则云服务器返回PBtree根节点存储的数据给数据使用者终端,数据使用者终端验证云服务器范围的PBtree根节点存储的数据和陷门所对应的查询范围的交集是否为空集,若否,表示服务器未返回符合范围的数据。

其中云服务器中PBtree根节点存储的数据为:存储在布隆过滤器中通过哈希函数加密后的各前缀,其中各前缀指的是各本地数据并集后的前缀集合中的各前缀。

例如数据使用者查询的范围为[a,b],当云服务器返回的各密文分别为Ci、Cj和Ck时,则数据使用者经过解密后获取到数据为:

{di-1,di,di+1,dj-1,dj,dj+1,dk-1,dk,dk+1}

此时数据使用者验证上述集合中的数据是否满足di+1=dj-1,dj+1=dk-1,且di-1和dk+1在范围[a,b]之外,若满足,则表示云服务返回的数据是完整的。

例如当数据使用者查询的范围为[a,b]时,云服务器查询到结果,则将返回PBtree根节点存储的各前缀集合的并集U(T.root),数据使用者通过验证U(T.root)是否成立即可货值服务是否返回符合范围的数据,当上述等式不成立时,则表示服务器未返回符合范围的数据。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1