一种SQLite数据库文件安全存取方法及装置与流程

文档序号:23419210发布日期:2020-12-25 11:41阅读:153来源:国知局
一种SQLite数据库文件安全存取方法及装置与流程

本发明涉及嵌入式数据库领域,尤其涉及一种sqlite数据库文件安全存取方法及装置。



背景技术:

sqlite是嵌入式轻量数据库,被android及pc应用广泛使用、也是android系统、chrome、金石等浏览器内置数据库,它是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的sql数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,不需要在系统中配置。

原生的免费版sqlite有一个致命缺点:不支持加密,导致存储在sqlite中的数据可以被任何人用任何文本编辑器查看到,收费版sqlite以及通过sqlite提供的加密的接口实现加密的开源类软件,实现了基于国际标准算法des、sha512等的加密数据库,但是算法实现为纯软件实现,存在一定的安全风险,密钥的生成与存储也无硬件保护,密钥存在很大的泄漏风险,通过静态分析、动态调试或者hook技术可以拿到密钥,因此基于国际标准算法实现的收费或者开源加密数据库sqlite有很大安全风险,容易造成数据泄露或数据被篡改。



技术实现要素:

为了解决上述问题,有必要提供基于商用密码算法实现的一种sqlite数据库文件安全存取方法及装置。

本发明第一方面提出一种sqlite数据库文件安全存取方法,所述方法包括以下步骤:

应用程序加载并打开sqlite数据库;

检测是否插入硬件密码模块,如是则进行pin码校验,否则继续检测;

pin码校验成功后,从所述硬件密码模块密钥存储区域获取key,将获取的key设置为sqlite数据库文件加密密钥;

若为首次使用sqlite数据库,先调用所述硬件密码模块提供的随机数接口生成16字节随机数作为原始密钥,将原始密钥通过所述硬件密码模块提供的sm1对称密码算法及设备主密钥加密,生成原始密钥密文作为key存储于所述硬件密码模块的密钥存储区域;

在写sqlite数据库文件时,调用sqlite数据库文件加密密钥,对sqlite数据库的写入文件内容逐页进行加密,生成加密数据文件,其中,加密数据文件中的文件头和reserved字段不进行加密;

若待加密sqlite数据库文件的页数为第一页,则先计算所述sqlite数据库文件第一页的16字节盐值,调用所述硬件密码模块对key进行解密获取原始密钥,将原始密钥与所述16字节盐值按位相与后,再进行三次pbkdf2-hmac-sm3运算,生成sqlite数据库文件加密密钥;

执行加密后,使用sqlite数据库文件加密密钥及sqlite数据库文件的每页加密密文,进行hmac-sm3杂凑运算,获取加密数据文件每页的密文消息认证码,填充在page尾部。

基于上述,还包括以下步骤:

获取待解密的sqlite数据库加密文件,使用sqlite数据库文件加密密钥及sqlite数据库文件的每页加密密文,进行hmac-sm3杂凑运算,获取待验证的密文消息认证码,将该待验证的密文消息认证码与page尾部的密文消息认证码进行比对,若一致,则在读取sqlite数据库文件时,调用sqlite数据库文件加密密钥对待解密的sqlite数据库加密文件内容逐页进行解密,获得原始的sqlite数据库文件内容;

否则抛出异常。

基于上述,所述杂凑运算方法均为硬件密码模块提供的sm3算法。

基于上述,对sqlite数据库的写入文件内容逐页进行加密时,通过调用硬件密码模块提供的sm4算法进行数据加密。

基于上述,对待解密的sqlite数据库加密文件内容逐页进行解密时,通过调用硬件密码模块提供的sm4算法进行数据解密。

本发明第二方面提供了一种sqlite数据库文件安全存储装置,包括嵌入式sqlite数据库、接口单元以及硬件密码模块,其中,

所述sqlite数据库通过所述接口单元使用所述硬件密码模块;

所述接口单元包括硬件密码模块检测单元和硬件密码模块调用单元;

所述硬件密码模块检测单元,用于检测是否插入所述硬件密码模块;

