版权归原作者所有,如有侵权,请联系我们

[科普中国]-密文数据库

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

数据库加密方式

数据库的加密方式一般有两种:一种是数据库管理系统内部加密(简称库内加密);一种是数据库管理系统外部加密(简称库外加密)1。

库内加密库内加密是在数据库管理系统的内部加密的,如图所示。

库内加密一般选择在将数据存入磁盘或读取给用户之前进行加/解密操作,加/解密操作对用户是完全透明的。也就是说,数据库管理系统在将数据写到硬盘之前先进行加密操作,而从硬盘读取数据时进行相应的解密操作。目前一些主流数据库厂商已经开始在其数据库产品中提供加/解密功能,实现对数据的加/解密。如Oracle 10 g支持DES,3DES,AES等加密算法,供用户调用进行库内数据加密存储。

库内加密的优点在于支持各种不同加密粒度的加密,而且加密的灵活性较好,功能强大。另外,由于是在数据库管理系统内部实现加/解密,可以更好地与数据库管理系统内部的各种功能有效结合起来。更重要的是,数据库可以同时被多个应用程序一起共享,这种方法的加/解密操作都是在数据库管理系统的内部完成,对用户是完全透明的。

缺点在于需要修改数据库管理系统的内核。对于数据库管理系统这么复杂的软件,在系统内部进行修改是一件非常困难的事,而且这种方法具有对数据库提供商的依赖性,只能用于特定的场合,通用性不强。此外,数据库管理系统负责集中管理和存储大量数据,如果还要它进行加/解密操作,必然会严重影响系统的性能。

库外加密库外加密一般选择在应用程序和数据库管理系统之间,添加一个加/解密层来完成数据的存储和访问,如图所示。

与库内加密相比,库外加密的优点在于无需修改数据库管理系统,只需要在应用程序与数据库之间增加相应的加/解密模块即可。将数据加密之后再存入数据库,这样就减少了数据库管理系统的运行负担。但是,这种做的缺点在于,对于加密后的数据,数据库的一些功能受到限制,如数据库中的索引以及数据库原有的完整性和一致性等。因此,需要在应用程序中先对数据的完整性和一致性进行检查,然后再对加密后的数据建立索引,最后才将数据存入数据库中。这种方法不依赖数据库提供商,通用性比较强,适合于任何一种数据库。在目前新兴的外包数据库服务模式中,数据库服务器都是由非完全可信的第三方提供,只是用来运行标准的DBMS,这就要求加/解密都在客户端完成。因此,库外加密方式正受到越来越多研究者的关注。

数据库的加密粒度由于数据库系统具有表、记录、字段等多个结构层次,所以数据库的加密粒度可以分为数据库级、表级、记录级、和字段级。加密粒度越小,则灵活性越好,且安全性越高,但实现的技术也就越复杂。根据数据库中信息的敏感程度不同,选择合适加密粒度的加密算法进行加密。

(1)基于数据库级加密:加密的对象是整个数据库。虽然这种加密方法简单,只需对存储在硬盘中的数据库文件进行加密处理即可,密钥的数量也非常少,一个数据库只需一个密钥,管理很方便。但是,数据库的一个重要特征是数据的高共享性,可以被多个用户和应用所共享使用,以及接受大量的随机访问。通常,用户对数据库进行访问,是想获取符合条件的所有记录。如果采用数据库级加密方式,即使是查询少量的记录,也要对整个数据库进行解密,这样就对系统性能会产生极大的影响。

(2)基于表级加密:加密的对象是数据库中的表。一般来说,数据库中包含多个表,我们只需对其中一些包含敏感信息的表进行加密,以确保它们的安全即可。与数据库级加密粒度相比,采用表加密粒度,系统的查询效率会有所改善,因为对于未经过加密的表的查询,与传统查询方法一样,查询不会受到任何影响。而对于加密表的查询,只需先解密对应的加密表,然后再进行查询,无需解密整个数据库。但是,这种方法与数据库管理系统集成时,需要对数据库管理系统内部的一些核心模块进行修改,而目前一些主流的商用数据库管理系统都不开放源代码,很难把这种方法与它们集成起来。

