随着计算机科学技术的发展与普及,特别是计算机在经济、社会、政治各重要领域的广泛应用,计算机安全问题已成为当今信息社会关注的重点。而数据库系统担负着存储和管理信息的任务,集中存放大量数据,为许多终端客户共享。许多数据信息的机密性很强,泄漏或破坏这些信息小则给部门或单位带来损害,大则给国家带来巨额损失,甚至危及国家安全。因而使安全性问题更为突出。如何保证和加强数据库的安全性和机密性,已成为目前迫切需要解决的问题。数据库的安全性主要是指保护数据库以防止非法存取,保证数据库中数据的完整性、一致性以及数据库备份与恢复。数据库安全保密的目标是:非授权用户进不来,拿不走,看不懂。即攻击者很难进入数据库系统,即使进入系统也无法获取有用的信息,即使获取了信息,也无法辨识。

1 文件型数据库常用加密方式

所谓文件型数据库,顾名思义,是基于文件的(file-based)数据库,数据被按照一定格式储存在磁盘里,使用时由应用程序通过相应的驱动程序甚至直接对数据文件进行读取。这种数据库访问起来比较简单、便捷,只要了解其文件格式,任何程序都可以直接读取,这也决定了它的安全性能相对较差。但正因为对它的访问简单、便捷,在当今数据库技术不断革新的时代,文件型数据库仍然占有一席之地。根据文件型数据库的特点,文件型数据库的常用加密方式一般有两种:

1.1 库外加密

基于文件型数据库的特点,库外加密的方式主要是针对文件IO操作或操作系统而言的。因为数据库管理系统与操作系统的接口方式有三种:一是直接利用文件系统的功能;二是利用操作系统的I/O模块;三是直接调用存储管理。所以采用库外加密时,可以先在内存中使用DES、RSA等方法对数据进行加密,然后文件系统把每次加密后的内存数据写入到数据库文件中(注意这里是把整个数据库作为普通的文件看待,而不是按数据关系写入),读入时再逆方向进行解密。这种加密方法相对简单,只要妥善管理密钥就可以了。缺点是对数据库的读写比较麻烦,每次都要进行加解密的工作,对程序的编写和读写数据库的速度都会有影响。

1.2 库内加密

如果从关系型数据库的各个方面出发,很容易形成库内加密的思想。关系型数据库的关键术语有:表、字段、行和数据元素。基本上可以针对这几方面形成一种加密的方法。

(1) 以表为单位:

对于文件型数据库来说,一个文件只有一张表,因而对表的加密可以说是对文件的加密了。通过更改文件分配表(FAT)中的说明等手段可以实现对文件的简单加密,但这种加密方式涉及到文件系统底层,误操作容易造成FAT混乱,而且与文件系统格式有关,因而通常不宜采用。

(2) 以记录或字段(即二维表的行或列)为单位加密:

通常情况下,我们访问数据库时都是以二维表方式进行的,二维表的每一行就是数据库的一条记录,二维表的每一列就是数据库的一个字段。如果以记录为单位进行加密,那么每读写一条记录只需进行一次加解密的操作,对于不需要访问到的记录,完全不需要进行任何操作,所以使用起来效率会高一些。但是由于每一个记录都必须有一个密钥与之匹配,因此产生和管理记录密钥比较复杂。以字段为单位的加密分析与以记录为单位的加密情况相似。

(3) 以数据元素为单位加密:

由于数据元素是数据库库内加密的最小单位,因而这种加密方式是最彻底的但也是效率最低的。每个被加密的元素会有一个相应的密钥,所以密钥的产生和管理比记录加密方式还要复杂。

2 常用的加密算法

加密算法是数据加密的核心。一个好的加密算法产生的密文应该频率平衡,随机无重码,周期很长而又不可能产生重复现象。窃密者很难通过对密文频率或者重码等特征的分析获得成功。同时,算法必须适应数据库系统的特性,加/解密,尤其是解密响应迅速。常用的加密算法有DES 加密算法和RSA 加密算法两种。

2.1 DES 加密算法

DES算法是由美国IBM公司在1970年以后发展起来的,1977年l月15日被美国国家标准局颁布为数据加密标准(Data Encryption Standard)。

(1) 算法的数学描述

DES中,明文m是0和1组成的长度为64比特的符号串,密钥k也是64比特的0、1符号串。设

m = m lm 2… m 6 4

k= k 1k 2… k64

mi ,k i= 0 或 1 , i=1,2 ,…,64

则加密过程为:

DES ( m ) = IP -1_T16_T15_… _T2_T1_IP (m)

解密过程为:

DES- 1= IP_T1_T2_… _T15_T16_IP-1

其中,IP和IP-1是一对互逆的置换,T1, T2,…,T15, T16为16种不同的可逆变换[2]。

(2) DES加密过程

在DES的设计中,明文分块长度为64比特,密钥长度也为64比特,其中56比特用于加密过程,其余8比特用于奇偶校验位。确切地说,密钥分成8个8比特的字节,在每一个字节中的7比特用于加密算法,第8个比特用于奇偶校验。

在明文处理过程中,首先,64比特明文通过初始置换(IP) ,对各比特进行置换,生成置换后的输入。紧接着是由同一函数的16次迭代构成的阶段。最后一次(第16次)迭代的输出由64比特构成,它是输入明文和密钥的函数。输出的左右部分相互调换生成预输出。最后,预输出通过置换(IP-1)-对初始置换函数的逆转-生成64比特密文。

对于密钥的使用(用于加密的56比特),首先,密钥传递到置换函数。然后通过刚才描述的循环移位操作和置换操作的结合,在16次迭代中每一次迭代都生成子密钥(Ki)。每次迭代的置换函数是相同的,但子密钥不同,因为密钥进行了重复移位。

在变换过程中,输入的64比特的明文,在64比特的密钥控制下,通过初始换位,再经过16层加密变换,最后再通过逆初始变换得到64比特的密文。密文的每一比特都是由明文的每一比特和密钥的每一比特联合确定的[3]。

DES综合应用了置换、代替、代数等多种密码技术,是一种乘积密码。在算法结构上采用迭代结构,从而使结构紧凑,条理清楚,而且算法为对合运算,便于实现。因为算法中使用了16次迭代,从而使得即使是改变明文或者密钥中的1位,密文都会发生约32位的变化,大大提高了保密性。

2.2 RSA 加密算法

RSA是第一个既能用于数据加密也能用于数字签名的算法,易于理解和操作,比较流行。其安全性依赖于大数分解。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。两个大素数相乘在计算上是容易实现的,但将该乘积分解为两个大素数因子的计算量却相当巨大,大到甚至在计算机上也不可能实现。

RSA是一种分组加密方法,明文和密文都是0~n-1之间的整数。例如:对明文块M和密文块C,加密和解密的形式如下:

C= Me mod n

M= Cd mod n =(Me)d mod n =Med mod n