1 引言
随着电子商务和电子政务的迅速发展,网络中的数据呈爆炸式增长,数据规模越来越大,涉及的技术越来越复杂。2002 年,Hakan Hacigumus 首次提出了“databases as a service”,即“外包数据库的概念”。在外包数据库系统中,组织将数据业务外包给专门的数据库服务器,由它们去完成数据的存储和管理等复杂技术工作,而数据库用户通过网络从外包数据库中获得服务。在这种运行模式中,数据存储在非可信的第三方服务器中,最大的问题就是如何保证数据的安全性,特别是如何防止内部人员(如:数据库管理员)泄露、丢失、甚至破坏数据。传统的一些安全机制,如操作系统安全机制、访问控制机制由服务器端操作,在外包数据库这种模式中不能完全保障其安全性。而利用加密技术来保护数据的安全性是一种非常理想的选择,即使入侵者可以利用操作系统漏洞或者绕过访问控制机制非法窃取数据文件,但是没有密钥进行解密,所获取的信息是不可读的。
2 相关工作
一些工作人员对数据库加密进行了研究。文献[5]提出了一种同态加密方法。同态加密的思想是加密后的数据仍然保持原明文数据的有序性,从而可以实现不用解密数据而对加密数据直接进行访问和算术运算。然而,从安全性角度来看,这种加密方法本身具有其固有的缺陷,因为它要求密文数据仍然保持有序性,这与安全的加密算法是相悖的。文献[6]中,在数据库作为一种服务(Database As a Service)的背景下,提出了对加密数据查询的方法。存储时,除了对关系表中的元组加密外,还增加一个索引字段,用来存储加密字段的分桶号(Bucket ID),桶号表示明文数据值落在某段区间内。查询时,客户端提交的SQL查询语句可以直接执行在加密数据上,而无须解密,但查询结果中包含不满足调节的元组,需要解密进行二次查询。文献[7]进一步对它如何分桶进行改进,给出最优分桶算法,使得查询代价最少。但是,这种方法对于多表连接查询的代价非常大。文献[8]提出了一种保持有序的加密方法。给定一个目标分布函数,对明文值进行转换得到密文,使得密文不仅保持有序,而且服从某一目标函数的分布。由于其密文保持有序,无须解密就可以直接对密文进行等值和范围查询,也可以进行MAX、MIN、COUNT 和ORDER BY查询。但这种方法由于密文保持有序性,容易遭受选择密文攻击。也就是说,如果攻击者能够选择一定数量的明文(或密文),并且把它们加密(或解密)成对应的密文(或明文),那么他就能够以较大的概率估计出密文对应的明文值。类似地,如果攻击者知道这个域的一些信息,比如说该域的数据分布,他也能够以较大的概率估计密文对应的明文值。文献[9]中,智能卡具有加密和查询处理能力,它把数据加密后存储在服务器中,密钥也存储在智能卡中。查询时,智能卡能够对等值查询语句进行转换,使之能够对密文数据进行查询。但是,它不能对实数类数据进行范围查询。文献[10]中使用序列加密(stream cipher)方法对文本数据进行加密处理,这样可以无须解密而直接对加密文本搜索关键词,但是这种方法没有涉及到如何应用到数据库中。文献[11]和[12]对数据库中字符型数据的加密以及加密数据的快速查询进行了研究。
3 数据加密的体系结构
数据库加密,大致可以分为两种方式:DBMS 外部加密和DBMS 内部加密。DBMS 外部加密,一般选择在应用程序和操作系统,通过调用加/解密函数来完成加密数据的存储和访问。例如,在操作系统层次实现加密时,可以利用它管理文件系统的功能,直接对存储数据的文件进行加密。在操作系统中加密时,加密的粒度是基于文件,对应到数据库中的表或者整个数据库,这种加密粒度是非常粗糙,最直接的影响是,加/解密的工作相当大,极大地降低系统性能。DBMS 内部加密,一般选择在数据物理存取之前进行加/解密操作。也就是说,DBMS 在将内存中的数据写到磁盘时,进行加密操作,而从磁盘读取数据到内存中时,进行相应的解密操作。BMS 能够区分各种粒度的数据,所以可以支持各种粒度的加密,加密的灵活性较好。另外,在DBMS 内部实现加密,可以更有效地和DBMS 内部的访问控制机制、授权机制等各种功能结合起来。此外,数据库中的数据具有高度结构化,共享性高等特点,在对数据库中存储数据进行加密时,需要结合它们的特点,对加密算法、加密粒度以及加密方式进行合理选择。首先,在选择加密算法时,对加密尤其是解密速度要求比较快,不能因为加/解密过程而导致系统性能大幅度下降。其次,应当支持灵活的加密粒度。根据用户的需要,能够选择对数据库、表、记录、字段、数据项进行加密。同时,还应结合目前DBMS 选择适当加密方式。
在设计数据加密的体系结构时,采用基于DBMS 内核层加密方法,加密的粒度为表级,如图1 所示。其中系统表和加解密组件是新增的。设计思想是:用户在创建表的时候,可以指定是否对其加密存储,如果需要加密,则在系统表的安全字典中插入一条相应的记录。在DBMS 将数据写到磁盘上时,查询系统表的安全字典,如果需要加密,则首先对数据加密,再将其写出到外存。当DBMS 从磁盘中读入数据块时,如果数据块是加密过的,则加/解密模块查询安全字典,取出相应的密钥解密数据块。
图1 数据库加密体系结构图
4 加密实现
依据上面数据库加密体系结构,在PostgreSQL 中实现了基于块的表级存储数据加密。PostgreSQL是以加州大学伯克利分校开发的POSTGRES 版本4.2 为基础的对象关系型数据库管理系统(ORDBMS),被广泛地认为是目前特性最齐全的开放源码数据库管理系统。数据加密时,使用了GOST 算法,GOST 是一种分组对称加密算法,来自于对DES 的改进,它采用64 位分组和256 位密钥。
4.1 系统内核页面的结构
系统内核中的每一个页(page)对应外存上的一个块(block)。默认情况下,他们的大小是8K,最大可以为32K。每个页面分为页头信息(PageHeaderData)、页中存储的具体数据以及页尾中关于页面类型的页面特定信息(Special-Space)三部分,具体结构如图2 所示。
图2 页面结构图
PageHeaderData 存放每一页都必有的公共信息,即页面空间管理信息,对于每种类型的页面都是定长的,主要包含如下几个字段:
(1)pd_pagesize_version,两个字节,高8 位指示页面大小,低8 位指示当前版本号;
(2)pd_lower,指出页内当前可用空间的起始偏移;
(3)pd_upper,指出页内当前可用空间的终止偏移;
(4)pd_special,指出页内关于页面类型的特定信息起始偏移。因为对于不同类型的页面,SpecialSpace 的大小及存放数据内容是不一样的。
比如,B 树索引的页面与heap 关系的页面,其SpecialSpace 是不同的,B 树索引页面比heap 关系多了指向其左右兄弟页面及父页面的指针。
在页头信息和pd_lower 之间是一个数组,它的每一个元素Linp 存放了一条记录在页面中的起始偏移。数组中元素的个数也就是页面中存放记录的条数。在pd_upper和pd_special之间的Item是关系中的记录,它们是从后向前存放的。系统支持变长字段,所以记录不是定长的。
4.2 加解密流程
进行加解密的基本思想是:在DBMS 将内存中的页面写出到外存中时,首先查询安全字典,如果需要加密存储,则用安全字典中当前密钥加密。在将数据从外存读入内存后,如果页头标识页面是加密过的,则取出相应的密钥解密。
加密时,只加密页面中的数据域。因为加密算法通常是分组加密,所以要处理加密数据长度不是分组长度整数倍的情况。假设采用加密算法是64 位分组,如果数据域不是64 的整数倍,则采用双向加密技术。双向加密技术的思想是,对数据域中的数据,从前往后加密,如果最后一组数据长度小于分组长度,取前面的加密数据进行填充。例如,在图2 中,按照顺序加密数据域itemN,item(N-1),…,如果最后一项item1长度不够,取前面已经加密数据进行填充后再加密。加密后,在页头的pd_pagesize_version 域使用两个比特来设置加密标识,目前其低8 位只用了最低1 位来标识版本号,文中使用其中的高2 位来标识当前页面已加密及使用的密钥的编号,00-未加密,01-使用密钥1 加密,10-使用密钥2 加密。
解密时,当数据块从外存读入内存时,如果页头标识页面是加密过的,则从安全字典中取出相应的密钥解密数据域。由于可能存在中间部分被加密两次的情况,应该先解密最后一组数据,然后从前向后顺序地解密。
4.3 安全字典
为了支持数据库加密,在系统表中增加了一个安全字典。它由两个表组成,一个是加密关系表,另一个是用户授权表。图3 和图4 分别是加密关系表和用户授权表中记录的结构。
图3 加密关系表中记录的结构
图4 用户授权表中记录的结构
其中,在加密关系表中,DID和RID分别是数据库ID和关系ID,它们作为主键来唯一标识一条记录。Etag 标识关系表是否需要加密存储(1-加密,0-不需加密)。CurID、Key1、Key2、UpdtTime、UpdtTag 分别是当前使用密钥编号、密钥1、密钥2、上次密钥更新日期以及更新是否完成标识(1-完成,0-未完成),之所以有两个密钥,主要是用于密钥的更新,在后面的密钥管理中介绍。
在用户授权表中,UID、DID、RID作为主键来唯一标识一条记录。UID是用户ID,DID和RID分别是数据库ID和关系ID,是指向加密关系表的外键,ValidTag 指示当前记录是否有效(1-有效,0-无效),StartTime 和EndTime 表示用户访问加密关系权限的起始及截止日期。
同时,增设了系统安全管理员(SSA),使用专门的接口来管理和维护安全字典。他通过在用户授权表中添加记录来授予某些用户访问机密数据的权限,也可以调整密钥的更新周期,还负责用户UID的发放和管理。数据库管理员(DBA)负责常规的数据库维护,用户自主访问控制(DAC)的授权等,但DBA 没有权限访问加密过的数据,也不能访问安全字典,这样就避免了DBA 仿冒用户来窃取和篡改数据库中的敏感数据。图5 是在增加安全字典后用户访问数据库的流程。
图5 加密数据库的访问流程图
具体的访问过程如下:
(1)用户首先使用DBA分配的用户名和密码登录系统;
(2)访问控制模块对用户名与密码进行鉴别,如果正确,DBMS 与用户建立连接;
(3)用户提交查询语句;
(4)访问控制模块首先检测用户是否有权限访问语句中指定的关系(由DBA授权),验证通过后,执行查询;
(5)查询执行器从外存中读取关系数据块;
(6)如果数据块是未加密过的(由页头判断)则直接将数据传给查询执行器,并转到(9),如果读出的数据块是加密过的,则调用安全控制模块进行安全权限验证;
(7)安全控制模块获取用户的密钥ID(可以是磁卡、指纹及口令,只要唯一标识该用户,这个ID是系统安全员(SSA)授予的),查询安全字典以获取解密密钥。查询安全字典的步骤如下:
①首先查询用户授权表,依次进行如下验证:是否存在主键为(密钥ID,当前数据库ID,当前访问关系ID)的记录;记录是否有效;当前时间是否在起始与终止有效期之间。只有全为真时,用户才有权限访问加密关系;
②根据(当前数据库ID,当前访问关系ID)以及页头的加密密钥编号从加密关系表中取出密钥;
(8)使用密钥解密数据,并将解密后的明文传给查询执行器;
(9)查询执行器执行查询,将查询结果返回给用户。
4.4 SQL的扩展
要实现对数据库加密,需要扩展ANSI SQL92 标准的数据定义语言DDL。主要在两个方面扩展:一是关系的创建语句;另一个是关系结构的修改语句。
在创建新关系时,可以指明是否对此关系中的数据加密存储,扩展后的语法为:
CREATE TABLE 关系名(属性名类型,… ,完整性约束,… [,ENCRY])
对于已经创建的关系,可以修改关系中的数据是否加密存储,扩展后的语法为:
ALTER TABLE 关系名WITH ENCRY [NOW] | WITHOUTENCRY
当用户创建一个关系时,如果指出这个关系中的数据需要加密存储(即带有ENCRY项),那么密钥产生器就会自动产生一个密钥,并在安全字典的加密关系表中插入如下一条记录:(数据库ID,新创建关系ID,1,新产生密钥,0,当前系统时间,1,0,默认密钥有效期)
将ETag 设为1 表示关系需要加密存储,并且当前活动密钥是密钥1。因为还没用到密钥2,将Key2 置0。将UpdtTag设为1 表示已完成密钥的更新。
在关系已经创建后,关系所有者和系统安全员(SSA)可以修改加密选项。如果将加密改为不再加密,即使用选项WITHOUT ENCRY,只需在加密关系表中将相应记录的ETag字段设为0,指示出关系不再需要加密存储,并不用对整个关系进行解密操作。用户以后访问这个关系时,如果从外存读入的数据块是加密过的,则系统自动从安全字典的加密关系表中取出相应的加密密钥解密。在将其写回到外存上时,先将页头的是否加密标识设为未加密,再明文写回。也就是说,在用户对原加密存储的关系访问的过程中完成了关系数据由密文存储到明文存储的转变。
在将以前未加密存储的关系修改为需要加密存储时,即使用选项WITH ENCRY,那么同新创建一个关系且指定加密时一样,在安全字典的加密关系表中插入如下一条记录:(数据库ID,被修改关系ID,1,新产生密钥,0,当前系统时间,0,0,默认密钥有效期)
同新创建一个关系且指定加密存储时的区别是,将更新是否完成标识UpdtTag 设置为0,指示当前更新未完成。因为在修改是否加密项的时候,关系中可能已有数据,而且通常不是DBMS 负荷较低的时候,为了避免影响系统的性能,没有立即将数据转为加密存储的形式。通过这一设定,把关系由非加密存储到加密存储的转变交给密钥更新程序去完成。在系统低负荷时自动运行的密钥更新程序会自动完成关系的加密存储。
5 实验
实验的主要目的是评估数据库加密后对DBMS 性能的影响。根据TPC-H标准,利用dbgen 工具自动生成数据库,数据库的大小为200M。实验使用机器的配置是PVI 2.0 GHzCPU,512 MB内存,操作系统是Red Hat Linux 9,PostgreSQL的版本是7.4.2。数据库的操作语句如图6 所示。其中,插入操作是在customer 表中批量插入30 000 条记录;删除操作是将国家代码在12 到15 之间的客户记录删除;更新操作是将累积金额在5 500 到6 000 之间的记录累积金额加50 000;查询操作是查询订单总价在10 000 到10 050 之间订单的订单号、客户名字及所在国家,涉及三个表的联接操作。
图6 测试用例
对于每一种操作分别测试在四种环境下的平均运行时间,这四种环境分别是:
(1)关系中的数据未加密存储,并且未对关系中的字段建立索引;
(2)关系中的数据加密存储,但未对关系中的字段建立索引;
(3)关系中的数据未加密存储,但对关系中的字段建立索引;
(4)关系中的数据加密存储,并且对关系中的字段建立索引。
图7 给出了数据库操作在四种测试环境下的运行时间比较。
从图7 可知,在批量插入30 000 条记录的时候,关系加密存储和未加密存储在无索引和有索引的情况下性能分别降低了2%和7%;在做删除操作时,关系加密存储和未加密存储在无索引和有索引的情况下性能分别降低了23%和32%;在做更新操作时,关系加密存储和未加密存储在无索引和有索引的情况下性能分别降低了31%和36%;在做查询操作时,关系加密存储和未加密存储在无索引和有索引的情况下性能分别降低了26%和18%,为了保障敏感数据的安全,这样的代价是可以接受的。
在有索引的情形下删除与查询的速度比无索引的情形下快了许多。这是因为可以利用索引来定位记录所在的块,大大减少了I/O 次数。从图中可以看出,即使在关系加密存储(索引亦加密存储)的情况下,使用索引也比关系明文存储但没有使用索引的情形也快了8 倍多。这充分说明采用的方案不会影响DBMS 索引建立功能所带来的好处。由于传统的数据加密方式会影响到索引的建立,如果没有索引,这些加密方式性能最好的情形也只能是与关系未加密且不使用索引的情形相同。
图7 数据库加密的性能测试
6 总结
加密技术是外包数据库安全中的一种重要机制,提出了基于DBMS 内核加密的一种方法,通过安全字典和SQL 的扩展,实现了数据的加密存储和有效查询,并在开源的postgresql中对查询性能进行了测试,验证该方法的有效性和可行性。以后将针对数据加密粒度、多表连接、多条件查询进行进一步的研究。
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:外包数据库中数据加密的设计和实现