所述硬件密码模块调用单元,用于调用所述硬件密码模块;

所述硬件密码模块包括设备密钥存储单元、随机数生成单元、加解密单元和加密密钥存储单元;

所述设备密钥保存单元,用于保存所述硬件密码模块的设备主密钥;

所述随机数生成单元,用于生成16字节随机数作为原始密钥;

所述加解密单元内置加密算法和杂凑算法,用于加密密钥的生成以及加密数据文件的加解密;

所述加密密钥保存单元用于保存sqlite数据库文件加密密钥;

当检测到硬件密码模块插入,所述sqlite数据库通过所述硬件密码模块调用单元,调用所述硬件密码模块进行pin码校验,校验成功后,从所述加密密钥保存单元获取key,将获取的key设置为sqlite数据库文件加密密钥;

若为首次使用sqlite数据库,所述sqlite数据库通过所述硬件密码模块调用单元,调用所述硬件密码模块的随机数生成单元,生成16字节随机数作为原始密钥;调用所述加解密单元将原始密钥通过sm1对称密码算法及设备主密钥加密,生成原始密钥密文作为key存储于所述加密密钥保存单元;

在写sqlite数据库文件时,所述sqlite数据库通过所述硬件密码模块调用单元,调用所述加解密单元使用sqlite数据库文件加密密钥对sqlite数据库的写入文件内容逐页进行加密,生成加密数据文件存储于所述加密密钥保存单元,其中,加密数据文件中的文件头和reserved字段不进行加密;

若待加密sqlite数据库文件的页数为第一页,则先计算所述sqlite数据库文件第一页的16字节盐值,调用所述加解密单元对key进行解密获取原始密钥,将原始密钥与所述16字节盐值按位相与后,再进行三次pbkdf2-hmac-sm3运算,生成sqlite数据库文件加密密钥;

执行加密后,调用所述加解密单元使用sqlite数据库文件加密密钥及sqlite数据库文件的每页加密密文,进行hmac-sm3杂凑运算,获取加密数据文件每页的密文消息认证码,填充在page尾部。

基于上述,获取待解密的sqlite数据库加密文件后,调用所述加解密单元使用sqlite数据库文件加密密钥及sqlite数据库文件的每页加密密文,进行hmac-sm3杂凑运算,获取待验证的密文消息认证码,将该待验证的密文消息认证码与page尾部的密文消息认证码进行比对,若一致,则在读取sqlite数据库文件时,调用sqlite数据库文件加密密钥对待解密的sqlite数据库加密文件内容逐页进行解密,获得原始的sqlite数据库文件内容;

否则抛出异常。

基于上述,所述杂凑运算方法均为硬件密码模块提供的sm3算法。

基于上述,对sqlite数据库的写入文件内容逐页进行加密时,通过调用所述加解密单元提供的sm4算法进行数据加密。

基于上述,对待解密的sqlite数据库加密文件内容逐页进行解密时,通过调用所述加解密单元提供的sm4算法进行数据解密。

本发明通过的有益效果:

1)本发明基于硬件密码模块提供的安全功能,实现了sqlite数据库的密钥生成、密钥存储与数据库加密存储,且密钥等敏感参数受硬件密码模块pin码保护;

2)本发明基于商用密码体系算法sm1、sm3、sm4、hmac-sm3、pbkdf2-hmac-sm3,实现了sqlite数据库加密与完整性保护,相对于国际标准算法具有更高的安全性;

3)本发明密钥与生成的salt混合后,进行三次pbkdf2-hmac-sm3算法得到最终的数据库加密密钥,对密钥进行多重保护,原始密钥存储在硬件密码模块,攻击者无法拿到,因此任何时候攻击者都无法还原密文;

4)本发明通过最终的数据库加密密钥以及hmac-sm3算法,计算数据库加密密文消息验证码,对数据库密文进行完整性保护,避免了数据库密文文件遭到篡改后引发的数据安全问题。

本发明的附加方面和优点将在下面的描述部分中变得明显,或通过本发明的实践了解到。

附图说明

本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:

