申东凡,杨 庚
(1.南京邮电大学 计算机学院、网络空间安全学院,江苏 南京 210023;2.江苏省大数据安全与智能处理重点实验室,江苏 南京 210023)
在大数据时代,传统关系数据库在对大量数据进行同时查询时扩展性差,读写速度较慢。虽然数据库分布式存储的应用[1]和水平、垂直切分等技术能够缓解上述问题,但数据迁移比较困难,对性能的要求和管理成本都相对较高。新兴的非关系数据库NoSQL[2-5]存储灵活,模式自由,便于扩展,但每个NoSQL系统都有自己的API,往往不支持SQL和JDBC的标准,因此关系数据库和NoSQL都不能全面高效地应对大数据时代的挑战,两者结合使用的方案应运而生。现有的关系与NoSQL集成方案[6-7]的查询语言没有统一标准,系统的可移植性低,且关系数据库没有对隐私数据进行保护,不能保证数据的安全性。
针对数据安全面临的威胁[8],隐私保护成为重要的研究内容,对隐私数据加密存储是一种简单可行的解决方案。文献[9-10]提出的可搜索加密技术解决了传统数据加密存储在云端后,用户无法直接操作密文数据的问题,提高了密文数据库的检索效率。现有的对数据库操作系统层、数据库管理系统DBMS(database management system)内核层以及DBMS外层的加解密服务都存在一定的缺陷。文献[11-12]提出的数据库中间件技术将上层应用与底层数据库隔离,实现在业务层对数据的加密和更改操作,并且不会影响其他组建应用。
文中提出的中间件系统以标准SQL语言同时操作密文数据库和NoSQL,实现异构数据库的集成。其中关系数据库存储隐私数据,采用可搜索加密技术,NoSQL存储非结构化数据。中间件不仅保障了数据的安全性和机密性,也为应用程序提供统一的接口,满足水平可伸缩性的需要而不影响应用程序逻辑实现,可以更加高效地处理海量数据。
在过去的几十年里,关系系统因具有规范的查询语言和接口标准、支持事务处理保持数据的一致性等特点,一直是数据存储的主要形式。为了适应大数据时代海量数据处理,非关系系统被广泛应用在许多领域来处理关系数据库难以解决的问题。NoSQL系统扩展性较好,但是缺乏通用标准API和标准化查询语言,这使得系统的可移植性降低。关系数据库使用标准化SQL,有JDBC、ODBC等通用访问接口,具有可移植性。为了充分利用SQL的价值,为新兴的NoSQL数据库提供SQL访问具有很大的研究价值。
目前的研究成果主要集中在如何结合SQL与NoSQL系统以及标准化的API,文献[13]中SQL查询转换使用正则表达式和规则直接分析字符串完成,而不是使用查询解析器和翻译器。文献[14]提出了一个在关系模型中表示NoSQL数据的框架,以及将SQL查询映射到NoSQL系统,但在此框架中,所有查询操作都在SQL数据库中执行,并将非关系数据映射到关系数据库,占用了大量空间。
网络时代数据激增使其存储安全问题[15-16]亟待解决,数据在第三方平台上可能会受到来自外部和内部的攻击。Song等[17]研究的可搜索加密技术实现在不解密的情况下可执行密文查询。麻省理工学院MIT研究提出的CryptDB[18-19]借助数据属性分拆和中间件改写查询的设计实现了密文数据查询,有效缓解了上述研究带来的用户主机负载大、对数据库密文查询支持度弱的问题,为使用数据库管理系统(DBMS)的应用程序提供机密性。
NoSQL处理海量数据有强大功能,但实际应用中不能完全抛开关系数据库,异构数据库的集成,是一种可选方案。针对NoSQL没有通用API和标准的查询语言以及与关系数据库的异构问题,考虑数据的安全性,文中设计并实现了一种面向隐私保护的异构数据库集成中间件系统。该系统使用标准SQL统一操作密文数据库和非关系数据库,屏蔽底层数据库的异构性。
面向隐私保护的异构数据库集成中间件系统结构图如图1所示。
图1 面向隐私保护的异构数据库
其中数据存储层包含两种类型的数据库:关系数据库和NoSQL。其中关系数据库使用MySQL为例,并对隐私数据采用可搜索加密算法加密,NoSQL选择MongoDB,存储非结构化数据。中间件用来屏蔽数据存储层的异构性差异,提供统一的访问接口,且文中对数据源的处理除了查询操作,还支持插入、删除、更新、连接等操作。
明文数据库直接存储到云端,隐私数据的安全性得不到保障,因此需要对关系数据库中已有的明文数据进行加密,中间件实现明密文数据库映射步骤如下:
2.1.1 获取明文表信息
获取数据库所有表名,保存到数组中,由表名循环得到各个列名,嵌套查询到数据内容,将其保存。
2.1.2 修改明文表的结构
使用可搜索加密算法对原有数据加密,该算法包含确定加密、保序加密、同态加密三种模型,原始表的字段需要被扩展和修改,须创建满足密文结构的密文表。如:
用户输入语句为:
insert into tablename (column_1,column_2) values (value_1,value_2);
经过加密改写后的语句为:
insert into tablename (mycolumn_1_DET,mycolumn_1_OPE,mycolumn_1_HOM,mycolumn_2_DET)
values(value_1_DET,value_1_OPE,value_1_HOM,value_2_DET);
原明文数据表的结构发生了变化,需要创建新的表存储密文数据。
2.1.3 数据加密
读取保存的明文数据,调用可搜索加密算法,循环批量加密插入对应的密文表,此过程与单纯加密数据不同的是要保持原有数据的约束,保证明文表的主键在新的密文表中仍然有主键特性。
2.1.4 实现新旧数据库的融合
删除原有明文数据,用户的所有操作都直接在密文表上执行,SQL改写模块将明文SQL改写为可在密文上执行的操作SQL语句,整个映射过程对用户透明,减少了用户执行复杂操作的负担。
具体过程如图2所示。
图2 明密文数据库映射流程
中间件的核心模块包括路由选择模块、SQL改写模块、加解密模块、SQL解析模块以及SQL转换模块。中间件执行流程如图3所示。应用层传来SQL请求,路由选择模块判断该请求操作密文数据库或NoSQL,若为密文数据库请求,则进行SQL改写,否则进行SQL解析和转换,生成MongoDB可识别的操作语句,若是查询操作,对结果进行翻译和转化,最后将统一格式的结果返回给用户。
图3 中间件执行过程
该模块主要实现对请求数据库类型的判断,使用表名来确定要访问数据库的类型,业务开发人员保证在同一域中数据库不能建立名称相同的表,以避免出现混乱。路由选择模块中存有路由信息表(RouteInfoTable),该表存储不同数据库的表名。分析SQL请求,对照表名与路由信息表的信息,判断请求的数据库类型,若为密文数据库,则交由SQL改写模块,否则,对SQL进行解析和转换。考虑数据量大的情况可能有很多表名,为了加快查询速度,在路由选择模块缓存常用的表名,称为路由信息缓存表(RouteInfoCacheTable),它是路由信息表的子表,用来存储访问频率比较高的表名,这样每次先匹配路由信息缓存表,减少查询时间。
SQL解析模块将SQL语句转化为抽象语法解析树(abstract syntax tree,AST)。用户输入的SQL请求经过词法和语法分析,输出抽象语法树,查询解析器支持SELECT,INSERT,UPDATE和DELETE语句的标准SQL语法,以及内部外部连接,子查询和GROUP BY,ORDER BY。
该模块由三个部分组成:解析(parser)、抽象语法树(AST)和抽象语法树访问(AST visitor)。
2.4.1 解 析
Parser将输入文本转换为抽象语法树,包括词法和语法分析。用户输入SQL请求,如:Select id,name,age from Student where score>90;首先词法分析解析出语句中每个单词,然后进行语法分析,使组合成的语句有一定的语法规则,语法解析器根据语法规则,解析出此语句的唯一含义。
2.4.2 抽象语法树
抽象语法树是SQL语句经过解析过程的词法、语法分析后生成的,表示语言结构中的层次关系,形式化表示出语言中的语义。Select id,name,age from Student where score>90,转换成对应的抽象语法树如图4所示,根据该树状结构,得出被查询对象是id,name,age,查询主体为Student,查询条件为score>90,将SQL转换成抽象语法树,层次清晰,便于查找。
图4 抽象语法树
2.4.3 抽象语法树访问
抽象语法树访问的功能是遍历AST,其目的是正确表达语义。该模块使用VISITOR模式遍历,从根节点开始,到最后一个叶子节点为止,在遍历的过程中,不断收集信息到一个上下文中。完成整个遍历过程后,AST所表达的语法含义,被保存到上下文。
该模块遍历SQL解析模块得到的内容,获取其表名、字段名、查询条件、操作方法、数据内容等相关信息,根据NoSQL语法,对应组合转换生成MongoDB可识别的语句,在NoSQL上执行操作。关系数据库的表名、行名、列名、数据分别对应于非关系数据库MongoDB的集合名、文档、字段、值等,根据此对应关系形成SQL与NoSQL语句的映射。
查询语句
Select url from course where title="JAVA";
经过SQL转换后的语句为:
db.course.find({"title":"JAVA"},
{"url":"https://www.atguigu.com"});
更新语句
Update course set url="https://www.icourse163.org/" where
title="MongoDB";
经过SQL转换后的语句为:
db.course.update({title: "MongoDB"},
{$set:{url="https://www.icourse163.org/"}},
{multi: true });
该模块的功能是对关系数据库请求的SQL进行改写,生成可在密文上直接执行的SQL语句。解析函数针对不同的查询类型执行相应的操作,对Create、Select、Insert、Update、Delete中的明文数据进行加密,并且扩展、修改列名。对数值型数据,扩展为三列,分别用确定加密、保序加密、同态加密算法加密该列,对于字符型数据,只用确定加密算法。下面通过一个例子说明SQL语句改写过程,更新员工表,用户输入:
update Employee set city='Nanjing'
whereEmployeeId=10;
经过SQL改写模块,上述语句输出为:
UPDATE Employee SETytic_DET=
'9ur1uvonEfaJZ/8pAOFwuQ=='
WHERE dIeeyolpmE_DET=
'HRwGHDSkRhxgiAhq0g2b/w==';
EmployeeId=10属于等值匹配的操作谓词,解析函数调用加解密模块对明文数字10使用等值加密模型进行加密,得到密文'HRwGHDSkRhxgiAhq0g2b/w==',列名为city,更新值为'Nanjing',因为city对应的数据类型为字符型,所以仅将该列改写为等值加密模型下的列名city_DET,并将值'Nanjing'使用确定加密算法得到密文'9ur1uvonEfaJZ/8pAOFwuQ=='。输出改写后的SQL语句,直接在密文上进行增删改查操作。
该模块在中间件中的功能是对关系数据库中的隐私数据进行加解密,为了实现直接在密文数据上执行SQL查询,利用了基于CryptDB的洋葱加密模型,加密模型如图5所示。
图5 加密模型
2.7.1 等值加密模型
等值加密模型用来实现等值比较,该模型采用两层结构,内层使用确定加密算法(deterministic encryption algorithm,DEA)生成内层密文,外层使用随机加密算法(random encryption algorithm,REA)再次对数据进行加密。在进行两个密文等值比较时,中间件先将外层密文解密,完成等值比较后再进行随机加密。使用两层加密结构在保证数据安全性的同时,还支持密文的等值比较。
2.7.2 保序加密模型
保序加密模型用于实现直接在密文上进行顺序比较。该模型采用单层加密,使用保序加密算法(order preserving encryption algorithm,OPEA)加密后,密文能够保持明文的顺序关系。
2.7.3 同态加密模型
同态加密模型用于实现在密文上进行数据库操作中的求和以及求平均数。该模型也采用单层加密,使用同态加密算法(homomorphic encryption algorithm,HEA)进行加乘运算时,解密后的密文运算结果与直接在明文上进行加乘运算结果等同。
中间件连接MySQL客户端,返回的结果要以关系数据库的格式呈现。结果解析转换模块解析查询返回的文档形式的结果,获取集合名、文档、字段、值等,分别对应于关系数据库的表名、行、列名、数据。经过此模块对应转换合成标准的关系数据库格式,将获取的数据记录组合为一个单一的查询结果返回给用户。下面通过一个例子说明,假设MongoDB查询结果为:
{"_id":1999,"title":"MongoDB Demo","description":"database","by":"baidu point","url":"http://www.baidu.com/mongodb/","new_field":""}
经过解析翻译模块返回统一的关系数据库格式如图6所示。
id1999titleMongoDB Demodescriptiondatabasebyyiibai pointurlhttp://www.yiibai.com/mongodb/new_field
图6 关系数据库格式
分别对中间件的性能以及密文数据库加解密时间进行测试分析。
系统采用Java编程语言,在Windows10操作系统上安装MySQL和MongoDB作为SQL与NoSQL集成存储架构的数据存储层,其中MongoDB采用自动分片的Shard模式。
开发环境如下:
硬件:处理器为Intel Core i5-3230M,内存为6 GB;
软件:操作系统为Windows 10,Java开发环境为JDK1.8,MySQL版本为5.7.0,MongoDB版本为3.0.1 2008R2Plus SSL。
3.2.1 中间件性能测试
客户端访问MySQL数据库和MongoDB服务。使用JDBC访问数据库服务器,该实验对SELECT操作在有无中间件的情况下分别进行测试,每个SELECT操作的间隔为10 ms,查询表中包含10个字段。
图7描述了密文数据库使用中间件前后吞吐量与客户端连接数的关系。不使用中间件时,应用程序直接连接密文数据库,执行SQL请求。添加中间件后,对SQL语句进行分析、路由、改写等语义转换,这些逻辑操作会带来一些性能损失,吞吐量随着客户端连接数的增加而增加,当客户端连接数为60时,吞吐量达到最大值,加入中间件后,系统的吞吐量将会平均每秒减少1 000条记录。
图7 客户端连接数与吞吐量的关系
图8 客户端连接数与响应时间的关系
图8描述的是密文数据库使用中间件前后响应时间与客户端连接数的关系。添加中间件后,平均响应时间将会增加11 ms,逻辑处理带来的性能损失在可接受的范围之内。使用中间件可以在水平方向对数据库进行扩展,且加解密和集成异构数据库的业务在中间件完成,不需要更改数据库底层源码,带来便利性和可扩展性。
3.2.2 mongo-jdbc与中间件性能对比测试
mongo-jdbc是MongoDB的官方开源项目,它可以实现一些简单的SQL操作,但不支持嵌套查询、聚合查询等。该实验分别通过中间件和mongo-jdbc向非关系数据库MongoDB中插入数据,比较两者的性能。
图9比较了使用中间件和mongo-jdbc在执行插入时的性能。mongo-jdbc相比于中间件大约有150 ms的平均延迟,使用中间件比mongo-jdbc有显著的性能提高且支持Group by等复杂查询,在功能和性能上都优于mongo-jdbc,进一步证明了该中间件系统的优势。
图9 mongo-jdbc与中间件插入数据时间对比
3.2.3 关系数据库加解密测试
实验主要测试中间件系统对明文数据的加密情况,数据集选用美国劳工部统计局官方发布的数据。测试分两种情况:第一种创建表中的字段为10个int型,每张表的数据量为1 000;第二种创建表中的字段为10个varchar型,每张表的数据量也为1 000。将数据集对应的数据导入数据库,执行中间件系统,明文表整体映射为密文表。
图10 不同数据类型执行加密时间对比
图10描述了中间件对不同类型的明文表执行明密文映射的时间消耗。随着数据表数量的增加,执行时间相应增加,图中显示10个int类型字段的映射速度比varchar类型要慢,这是由于需要对int类型的数据进行保序和同态加密,而对varchar类型数据只要进行确定加密,所以执行完成时间比int型少。
关系数据库与非关系数据库的集成是大数据时代处理数据的重要方法,文中提出了一种面向隐私保护的异构数据库集成中间件系统设计方案,该中间件实现对明文数据库的整体加密以及统一操作密文数据库和NoSQL。与其他中间件系统相比,该系统用SQL语言透明操作关系数据库和非关系数据库,支持增删改查和Group by等操作,返回统一的关系数据库格式,提供标准的API,并且关系数据库采用可搜索加密,保证数据的安全性和机密性,支持用户直接在密文上执行操作。仿真结果表明,该中间件系统可以完成对关系数据库的加密,实现SQL统一操作密文数据库和非关系数据库,性能损耗在可接受范围内。