本发明属于数据安全
技术领域:
:,特别涉及一种sqlite数据库冗余数据清除方法。
背景技术:
::sqlite是一种独立、无服务、零配置、事务性的轻量级嵌入式数据库,在各种嵌入式平台有着广泛的应用。sun公司的solaris操作系统、firefox浏览器、android手机、iphone、ipad以及一些导航系统中都使用了sqlite。但是,利用sqlite提供的api来删除数据,只通过修改数据单元所在页面的页头信息和单元数据的部分头部信息将单元标记为删除状态,并没有真正将数据从数据库文件中删除,从而给不法分子提供了通过数据库文件来恢复已删除的内容,从而进一步窃取隐私数据,将对用户、企事业单位甚至是国家造成危害。因此,基于以上分析,本发明人对现有的sqlite数据库管理方案进行研究改进,本案由此产生。技术实现要素:本发明的目的,在于提供一种sqlite数据库冗余数据清除方法,其可彻底清除sqlite数据库文件中已被删除的数据,从而保护用户隐私。为了达成上述目的,本发明的解决方案是:一种sqlite数据库冗余数据清除方法,包括如下步骤:步骤1,以二进制读写独占的方式打开sqlite数据库文件,并根据sqlite数据库文件格式解析文件头,获得数据库的属性信息;步骤2,构建包含数据库中每一个页面的状态的页状态向量,并标记每一个页面的冗余数据清除状态:若成功执行对当前页的冗余数据清除操作,则将该页面的状态标记为-1,否则标记为0;步骤3,根据sqlite数据库文件格式按页解析数据库的页面数据,逐页清除数据库文件中的冗余数据。上述步骤2中,将指针页和锁字节页的状态直接标记为-1。上述步骤3中,清除的冗余数据为数据库中除数据库参数、格式信息和存在于数据库中的单元数据之外的所有数据。上述步骤3中,清除数据库文件中的冗余数据的具体过程是:步骤s031,通过sqlite的sqlite3_get_table接口从数据库的sqlite_master表中获取数据库所有表和索引的根页页号;步骤s032,根据表和索引的根页页号,先序遍历每个表的所有页,依照sqlite数据库文件格式解析每个页的页头信息,根据页头信息定位冗余数据的位置,清除每一页的冗余数据,同时更新相应页号状态,包括sqlite_master页;步骤s033,在清除操作执行完毕后,通过页状态向量判断是否存在遗漏页,若有则对遗漏页单独执行冗余数据清除操作,直至完成所有页的数据清除操作。上述步骤3中,在对某一个页面执行冗余数据清除操作前,首先判断该页面的状态,若为-1,则直接跳过该页面,若为0,则继续计算该页面的crc32值,并与存储在本地的crc32值进行比较,若二者相等则直接跳过该页面,否则对该页面执行冗余数据清除操作,成功执行后重新计算该页面的crc32值,并更新存储在本地。上述步骤s032中,在执行冗余数据清除时先清除空闲页,后清除btree页和溢出页。上述步骤s032中,空闲页冗余数据的具体清除方式为:先判断数据库的空闲页链表首指针信息是否为空,若该指针不为空,则根据空闲页链表首指针遍历整个空闲页链表,定位所有空闲叶子页的页号,直接清空整个空闲叶子页中的数据,同时更新当前空闲叶子页对应的页状态;若该指针为空,则不执行空闲页的冗余数据清除操作;其中,通过预置偏移地址pre_offset作为每页的起始偏移地址;若其中有溢出单元,立即定位到最后一个溢出页,清除其中的冗余数据;通过单元信息及所在地址和自由块地址的比较估算得到溢出页中存储的数据长度,具体计算如下:①假设当前页有n个单元,对其地址进行排序,记为a;②假设当前页的m个自由块,对其地址进行排序,记为b;③假设ai为第i个单元为溢出单元,bj为第j个自由块,单元长度为cell_len,当i<n时,若存在ai<bj<ai 1且bj-1<ai或j=1,则b-tree页中用于存放该溢出单元的最大字节数为max_len=bj-ai;否则max_len=ai 1-ai;当i=n时,若存在ai<bj,则max_len=bj-ai,否则max_len=page_size-ai-reserved_byte;④b-tree页中存储的溢出单元字节数为:max_len-4;⑤第一个溢出页号:⑥溢出页中存储的溢出单元字节数为:cell_len-max_len 4;根据溢出页的存储规则和第一个溢出页号,定位到最后一个溢出页,估算出最后一个溢出页中的溢出单元数据字节数overflow_byte_len。溢出冗余数据的定位方式如下:最后一个溢出页需要清理的数据的偏移地址范围为:[overflow_byte_len threshold,page_size-reserved_byte]只有当page_size-reserved_byte>overflow_byte_len threshold时,才对当前溢出页执行冗余数据清除。采用上述方案后,本发明通过页状态向量保证清除操作无遗漏,通过校验crc32避免对无冗余数据的页面执行操作,通过本发明提出的方法可快速定位到溢出页中的冗余数据,从而保证本申请提到针对数据库冗余数据的清除操作不仅能够全面彻底,且有很高的执行效率。附图说明图1是本发明进行数据清除的框架示意图;图2是本发明进行冗余数据清除的流程图。具体实施方式以下将结合附图,对本发明的技术方案及有益效果进行详细说明。如图1和图2所示,本发明提供一种sqlite数据库冗余数据清除方法,包括如下步骤:步骤s01,以二进制读写独占的方式打开sqlite数据库文件,并根据sqlite数据库文件格式解析文件头,获得数据库的属性信息,具体包括:页的大小、页数、空闲页链表首指针、空闲页页数、auto-vacuum状态、锁字节页和保留字节等;步骤s02,根据数据库的页数n,设置数据库的页状态向量xn=[x1,x2,…,xn],x1,x2,…,xn分别表示第1,2,…,n个页面的页状态;标记每一个页面的冗余数据清除状态,以便检查追踪数据库冗余数据的清除情况;所述步骤s02中,页状态向量的具体标记方式为:对于第i(i=1,2,…,n)个页面,若成功执行对当前页的冗余数据清除操作,则将其状态标记为-1,也即xi=-1,否则标记为0;特别的,在设置数据库的页状态向量时,若数据库为auto-vacuum数据库,则将指针页状态标记为-1,而若数据库大小超过1gb,则将锁字节页状态标记为-1,即在执行冗余数据清除时不对指针页和锁字节页进行清除;步骤s03,根据sqlite数据库文件格式按页解析数据库的页面数据,逐页清除数据库文件中的冗余数据;所述步骤s03中,清除的冗余数据为数据库中除数据库参数、格式信息和存在于数据库中的单元数据之外的所有数据,根据sqlite数据库的文件格式解析数据库文件获得;配合图2所示,步骤s03中清除数据库文件中的冗余数据的具体过程是:s031,通过sqlite的sqlite3_get_table接口从数据库的sqlite_master表中获取数据库所有表和索引的根页页号;步骤s032,根据表和索引的根页页号,先序遍历每个表的所有页,依照sqlite数据库文件格式解析每个页的页头信息,根据页头信息定位冗余数据的位置,清除每一页的冗余数据,同时更新相应页号状态,包括sqlite_master页;在执行冗余数据清除操作前,先进行页状态向量的判断和crc32值的比较,且页状态向量的判断优先于crc32值的比较,其中,页状态向量的判断的目的是获知当前待处理页的页状态,若页状态为0,则对当前页进行处理,否则不进行处理;而crc32值的比较目的是为了提高冗余数据清除操作的执行效率,若是第一次对数据库执行冗余数据清除操作,则在清除完每页的冗余数据后计算当前页的crc32值,并按页的顺序保存在本地;如果不是第一次执行冗余数据清除操作,则在执行清除操作前先计算页的crc32值,并与存储在本地的对应页的crc32值比较。若两者相等则无需对当前页进行处理,若不相等,则清除完当前页的冗余数据后,重新计算当前页的crc32值,并用该值更新存储在本地的当前页的crc32值;需要说明的是,对于需要执行冗余数据清除操作的页,不用计算其crc32值,更不用进行crc32值的比较,直接在本地将其crc32值设置为crc32取值范围之外的任意值作为占位符,考虑到存储空间和效率问题本实施例取-1;步骤s033,在清除操作执行完毕后,通过页状态向量判断是否存在遗漏页,若有则对遗漏页单独执行冗余数据清除操作,直至完成所有页的数据清除操作;所述步骤s032中,在执行冗余数据清除时先清除空闲页,后清除btree页和溢出页;所述步骤s032中,空闲页冗余数据的具体清除方式为:先判断步骤s01获取的空闲页链表首指针信息是否为空,若该指针不为空,则根据空闲页链表首指针遍历整个空闲页链表,定位所有空闲叶子页的页号,直接清空整个空闲叶子页中的数据,同时更新当前空闲叶子页对应的页状态;若该指针为空,则不执行空闲页的冗余数据清除操作;其中,通过预置偏移地址pre_offset作为每页的起始偏移地址,实现第一页和其他页的统一处理(若页号为1,则pre_offset=100,否则pre_offset=0);若其中有溢出单元,立即定位到最后一个溢出页,清除其中的冗余数据;通过单元信息及所在地址和自由块地址的比较估算得到溢出页中存储的数据长度,具体计算如下:①假设当前页有n个单元,对其地址进行排序,记为a;②假设当前页的m个自由块,对其地址进行排序,记为b;③假设ai为第i个单元为溢出单元,bj为第j个自由块,单元长度为cell_len,当i<n时,若存在ai<bj<ai 1且bj-1<ai或j=1,则b-tree页中用于存放该溢出单元的最大字节数为max_len=bj-ai;否则max_len=ai 1-ai;当i=n时,若存在ai<bj,则max_len=bj-ai,否则max_len=page_size-ai-reserved_byte;④b-tree页中存储的溢出单元字节数为:max_len-4;⑤第一个溢出页号:⑥溢出页中存储的溢出单元字节数为:cell_len-max_len 4;根据溢出页的存储规则和第一个溢出页号,定位到最后一个溢出页,估算出最后一个溢出页中的溢出单元数据字节数overflow_byte_len,具体计算如下:overflow_byte_len=(cell_len-max_len 4)mod(page_size-4-reserved_byte)溢出冗余数据的定位方式如下:最后一个溢出页需要清理的数据的偏移地址范围为:[overflow_byte_len threshold,page_size-reserved_byte]只有当page_size-reserved_byte>overflow_byte_len threshold时,才对当前溢出页执行冗余数据清除。其中,threshold是为了给溢出单元留空间余量,防止误删有用的数据,取值应大于4(因为溢出页的前4个字节用于存储下一溢出页页号),一般取10即可。以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。当前第1页1 2 3 当前第1页1 2 3 
技术特征:1.一种sqlite数据库冗余数据清除方法,其特征在于包括如下步骤:
步骤1,以二进制读写独占的方式打开sqlite数据库文件,并根据sqlite数据库文件格式解析文件头,获得数据库的属性信息;
步骤2,构建包含数据库中每一个页面的状态的页状态向量,并标记每一个页面的冗余数据清除状态:若成功执行对当前页的冗余数据清除操作,则将该页面的状态标记为-1,否则标记为0;
步骤3,根据sqlite数据库文件格式按页解析数据库的页面数据,逐页清除数据库文件中的冗余数据。
2.如权利要求1所述的一种sqlite数据库冗余数据清除方法,其特征在于:所述步骤2中,将指针页和锁字节页的状态直接标记为-1。
3.如权利要求1所述的一种sqlite数据库冗余数据清除方法,其特征在于:所述步骤3中,清除的冗余数据为数据库中除数据库参数、格式信息和存在于数据库中的单元数据之外的所有数据。
4.如权利要求3所述的一种sqlite数据库冗余数据清除方法,其特征在于:所述步骤3中,清除数据库文件中的冗余数据的具体过程是:
步骤s031,通过sqlite的sqlite3_get_table接口从数据库的sqlite_master表中获取数据库所有表和索引的根页页号;
步骤s032,根据表和索引的根页页号,先序遍历每个表的所有页,依照sqlite数据库文件格式解析每个页的页头信息,根据页头信息定位冗余数据的位置,清除每一页的冗余数据,同时更新相应页号状态,包括sqlite_master页;
步骤s033,在清除操作执行完毕后,通过页状态向量判断是否存在遗漏页,若有则对遗漏页单独执行冗余数据清除操作,直至完成所有页的数据清除操作。
5.如权利要求1所述的一种sqlite数据库冗余数据清除方法,其特征在于:所述步骤3中,在对某一个页面执行冗余数据清除操作前,首先判断该页面的状态,若为-1,则直接跳过该页面,若为0,则继续计算该页面的crc32值,并与存储在本地的crc32值进行比较,若二者相等则直接跳过该页面,否则对该页面执行冗余数据清除操作,成功执行后重新计算该页面的crc32值,并更新存储在本地。
6.如权利要求1所述的一种sqlite数据库冗余数据清除方法,其特征在于:所述步骤s032中,在执行冗余数据清除时先清除空闲页,后清除btree页和溢出页。
7.如权利要求1所述的一种sqlite数据库冗余数据清除方法,其特征在于:所述步骤s032中,空闲页冗余数据的具体清除方式为:先判断数据库的空闲页链表首指针信息是否为空,若该指针不为空,则根据空闲页链表首指针遍历整个空闲页链表,定位所有空闲叶子页的页号,直接清空整个空闲叶子页中的数据,同时更新当前空闲叶子页对应的页状态;若该指针为空,则不执行空闲页的冗余数据清除操作;
其中,通过预置偏移地址pre_offset作为每页的起始偏移地址;
若其中有溢出单元,立即定位到最后一个溢出页,清除其中的冗余数据;
通过单元信息及所在地址和自由块地址的比较估算得到溢出页中存储的数据长度,具体计算如下:
①假设当前页有n个单元,对其地址进行排序,记为a;
②假设当前页的m个自由块,对其地址进行排序,记为b;
③假设ai为第i个单元为溢出单元,bj为第j个自由块,单元长度为cell_len,当i<n时,若存在ai<bj<ai 1且bj-1<ai或j=1,则b-tree页中用于存放该溢出单元的最大字节数为max_len=bj-ai;否则max_len=ai 1-ai;当i=n时,若存在ai<bj,则max_len=bj-ai,否则max_len=page_size-ai-reserved_byte;
④b-tree页中存储的溢出单元字节数为:max_len-4;
⑤第一个溢出页号:
⑥溢出页中存储的溢出单元字节数为:cell_len-max_len 4;
根据溢出页的存储规则和第一个溢出页号,定位到最后一个溢出页,估算出最后一个溢出页中的溢出单元数据字节数overflow_byte_len。
8.如权利要求7所述的一种sqlite数据库冗余数据清除方法,其特征在于:溢出冗余数据的定位方式如下:
最后一个溢出页需要清理的数据的偏移地址范围为:
[overflow_byte_len threshold,page_size-reserved_byte]
只有当page_size-reserved_byte>overflow_byte_len threshold时,才对当前溢出页执行冗余数据清除。
技术总结本发明公开一种SQLite数据库冗余数据清除方法,包括如下步骤:步骤1,以二进制读写独占的方式打开SQLite数据库文件,并根据SQLite数据库文件格式解析文件头,获得数据库的属性信息;步骤2,构建包含数据库中每一个页面的状态的页状态向量,并标记每一个页面的冗余数据清除状态:若成功执行对当前页的冗余数据清除操作,则将该页面的状态标记为‑1,否则标记为0;步骤3,根据SQLite数据库文件格式按页解析数据库的页面数据,逐页清除数据库文件中的冗余数据。此种冗余数据清除方法可彻底清除SQLite数据库文件中已被删除的数据,从而保护用户隐私。
技术研发人员:陈明志;翁才杰;许春耀;饶庆裕;杨小权;谢加良;傅明建;张瑞
受保护的技术使用者:北卡科技有限公司
技术研发日:2020.11.14
技术公布日:2021.03.12