图1示出了本发明所述安全存储方法的流程图;

图2示出了本发明所述安全存储装置的组成示意图;

图3示出了本发明所述安全存储装置的硬件密码模块接口的组成示意图;

图4示出了本发明所述安全存储装置的硬件密码模块的组成示意图。

具体实施方式

为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式对本发明进行进一步的详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明的保护范围并不受下面公开的具体实施例的限制。

本发明第一方面提出一种sqlite数据库文件安全存取方法,采用基于硬件密码模块实现的sqlite数据库文件安全存取方法,其架构图可参考图2,具体方法流程可参考图1。

如图1所述,本发明提供的方法首先用于生成sqlite数据库文件加密密钥以及生成加密数据文件,所述方法包括如下步骤:

s1,应用程序加载sqlite数据库。

s2,打开所述sqlite数据库;如果数据库不存在,则默认创建一个新的sqlite数据库。

s3,检测是否插入硬件密码模块,如是则进行s4,否则重复步骤s3;其中,所述硬件密码模块可以嵌入pc或移动设备,也可以通过外部物理接口与pc或移动设备进行连接。硬件密码模块可以是安全芯片、ukey、tf贴膜卡等。

s4,判断是否为首次使用所述sqlite数据库,如是则进行步骤s5,否则转步骤s6。

s5,调用所述硬件密码模块提供的随机数接口生成16字节随机数作为原始密钥,将原始密钥通过所述硬件密码模块提供的sm1对称密码算法及设备主密钥加密,生成原始密钥密文作为key存储于所述硬件密码模块的密钥存储区域。

s6,从所述硬件密码模块获取所述key,将所述key设置为sqlite数据库文件加密密钥;其中,可以从硬件密码模块获取所述key中的密钥,密钥既可以是进一步加密生成其他密钥的参数,如步骤s5中生成的原始密钥,也可以是加解密直接调用的密钥,如步骤s8中生成的sqlite数据库文件加密密钥,key仅提供向外部读取密钥的接口,更进一步地,当需要重置密钥时,key中的密钥可以通过人工或自动的方式植入新的密钥。

s7,判断待加密sqlite数据库文件的页数是否为第一页,如是则进行步骤s8,否则转入步骤s9。在sqlite主数据库文件包括了1个以上的页,页的大小是2的幂,可以从512到65536,同一个数据库中的所有页的大小是一样的,页大小在数据库文件偏移16个字节的地方定义。

s8,计算所述sqlite数据库文件第一页的盐值,具体为通过杂凑算法生成16个字节的salt,并存储在数据库第一页的头部(sqlite3的db文件,头部前16个字节固定为sqlite3format,所以可以利用文件头来存储一些数据);然后调用硬件密码模块对步骤s6中的key进行解密获取所述原始密钥,将所述原始密钥与所述盐值混合后进行多次杂凑运算,生成最终的sqlite数据库文件加密密钥,并将其作为key保存于程序运行内存中;需要说明的是,在未覆盖保存之前,key中保存的可能是通过随机数生成接口生成的原始密钥密文,在覆盖保存之后,key中保存的是最终的sqlite数据库文件加密密钥,该密钥也是密文形式;

s9,调用s8中生成的sqlite数据库文件最终的加密密钥对所述sqlite数据库的文件内容逐页进行加密,生成加密数据文件,其中,所述加密数据文件密文中的文件头和reserved字段不进行加密,只需要加密有效的内容即可;

s10,执行加密后,对所述加密数据文件进行sm3杂凑运算,获取所述加密数据文件的文件校验码,填充在page尾部,需要说明的是,sqlite3提供了reserved字段,自动在page尾部预留一段空间,因此可以在尾部填充信息。

进一步地,所述方法还包括sqlite数据库加密数据文件的解密,所述sqlite数据库加密数据文件的解密方法包括如下步骤:

s11,获取待解密的sqlite数据库加密文件;

