加密技术是保护外包数据库中数据安全的一种有效方法,但如何对加密数据进行高效查询是一个热点,引起了研究界的重视。针对这个问题,提出了一种基于DBMS 内核的加密模式,通过安全字典和SQL语句的扩展,实现数据的加密存储和高效查询。实验证明了该方法的有效性和可行性。
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 数据库加密体系结构图