(3)基于记录级加密:数据库系统中的每条记录都是完整地存储了一个实体的数据。因此,基于记录级加密是最常用的方式。这种方式是将数据库中每条记录使用不同的加密密钥进行加密后存储在数据库文件中。记录的长度一般较短,而存储在数据库中的时间较长,如果使用的密钥太少,则会导致保密性面临威胁,密钥使用太多又会导致密钥管理的复杂性。同时和表级加密一样,这种方法也需要对数据库管理系统的内核进行修改。

(4)基于字段(属性)级加密:加密的对象是数据库表中一条记录的某个字段。基于字段级加密,就是以不同记录的不同字段为基本加密单元进行加密,该方法可以对数据库中单个数据元素进行加密。其优点在于具有最小的加密粒度,具有更好的灵活性和适应性。

密文数据库体系结构存放问题

由于数据库系统的内部结构非常复杂,如果对现有的数据库系统(如SQL SERvER、ORAcLE、DB2等)进行修改,将是一件非常困难的事。而且还需要数据库提供商的支持,通用性不强。所以本文采用库外加/解密的方法,在应用程序与数据库之间添加一层加/解密层,专门用来负责数据的加密存储和解密查询。这样就不依赖于数据库提供商,适用于各种数据库,具有较好的通用性。

数据加密之后,密文有两种存储方式:一种是存储到原来数据库表中的相应位置;另一种是另外建立一个密文空间,将密文存入其中。第一种方法从理论上讲,是一种较好的存储方式,因为它不会增加额外的存储空间,但是从实践来看,不具通用性。这是因为加密后的密文,其数据类型和长度都发生了改变,不可能再插入到原来的字段中。虽然建立另外的密文空间会增加存储空间,但是这种方法很容易实现。因此,本文的存储是基于第二种方法。

存储时,在应用程序中的数据存入数据库之前,需要进行两方面处理。一方面,由加解密层调用加密算法对数据进行加密处理,然后存储到密文空间;另一方面,对存储密文的空间地址进行加密,然后存储到数据库相应的字段,并更新索引树。

查询问题

查询时,一般分为两种情况:

1)根据关键字进行查询。从数据库中找到此记录对应查询字段的标记,如果为明文,则直接返回结果;否则将该密文解密,用解密后的地址到密文空间取出密文数据,解密并返回结果即可。

2)根据非关键字进行查询。非关键字在数据库中可能是明文或密文,因此这里假设从明文索引树开始查找。若找到相同的结点,则对应返回其记录关键字,并用该关键字进行查询,下面的操作将与1)相同。若在明文索引树中未找到,则需要到密文索引树中进行查找。首先解密索引树的根结点,跟关键字比较之后确定下一个结点。重复以上操作,直到找到叶结点为止。返回满足条件记录的关键字,用关键字进行查找,下面的操作将与1)相同。

如图所示,加/解密层用来修改存储和查询语句。存储时,除了加密数据外,还通过规则修改sQL语句,同时更新索引树;查询时,通过修改查询语句,转换成对索引树的查询,然后到密文空间取出密文,解密后返回结果。加密和解密分别是由加密和解密函数对数据库中敏感信息进行加解密的功能模块。

密文存储结构对于数据库中需要加密的属性,并不是加密后直接存储到数据库中,而是存储到另外的密文空间,数据库存储的仅是该属性存储在密文空间的地址的加密。这是因为加密之后数据的类型发生变化,类型变化会导致数据丢失,而且加密后的长度也可能超出数据库设计的长度。密文空间的存储结构Enc_Field(Address,DB_name,Tab_name,Field_name,Field_content)。其中Address是主键,DB_name是数据库名,Tab_name是数据库表名,Field_name是数据库表中的加密字段,Field_content是数据库表中加密字段的密文。如表所示,入口地址是存储密文的首地址,E()为加密函数。

选用此存储结构的优点:

增强了数据库的安全性。数据库中存储的只是密文空间的地址,数据库中的加密字段就算被解密,也只是得到密文空间的地址,而没有泄露数据库中的敏感信息。

便于存储。由于加密后的数据无需排序,不用考虑插入和删除所带来的繁琐操作。因此在存储时,只要找到足够的空间进行存储并记录存储地址即可,而不需要移动大段的数据。

方便密钥更换。由于加密后的敏感信息是独立于数据库的,如果需要进行密钥更换,仅仅是对密文空间进行操作,而不用涉及到数据库操作便可完成。这样就减少对数据库的操作,保证了数据库的安全性。