s12,对所述加密数据文件进行杂凑运算,获取所述加密数据文件的文件校验码,将所述文件校验码与page尾部的文件校验码进行比对,判断二者是否一致,如是则转步骤s13,否则抛出异常,通过文件校验码可以对文件进行完整性验证,在文件被篡改后及时发现并进行预警;

s13,调用sqlite数据库文件最终的key对所述待解密的sqlite数据库的文件内容逐页进行解密,获得原始的sqlite数据库文件,其中,所述key为步骤s8中生成的最终的sqlite数据库文件加密密钥。

进一步地,所述硬件密码模块为安全芯片,所述原始密钥密文为所述安全芯片运用sm1算法及设备主密钥经过加密运算得出的。

进一步地,所述步骤s9中使用sm4算法对sqlite数据库的文件内容逐页进行加密,所述步骤s13中使用sm4算法对sqlite数据库的文件内容逐页进行解密。

进一步地,所述步骤s8、s10、s12中使用的杂凑运算方法均为sm3算法。

进一步地,所述步骤s9中,通过pager_write_pagelist接口调用code2函数进行数据加密,所述步骤s3中,通过readdbpage接口调用codec1函数进行数据解密,执行时所述codec1函数和所述code2函数均指向sqlite3codec完成最终的数据加解密。

本发明的第二方面提供一种sqlite数据库文件安全存储装置,采用如上所述的思路实现的sqlite数据库文件安全存取方法,如图2所示,所述装置包括操作系统、部署在操作系统中的sqlite数据库、接口单元以及硬件密码模块,其中,

作为一个嵌入式数据库,本发明提供的基于硬件密码模块以及其提供的商用密码算法实现的sqlite数据库供其他app加载使用,或浏览器、android系统内置数据库实现,支持windows、linux、android、ios、中标麒麟、金石等系统;

所述sqlite数据库可通过所述接口单元使用所述硬件密码模块,具体地,硬件密码模块提供的安全功能包括但不限于密钥生成、存储以及多种商用密码算法运算服务,还提供随机数生成,密钥、证书及文件存储,基于pin码机制校验用户身份、硬件密码模块提供的安全功能受pin码保护;

所述接口单元包括硬件密码模块检测单元和硬件密码模块调用单元;具体结构可参考图3,所述硬件密码模块检测单元,用于检测是否插入硬件密码模块并调用硬件密码模块调用单元;所述硬件密码模块调用单元,用于调用硬件密码模块进行pin码校验、获取所述硬件密码模块传入的key,并调用所述硬件密码模块的算法生成最终的sqlite数据库文件加密密钥,以及用于根据具体情况向硬件密码模块下达文件加解密命令或校验命令,获取所述硬件密码模块处理后的数据并进行保存;

如图4所示,所述硬件密码模块包括设备密钥保存单元、随机数生成单元、加解密单元和加密密钥保存单元;所述设备密钥保存单元,用于保存所述硬件密码模块的设备主密钥;所述随机数生成单元,用于生成原始密钥;所述加解密单元内置加密算法和杂凑算法,用于加密密钥的生成以及数据文件的加解密;所述加密密钥保存单元用于保存最终的sqlite数据库文件加密密钥。

需要说明的是,sqlite数据库使用pager来管理存储页面,pager模块预留了三个函数指针,分别为xcodec(核心函数,负责page的加解密,初始化过程中sqlite3codecattach会将该函数指针指向内部函数sqlite3codec),xcodesizechng(page大小变化的回调),xcodecfree(释放函数),同时预留了指针pcodec用于保存加解密的上下文即sqlite3codec。本发明通过硬件密码模块提供的sm4算法实现加解密函数。所述加解密单元在加密时通过pager_write_pagelist接口调用code2函数进行数据加密,在解密时通过readdbpage接口调用codec1函数进行数据解密,执行时所述codec1函数和所述code2函数均指向sqlite3codec完成最终的数据加解密,主要通过传入的加解密类型参数来控制,page模块调用此函数时会传入需加解密的数据库数据及page页数等信息。

进一步地,所述硬件密码模块的加密算法和杂凑算法包括sm1/sm4对称密码算法、sm2非对称密码算法和sm3杂凑算法。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

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